HG: Add compiled hg revision and date to the standard M5 output.
authorAli Saidi <saidi@eecs.umich.edu>
Fri, 13 Jun 2008 05:09:04 +0000 (01:09 -0400)
committerAli Saidi <saidi@eecs.umich.edu>
Fri, 13 Jun 2008 05:09:04 +0000 (01:09 -0400)
src/SConscript
src/python/generate.py
src/python/m5/main.py
src/python/swig/core.i

index 69c5b946dbaaa081f1b9d9bfeec773a4062abcd6..e360611a07a329ea15b67311839a5b6e299f91be 100644 (file)
@@ -332,6 +332,10 @@ env.Command('base/traceflags.hh', flags, generate.traceFlagsHH)
 env.Command('base/traceflags.cc', flags, generate.traceFlagsCC)
 Source('base/traceflags.cc')
 
+# Generate program_info.cc
+env.Command('base/program_info.cc',
+            Value(str(SCons.Node.FS.default_fs.SConstruct_dir)), generate.programInfo)
+
 # Build the zip file
 py_compiled = []
 py_zip_depends = []
@@ -364,11 +368,19 @@ envList = []
 # date.cc.
 def make_objs(sources, env):
     objs = [env.Object(s) for s in sources]
+  
     # make date.cc depend on all other objects so it always gets
     # recompiled whenever anything else does
     date_obj = env.Object('base/date.cc')
+
+    # Make the generation of program_info.cc dependend on all 
+    # the other cc files and the compiling of program_info.cc 
+    # dependent on all the objects but program_info.o 
+    pinfo_obj = env.Object('base/program_info.cc')
+    env.Depends('base/program_info.cc', sources)
     env.Depends(date_obj, objs)
-    objs.append(date_obj)
+    env.Depends(pinfo_obj, objs)
+    objs.extend([date_obj,pinfo_obj])
     return objs
 
 # Function to create a new build environment as clone of current
index eead6ff5d53c9ece8a092ece5e4fbcc9ff9fa2d9..f4d923870ed12d06db08f71b202efd6f659c776e 100644 (file)
@@ -31,8 +31,7 @@ import py_compile
 import sys
 import zipfile
 
-from os.path import basename
-from os.path import exists
+from os.path import basename, exists, isdir, join
 
 class DictImporter(object):
     '''This importer takes a dictionary of arbitrary module names that
@@ -527,3 +526,35 @@ extern const Flags *compoundFlags[];
 '''
 
         f.close()
+
+    def programInfo(self, target, source, env):
+        def gen_file(target, rev, node, date):
+            pi_stats = file(target, 'w')
+            print >>pi_stats, 'const char *hgRev = "%s:%s";' %  (rev, node)
+            print >>pi_stats, 'const char *hgDate = "%s";' % date
+            pi_stats.close()
+
+        target = str(target[0])
+        scons_dir = eval(str(source[0]))
+        try:
+            import mercurial.demandimport, mercurial.hg, mercurial.ui
+            import mercurial.util, mercurial.node
+            if not exists(scons_dir) or not isdir(scons_dir) or \
+                   not exists(join(scons_dir, ".hg")):
+                raise ValueError
+            repo = mercurial.hg.repository(mercurial.ui.ui(), scons_dir)
+            rev = mercurial.node.nullrev + repo.changelog.count()
+            changenode = repo.changelog.node(rev)
+            changes = repo.changelog.read(changenode)
+            date = mercurial.util.datestr(changes[2])
+
+            gen_file(target, rev, mercurial.node.hex(changenode), date)
+
+            mercurial.demandimport.disable()
+        except ImportError:
+            gen_file(target, "Unknown", "Unknown", "Unknown")
+
+        except:
+            print "in except"
+            gen_file(target, "Unknown", "Unknown", "Unknown")
+            mercurial.demandimport.disable()
index 4bcca46d2819e5a38f88e5bdf20360f2d039a32b..cbdd65492c65d1f48c616daa4c125eadf9acce36 100644 (file)
@@ -268,6 +268,10 @@ def main():
         print "M5 compiled %s" % internal.core.cvar.compileDate;
         print "M5 started %s" % datetime.datetime.now().ctime()
         print "M5 executing on %s" % socket.gethostname()
+
+        print "M5 revision %s" % internal.core.cvar.hgRev
+        print "M5 commit date %s" % internal.core.cvar.hgDate
+
         print "command line:",
         for argv in sys.argv:
             print argv,
index 770765ca4391825c1a4fcd6ae916327593038927..567eff591862e2b15cc359295a7bd9710933eaa2 100644 (file)
@@ -39,6 +39,8 @@
 #include "sim/startup.hh"
 
 extern const char *compileDate;
+extern const char *hgRev;
+extern const char *hgDate;
 %}
 
 %include "stdint.i"
@@ -51,6 +53,8 @@ void SimStartup();
 void doExitCleanup();
 
 char *compileDate;
+char *hgRev;
+char *hgDate;
 
 void setClockFrequency(Tick ticksPerSecond);