scons: Generate a single debug flag C++ file
authorCurtis Dunham <Curtis.Dunham@arm.com>
Tue, 12 Aug 2014 22:35:28 +0000 (17:35 -0500)
committerCurtis Dunham <Curtis.Dunham@arm.com>
Tue, 12 Aug 2014 22:35:28 +0000 (17:35 -0500)
Reduces target count/compiler invocations by ~180.

src/SConscript

index 5bd1fc811f9eb62f9ab81a7d26e59e77d6750bee..3737ef51bf699bf432cdd7cb6c54435824e6493d 100755 (executable)
@@ -743,40 +743,42 @@ elif ProtoBuf.all:
 def makeDebugFlagCC(target, source, env):
     assert(len(target) == 1 and len(source) == 1)
 
-    val = eval(source[0].get_contents())
-    name, compound, desc = val
-    compound = list(sorted(compound))
-
     code = code_formatter()
 
+    # delay definition of CompoundFlags until after all the definition
+    # of all constituent SimpleFlags
+    comp_code = code_formatter()
+
     # file header
     code('''
 /*
- * DO NOT EDIT THIS FILE! Automatically generated
+ * DO NOT EDIT THIS FILE! Automatically generated by SCons.
  */
 
 #include "base/debug.hh"
-''')
 
-    for flag in compound:
-        code('#include "debug/$flag.hh"')
-    code()
-    code('namespace Debug {')
-    code()
+namespace Debug {
 
-    if not compound:
-        code('SimpleFlag $name("$name", "$desc");')
-    else:
-        code('CompoundFlag $name("$name", "$desc",')
-        code.indent()
-        last = len(compound) - 1
-        for i,flag in enumerate(compound):
-            if i != last:
-                code('$flag,')
-            else:
-                code('$flag);')
-        code.dedent()
+''')
+
+    for name, flag in sorted(source[0].read().iteritems()):
+        n, compound, desc = flag
+        assert n == name
 
+        if not compound:
+            code('SimpleFlag $name("$name", "$desc");')
+        else:
+            comp_code('CompoundFlag $name("$name", "$desc",')
+            comp_code.indent()
+            last = len(compound) - 1
+            for i,flag in enumerate(compound):
+                if i != last:
+                    comp_code('$flag,')
+                else:
+                    comp_code('$flag);')
+            comp_code.dedent()
+
+    code.append(comp_code)
     code()
     code('} // namespace Debug')
 
@@ -793,9 +795,7 @@ def makeDebugFlagHH(target, source, env):
     # file header boilerplate
     code('''\
 /*
- * DO NOT EDIT THIS FILE!
- *
- * Automatically generated by SCons
+ * DO NOT EDIT THIS FILE! Automatically generated by SCons.
  */
 
 #ifndef __DEBUG_${name}_HH__
@@ -828,13 +828,14 @@ for name,flag in sorted(debug_flags.iteritems()):
     assert n == name
 
     hh_file = 'debug/%s.hh' % name
-    cc_file = 'debug/%s.cc' % name
     env.Command(hh_file, Value(flag),
                 MakeAction(makeDebugFlagHH, Transform("TRACING", 0)))
-    env.Command(cc_file, Value(flag),
-                MakeAction(makeDebugFlagCC, Transform("TRACING", 0)))
-    env.Depends(SWIG, [hh_file, cc_file])
-    Source('debug/%s.cc' % name)
+    env.Depends(SWIG, hh_file)
+
+env.Command('debug/flags.cc', Value(debug_flags),
+            MakeAction(makeDebugFlagCC, Transform("TRACING", 0)))
+env.Depends(SWIG, 'debug/flags.cc')
+Source('debug/flags.cc')
 
 # Embed python files.  All .py files that have been indicated by a
 # PySource() call in a SConscript need to be embedded into the M5