diff --git a/SConstruct b/SConstruct index f5a46286c..19bc6e41b 100755 --- a/SConstruct +++ b/SConstruct @@ -192,6 +192,8 @@ for key,val in os.environ.iteritems(): use_env[key] = val main = Environment(ENV=use_env) +main.Decider('MD5-timestamp') +main.SetOption('implicit_cache', 1) main.root = Dir(".") # The current directory (where this file lives). main.srcdir = Dir("src") # The source directory diff --git a/src/SConscript b/src/SConscript index 679403020..c017b601b 100755 --- a/src/SConscript +++ b/src/SConscript @@ -953,24 +953,52 @@ else: print 'Unknown compiler, please fix compiler options' Exit(1) -makeEnv('debug', '.do', - CCFLAGS = Split(ccflags['debug']), - CPPDEFINES = ['DEBUG', 'TRACING_ON=1']) + +# To speed things up, we only instantiate the build environments we +# need. We try to identify the needed environment for each target; if +# we can't, we fall back on instantiating all the environments just to +# be safe. +target_types = ['debug', 'opt', 'fast', 'prof'] +obj2target = {'do': 'debug', 'o': 'opt', 'fo': 'fast', 'po': 'prof'} + +def identifyTarget(t): + ext = t.split('.')[-1] + if ext in target_types: + return ext + if obj2target.has_key(ext): + return obj2target[ext] + match = re.search(r'/tests/([^/]+)/', t) + if match and match.group(1) in target_types: + return match.group(1) + return 'all' + +needed_envs = [identifyTarget(target) for target in BUILD_TARGETS] +if 'all' in needed_envs: + needed_envs += target_types + +# Debug binary +if 'debug' in needed_envs: + makeEnv('debug', '.do', + CCFLAGS = Split(ccflags['debug']), + CPPDEFINES = ['DEBUG', 'TRACING_ON=1']) # Optimized binary -makeEnv('opt', '.o', - CCFLAGS = Split(ccflags['opt']), - CPPDEFINES = ['TRACING_ON=1']) +if 'opt' in needed_envs: + makeEnv('opt', '.o', + CCFLAGS = Split(ccflags['opt']), + CPPDEFINES = ['TRACING_ON=1']) # "Fast" binary -makeEnv('fast', '.fo', strip = True, - CCFLAGS = Split(ccflags['fast']), - CPPDEFINES = ['NDEBUG', 'TRACING_ON=0']) +if 'fast' in needed_envs: + makeEnv('fast', '.fo', strip = True, + CCFLAGS = Split(ccflags['fast']), + CPPDEFINES = ['NDEBUG', 'TRACING_ON=0']) # Profiled binary -makeEnv('prof', '.po', - CCFLAGS = Split(ccflags['prof']), - CPPDEFINES = ['NDEBUG', 'TRACING_ON=0'], - LINKFLAGS = '-pg') +if 'prof' in needed_envs: + makeEnv('prof', '.po', + CCFLAGS = Split(ccflags['prof']), + CPPDEFINES = ['NDEBUG', 'TRACING_ON=0'], + LINKFLAGS = '-pg') Return('envList') diff --git a/src/mem/protocol/SConscript b/src/mem/protocol/SConscript index e7efe8b1c..9ef38d289 100644 --- a/src/mem/protocol/SConscript +++ b/src/mem/protocol/SConscript @@ -69,7 +69,7 @@ def slicc_emitter(target, source, env): slicc = SLICC(filepath, verbose=False) slicc.process() slicc.writeCodeFiles(protocol_dir.abspath) - if not env['NO_HTML']: + if env['SLICC_HTML']: slicc.writeHTMLFiles(html_dir.abspath) target.extend([protocol_dir.File(f) for f in sorted(slicc.files())]) @@ -82,7 +82,7 @@ def slicc_action(target, source, env): slicc = SLICC(filepath, verbose=True) slicc.process() slicc.writeCodeFiles(protocol_dir.abspath) - if not env['NO_HTML']: + if env['SLICC_HTML']: slicc.writeHTMLFiles(html_dir.abspath) slicc_builder = Builder(action=MakeAction(slicc_action, Transform("SLICC")), diff --git a/src/mem/protocol/SConsopts b/src/mem/protocol/SConsopts index 6a6bd798e..78b93c40e 100644 --- a/src/mem/protocol/SConsopts +++ b/src/mem/protocol/SConsopts @@ -48,5 +48,5 @@ opt = EnumVariable('PROTOCOL', 'Coherence protocol for Ruby', 'None', sticky_vars.AddVariables(opt) export_vars += ['PROTOCOL'] -opt = BoolVariable('NO_HTML', 'Do not create HTML files', False) +opt = BoolVariable('SLICC_HTML', 'Create HTML files', False) sticky_vars.AddVariables(opt)