SConscript revision 4773:6103346eeb28
1955SN/A# -*- mode:python -*- 2955SN/A 31762SN/A# Copyright (c) 2004-2005 The Regents of The University of Michigan 4955SN/A# All rights reserved. 5955SN/A# 6955SN/A# Redistribution and use in source and binary forms, with or without 7955SN/A# modification, are permitted provided that the following conditions are 8955SN/A# met: redistributions of source code must retain the above copyright 9955SN/A# notice, this list of conditions and the following disclaimer; 10955SN/A# redistributions in binary form must reproduce the above copyright 11955SN/A# notice, this list of conditions and the following disclaimer in the 12955SN/A# documentation and/or other materials provided with the distribution; 13955SN/A# neither the name of the copyright holders nor the names of its 14955SN/A# contributors may be used to endorse or promote products derived from 15955SN/A# this software without specific prior written permission. 16955SN/A# 17955SN/A# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18955SN/A# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19955SN/A# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20955SN/A# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21955SN/A# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22955SN/A# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23955SN/A# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24955SN/A# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25955SN/A# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26955SN/A# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27955SN/A# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 282665Ssaidi@eecs.umich.edu# 292665Ssaidi@eecs.umich.edu# Authors: Nathan Binkert 30955SN/A 31955SN/Aimport imp 32955SN/Aimport os 33955SN/Aimport sys 34955SN/A 352632Sstever@eecs.umich.edufrom os.path import basename 362632Sstever@eecs.umich.edufrom os.path import join as joinpath 372632Sstever@eecs.umich.edufrom os.path import exists 382632Sstever@eecs.umich.edufrom os.path import isdir 39955SN/Afrom os.path import isfile 402632Sstever@eecs.umich.edu 412632Sstever@eecs.umich.eduimport SCons 422761Sstever@eecs.umich.edu 432632Sstever@eecs.umich.edu# This file defines how to build a particular configuration of M5 442632Sstever@eecs.umich.edu# based on variable settings in the 'env' build environment. 452632Sstever@eecs.umich.edu 462761Sstever@eecs.umich.eduImport('*') 472761Sstever@eecs.umich.edu 482761Sstever@eecs.umich.edu# Children need to see the environment 492632Sstever@eecs.umich.eduExport('env') 502632Sstever@eecs.umich.edu 512761Sstever@eecs.umich.edudef sort_list(_list): 522761Sstever@eecs.umich.edu """return a sorted copy of '_list'""" 532761Sstever@eecs.umich.edu if isinstance(_list, list): 542761Sstever@eecs.umich.edu _list = _list[:] 552761Sstever@eecs.umich.edu else: 562632Sstever@eecs.umich.edu _list = list(_list) 572632Sstever@eecs.umich.edu _list.sort() 582632Sstever@eecs.umich.edu return _list 592632Sstever@eecs.umich.edu 602632Sstever@eecs.umich.educlass PySourceFile(object): 612632Sstever@eecs.umich.edu def __init__(self, package, source): 622632Sstever@eecs.umich.edu filename = str(source) 63955SN/A pyname = basename(filename) 64955SN/A assert pyname.endswith('.py') 65955SN/A name = pyname[:-3] 66955SN/A path = package.split('.') 67955SN/A modpath = path 68955SN/A if name != '__init__': 69955SN/A modpath += [name] 702656Sstever@eecs.umich.edu modpath = '.'.join(modpath) 712656Sstever@eecs.umich.edu 722656Sstever@eecs.umich.edu arcpath = package.split('.') + [ pyname + 'c' ] 732656Sstever@eecs.umich.edu arcname = joinpath(*arcpath) 742656Sstever@eecs.umich.edu 752656Sstever@eecs.umich.edu self.source = source 762656Sstever@eecs.umich.edu self.pyname = pyname 772653Sstever@eecs.umich.edu self.srcpath = source.srcnode().abspath 782653Sstever@eecs.umich.edu self.package = package 792653Sstever@eecs.umich.edu self.modpath = modpath 802653Sstever@eecs.umich.edu self.arcname = arcname 812653Sstever@eecs.umich.edu self.filename = filename 822653Sstever@eecs.umich.edu self.compiled = File(filename + 'c') 832653Sstever@eecs.umich.edu 842653Sstever@eecs.umich.edu######################################################################## 852653Sstever@eecs.umich.edu# Code for adding source files of various types 862653Sstever@eecs.umich.edu# 872653Sstever@eecs.umich.educc_sources = [] 881852SN/Adef Source(source): 89955SN/A '''Add a C/C++ source file to the build''' 90955SN/A if not isinstance(source, SCons.Node.FS.File): 91955SN/A source = File(source) 922632Sstever@eecs.umich.edu 932632Sstever@eecs.umich.edu cc_sources.append(source) 94955SN/A 951533SN/Apy_sources = [] 962632Sstever@eecs.umich.edudef PySource(package, source): 971533SN/A '''Add a python source file to the named package''' 98955SN/A if not isinstance(source, SCons.Node.FS.File): 99955SN/A source = File(source) 1002632Sstever@eecs.umich.edu 1012632Sstever@eecs.umich.edu source = PySourceFile(package, source) 102955SN/A py_sources.append(source) 103955SN/A 104955SN/Asim_objects_fixed = False 105955SN/Asim_object_modfiles = set() 1062632Sstever@eecs.umich.edudef SimObject(source): 107955SN/A '''Add a SimObject python file as a python source object and add 1082632Sstever@eecs.umich.edu it to a list of sim object modules''' 109955SN/A 110955SN/A if sim_objects_fixed: 1112632Sstever@eecs.umich.edu raise AttributeError, "Too late to call SimObject now." 1122632Sstever@eecs.umich.edu 1132632Sstever@eecs.umich.edu if not isinstance(source, SCons.Node.FS.File): 1142632Sstever@eecs.umich.edu source = File(source) 1152632Sstever@eecs.umich.edu 1162632Sstever@eecs.umich.edu PySource('m5.objects', source) 1172632Sstever@eecs.umich.edu modfile = basename(str(source)) 1182632Sstever@eecs.umich.edu assert modfile.endswith('.py') 1192632Sstever@eecs.umich.edu modname = modfile[:-3] 1202632Sstever@eecs.umich.edu sim_object_modfiles.add(modname) 1212632Sstever@eecs.umich.edu 1223053Sstever@eecs.umich.eduswig_sources = [] 1233053Sstever@eecs.umich.edudef SwigSource(package, source): 1243053Sstever@eecs.umich.edu '''Add a swig file to build''' 1253053Sstever@eecs.umich.edu if not isinstance(source, SCons.Node.FS.File): 1263053Sstever@eecs.umich.edu source = File(source) 1273053Sstever@eecs.umich.edu val = source,package 1283053Sstever@eecs.umich.edu swig_sources.append(val) 1293053Sstever@eecs.umich.edu 1303053Sstever@eecs.umich.edu# Children should have access 1313053Sstever@eecs.umich.eduExport('Source') 1323053Sstever@eecs.umich.eduExport('PySource') 1333053Sstever@eecs.umich.eduExport('SimObject') 1343053Sstever@eecs.umich.eduExport('SwigSource') 1353053Sstever@eecs.umich.edu 1363053Sstever@eecs.umich.edu######################################################################## 1373053Sstever@eecs.umich.edu# 1382632Sstever@eecs.umich.edu# Set some compiler variables 1392632Sstever@eecs.umich.edu# 1402632Sstever@eecs.umich.edu 1412632Sstever@eecs.umich.edu# Include file paths are rooted in this directory. SCons will 1422632Sstever@eecs.umich.edu# automatically expand '.' to refer to both the source directory and 1432632Sstever@eecs.umich.edu# the corresponding build directory to pick up generated include 1442634Sstever@eecs.umich.edu# files. 1452634Sstever@eecs.umich.eduenv.Append(CPPPATH=Dir('.')) 1462632Sstever@eecs.umich.edu 1472638Sstever@eecs.umich.edu# Add a flag defining what THE_ISA should be for all compilation 1482632Sstever@eecs.umich.eduenv.Append(CPPDEFINES=[('THE_ISA','%s_ISA' % env['TARGET_ISA'].upper())]) 1492632Sstever@eecs.umich.edu 1502632Sstever@eecs.umich.edu######################################################################## 1512632Sstever@eecs.umich.edu# 1522632Sstever@eecs.umich.edu# Walk the tree and execute all SConscripts 1532632Sstever@eecs.umich.edu# 1541858SN/Asrcdir = env['SRCDIR'] 1552638Sstever@eecs.umich.edufor root, dirs, files in os.walk(srcdir, topdown=True): 1562638Sstever@eecs.umich.edu if root == srcdir: 1572638Sstever@eecs.umich.edu # we don't want to recurse back into this SConscript 1582638Sstever@eecs.umich.edu continue 1592638Sstever@eecs.umich.edu 1602638Sstever@eecs.umich.edu if 'SConscript' in files: 1612638Sstever@eecs.umich.edu # strip off the srcdir part since scons will try to find the 1622638Sstever@eecs.umich.edu # script in the build directory 1632634Sstever@eecs.umich.edu base = root[len(srcdir) + 1:] 1642634Sstever@eecs.umich.edu SConscript(joinpath(base, 'SConscript')) 1652634Sstever@eecs.umich.edu 166955SN/Afor extra in env['EXTRAS'].split(':'): 167955SN/A extra = os.path.expanduser(extra) 168955SN/A env.Append(CPPPATH=[Dir(extra)]) 169955SN/A for root, dirs, files in os.walk(extra, topdown=True): 170955SN/A if 'SConscript' in files: 171955SN/A subdir = root[len(os.path.dirname(extra))+1:] 172955SN/A build_dir = joinpath(env['BUILDDIR'], subdir) 173955SN/A SConscript(joinpath(root, 'SConscript'), build_dir=build_dir) 1741858SN/A 1751858SN/Afor opt in env.ExportOptions: 1762632Sstever@eecs.umich.edu env.ConfigFile(opt) 177955SN/A 1783643Ssaidi@eecs.umich.edu######################################################################## 1793643Ssaidi@eecs.umich.edu# 1803643Ssaidi@eecs.umich.edu# Prevent any SimObjects from being added after this point, they 1813643Ssaidi@eecs.umich.edu# should all have been added in the SConscripts above 1823643Ssaidi@eecs.umich.edu# 1833643Ssaidi@eecs.umich.edusim_objects_fixed = True 1843643Ssaidi@eecs.umich.edu 1853643Ssaidi@eecs.umich.edu######################################################################## 1862776Sstever@eecs.umich.edu# 1871105SN/A# Manually turn python/generate.py into a python module and import it 1882667Sstever@eecs.umich.edu# 1892667Sstever@eecs.umich.edugenerate_file = File('python/generate.py') 1902667Sstever@eecs.umich.edugenerate_module = imp.new_module('generate') 1912667Sstever@eecs.umich.edusys.modules['generate'] = generate_module 1922667Sstever@eecs.umich.eduexec file(generate_file.srcnode().abspath, 'r') in generate_module.__dict__ 1932667Sstever@eecs.umich.edu 1941869SN/A######################################################################## 1951869SN/A# 1961869SN/A# build a generate 1971869SN/A# 1981869SN/Afrom generate import Generate 1991065SN/AoptionDict = dict([(opt, env[opt]) for opt in env.ExportOptions]) 2002632Sstever@eecs.umich.edugenerate = Generate(py_sources, sim_object_modfiles, optionDict) 2012632Sstever@eecs.umich.edum5 = generate.m5 202955SN/A 2031858SN/A######################################################################## 2041858SN/A# 2051858SN/A# calculate extra dependencies 2061858SN/A# 2071851SN/Amodule_depends = ["m5", "m5.SimObject", "m5.params"] 2081851SN/Amodule_depends = [ File(generate.py_modules[dep]) for dep in module_depends ] 2091858SN/Afile_depends = [ generate_file ] 2102632Sstever@eecs.umich.edudepends = module_depends + file_depends 211955SN/A 2123053Sstever@eecs.umich.edu######################################################################## 2133053Sstever@eecs.umich.edu# 2143053Sstever@eecs.umich.edu# Commands for the basic automatically generated python files 2153053Sstever@eecs.umich.edu# 2163053Sstever@eecs.umich.edu 2173053Sstever@eecs.umich.edu# Generate a file with all of the compile options in it 2183053Sstever@eecs.umich.eduenv.Command('python/m5/defines.py', Value(optionDict), 2193053Sstever@eecs.umich.edu generate.makeDefinesPyFile) 2203053Sstever@eecs.umich.eduPySource('m5', 'python/m5/defines.py') 2213053Sstever@eecs.umich.edu 2223053Sstever@eecs.umich.edu# Generate a file that wraps the basic top level files 2233053Sstever@eecs.umich.eduenv.Command('python/m5/info.py', 2243053Sstever@eecs.umich.edu [ '#/AUTHORS', '#/LICENSE', '#/README', '#/RELEASE_NOTES' ], 2253053Sstever@eecs.umich.edu generate.makeInfoPyFile) 2263053Sstever@eecs.umich.eduPySource('m5', 'python/m5/info.py') 2273053Sstever@eecs.umich.edu 2283053Sstever@eecs.umich.edu# Generate an __init__.py file for the objects package 2293053Sstever@eecs.umich.eduenv.Command('python/m5/objects/__init__.py', 2303053Sstever@eecs.umich.edu [ Value(o) for o in sort_list(sim_object_modfiles) ], 2312667Sstever@eecs.umich.edu generate.makeObjectsInitFile) 2322667Sstever@eecs.umich.eduPySource('m5.objects', 'python/m5/objects/__init__.py') 2332667Sstever@eecs.umich.edu 2342667Sstever@eecs.umich.edu######################################################################## 2352667Sstever@eecs.umich.edu# 2362667Sstever@eecs.umich.edu# Create all of the SimObject param headers and enum headers 2372667Sstever@eecs.umich.edu# 2382667Sstever@eecs.umich.edu 2392667Sstever@eecs.umich.edu# Generate all of the SimObject param struct header files 2402667Sstever@eecs.umich.eduparams_hh_files = [] 2412667Sstever@eecs.umich.edufor name,simobj in generate.sim_objects.iteritems(): 2422667Sstever@eecs.umich.edu extra_deps = [ File(generate.py_modules[simobj.__module__]) ] 2432638Sstever@eecs.umich.edu 2442638Sstever@eecs.umich.edu hh_file = File('params/%s.hh' % name) 2452638Sstever@eecs.umich.edu params_hh_files.append(hh_file) 2462638Sstever@eecs.umich.edu env.Command(hh_file, Value(name), generate.createSimObjectParam) 2472638Sstever@eecs.umich.edu env.Depends(hh_file, depends + extra_deps) 2481858SN/A 2493118Sstever@eecs.umich.edu# Generate any parameter header files needed 2503118Sstever@eecs.umich.edufor name,param in generate.params.iteritems(): 2513118Sstever@eecs.umich.edu if isinstance(param, m5.params.VectorParamDesc): 2523118Sstever@eecs.umich.edu ext = 'vptype' 2533118Sstever@eecs.umich.edu else: 2543118Sstever@eecs.umich.edu ext = 'ptype' 2553118Sstever@eecs.umich.edu 2563118Sstever@eecs.umich.edu i_file = File('params/%s_%s.i' % (name, ext)) 2573118Sstever@eecs.umich.edu env.Command(i_file, Value(name), generate.createSwigParam) 2583118Sstever@eecs.umich.edu env.Depends(i_file, depends) 2593118Sstever@eecs.umich.edu 2603118Sstever@eecs.umich.edu# Generate all enum header files 2613118Sstever@eecs.umich.edufor name,enum in generate.enums.iteritems(): 2623118Sstever@eecs.umich.edu extra_deps = [ File(generate.py_modules[enum.__module__]) ] 2633118Sstever@eecs.umich.edu 2643118Sstever@eecs.umich.edu cc_file = File('enums/%s.cc' % name) 2653118Sstever@eecs.umich.edu env.Command(cc_file, Value(name), generate.createEnumStrings) 2663118Sstever@eecs.umich.edu env.Depends(cc_file, depends + extra_deps) 2673118Sstever@eecs.umich.edu Source(cc_file) 2683118Sstever@eecs.umich.edu 2693118Sstever@eecs.umich.edu hh_file = File('enums/%s.hh' % name) 2703118Sstever@eecs.umich.edu env.Command(hh_file, Value(name), generate.createEnumParam) 2713118Sstever@eecs.umich.edu env.Depends(hh_file, depends + extra_deps) 2723118Sstever@eecs.umich.edu 2733118Sstever@eecs.umich.edu# Build the big monolithic swigged params module (wraps all SimObject 2743118Sstever@eecs.umich.edu# param structs and enum structs) 2753118Sstever@eecs.umich.eduparams_file = File('params/params.i') 2763118Sstever@eecs.umich.edunames = sort_list(generate.sim_objects.keys()) 2773118Sstever@eecs.umich.eduenv.Command(params_file, [ Value(v) for v in names ], 2783118Sstever@eecs.umich.edu generate.buildParams) 2793118Sstever@eecs.umich.eduenv.Depends(params_file, params_hh_files + depends) 2803118Sstever@eecs.umich.eduSwigSource('m5.objects', params_file) 2813483Ssaidi@eecs.umich.edu 2823494Ssaidi@eecs.umich.edu# Build all swig modules 2833494Ssaidi@eecs.umich.eduswig_modules = [] 2843483Ssaidi@eecs.umich.edufor source,package in swig_sources: 2853483Ssaidi@eecs.umich.edu filename = str(source) 2863483Ssaidi@eecs.umich.edu assert filename.endswith('.i') 2873053Sstever@eecs.umich.edu 2883053Sstever@eecs.umich.edu base = '.'.join(filename.split('.')[:-1]) 2893053Sstever@eecs.umich.edu module = basename(base) 2903053Sstever@eecs.umich.edu cc_file = base + '_wrap.cc' 2913053Sstever@eecs.umich.edu py_file = base + '.py' 2923053Sstever@eecs.umich.edu 2933053Sstever@eecs.umich.edu env.Command([cc_file, py_file], source, 2943053Sstever@eecs.umich.edu '$SWIG $SWIGFLAGS -outdir ${TARGETS[1].dir} ' 2951858SN/A '-o ${TARGETS[0]} $SOURCES') 2961858SN/A env.Depends(py_file, source) 2971858SN/A env.Depends(cc_file, source) 2981858SN/A 2991858SN/A swig_modules.append(Value(module)) 3001858SN/A Source(cc_file) 3011859SN/A PySource(package, py_file) 3021858SN/A 3031858SN/A# Generate the main swig init file 3041858SN/Aenv.Command('swig/init.cc', swig_modules, generate.makeSwigInit) 3051859SN/ASource('swig/init.cc') 3061859SN/A 3071862SN/A# Build the zip file 3083053Sstever@eecs.umich.edupy_compiled = [] 3093053Sstever@eecs.umich.edupy_zip_depends = [] 3103053Sstever@eecs.umich.edufor source in py_sources: 3113053Sstever@eecs.umich.edu env.Command(source.compiled, source.source, generate.compilePyFile) 3121859SN/A py_compiled.append(source.compiled) 3131859SN/A 3141859SN/A # make the zipfile depend on the archive name so that the archive 3151859SN/A # is rebuilt if the name changes 3161859SN/A py_zip_depends.append(Value(source.arcname)) 3171859SN/A 3181859SN/A# Add the zip file target to the environment. 3191859SN/Am5zip = File('m5py.zip') 3201862SN/Aenv.Command(m5zip, py_compiled, generate.buildPyZip) 3211859SN/Aenv.Depends(m5zip, py_zip_depends) 3221859SN/A 3231859SN/A######################################################################## 3241858SN/A# 3251858SN/A# Define binaries. Each different build type (debug, opt, etc.) gets 3262139SN/A# a slightly different build environment. 3272139SN/A# 3282139SN/A 3292155SN/A# List of constructed environments to pass back to SConstruct 3302623SN/AenvList = [] 3313583Sbinkertn@umich.edu 3323583Sbinkertn@umich.edu# This function adds the specified sources to the given build 3333583Sbinkertn@umich.edu# environment, and returns a list of all the corresponding SCons 3343583Sbinkertn@umich.edu# Object nodes (including an extra one for date.cc). We explicitly 3352155SN/A# add the Object nodes so we can set up special dependencies for 3361869SN/A# date.cc. 3371869SN/Adef make_objs(sources, env): 3381869SN/A objs = [env.Object(s) for s in sources] 3391869SN/A # make date.cc depend on all other objects so it always gets 3401869SN/A # recompiled whenever anything else does 3412139SN/A date_obj = env.Object('base/date.cc') 3421869SN/A env.Depends(date_obj, objs) 3432508SN/A objs.append(date_obj) 3442508SN/A return objs 3452508SN/A 3462508SN/A# Function to create a new build environment as clone of current 3473685Sktlim@umich.edu# environment 'env' with modified object suffix and optional stripped 3482635Sstever@eecs.umich.edu# binary. Additional keyword arguments are appended to corresponding 3491869SN/A# build environment vars. 3501869SN/Adef makeEnv(label, objsfx, strip = False, **kwargs): 3511869SN/A newEnv = env.Copy(OBJSUFFIX=objsfx) 3521869SN/A newEnv.Label = label 3531869SN/A newEnv.Append(**kwargs) 3541869SN/A exe = 'm5.' + label # final executable 3551869SN/A bin = exe + '.bin' # executable w/o appended Python zip archive 3561869SN/A newEnv.Program(bin, make_objs(cc_sources, newEnv)) 3571965SN/A if strip: 3581965SN/A stripped_bin = bin + '.stripped' 3591965SN/A if sys.platform == 'sunos5': 3601869SN/A cmd = 'cp $SOURCE $TARGET; strip $TARGET' 3611869SN/A else: 3622733Sktlim@umich.edu cmd = 'strip $SOURCE -o $TARGET' 3631869SN/A newEnv.Command(stripped_bin, bin, cmd) 3641884SN/A bin = stripped_bin 3651884SN/A targets = newEnv.Concat(exe, [bin, 'm5py.zip']) 3663356Sbinkertn@umich.edu newEnv.M5Binary = targets[0] 3673356Sbinkertn@umich.edu envList.append(newEnv) 3683356Sbinkertn@umich.edu 3693356Sbinkertn@umich.edu# Debug binary 3701869SN/Accflags = {} 3711858SN/Aif env['GCC']: 3721869SN/A if sys.platform == 'sunos5': 3731869SN/A ccflags['debug'] = '-gstabs+' 3741869SN/A else: 3751869SN/A ccflags['debug'] = '-ggdb3' 3761869SN/A ccflags['opt'] = '-g -O3' 3771858SN/A ccflags['fast'] = '-O3' 3782761Sstever@eecs.umich.edu ccflags['prof'] = '-O3 -g -pg' 3791869SN/Aelif env['SUNCC']: 3802733Sktlim@umich.edu ccflags['debug'] = '-g0' 3813584Ssaidi@eecs.umich.edu ccflags['opt'] = '-g -O' 3821869SN/A ccflags['fast'] = '-fast' 3831869SN/A ccflags['prof'] = '-fast -g -pg' 3841869SN/Aelif env['ICC']: 3851869SN/A ccflags['debug'] = '-g -O0' 3861869SN/A ccflags['opt'] = '-g -O' 3871869SN/A ccflags['fast'] = '-fast' 3881858SN/A ccflags['prof'] = '-fast -g -pg' 389955SN/Aelse: 390955SN/A print 'Unknown compiler, please fix compiler options' 3911869SN/A Exit(1) 3921869SN/A 3931869SN/AmakeEnv('debug', '.do', 3941869SN/A CCFLAGS = Split(ccflags['debug']), 3951869SN/A CPPDEFINES = ['DEBUG', 'TRACING_ON=1']) 3961869SN/A 3971869SN/A# Optimized binary 3981869SN/AmakeEnv('opt', '.o', 3991869SN/A CCFLAGS = Split(ccflags['opt']), 4001869SN/A CPPDEFINES = ['TRACING_ON=1']) 4011869SN/A 4021869SN/A# "Fast" binary 4031869SN/AmakeEnv('fast', '.fo', strip = True, 4041869SN/A CCFLAGS = Split(ccflags['fast']), 4051869SN/A CPPDEFINES = ['NDEBUG', 'TRACING_ON=0']) 4061869SN/A 4071869SN/A# Profiled binary 4081869SN/AmakeEnv('prof', '.po', 4091869SN/A CCFLAGS = Split(ccflags['prof']), 4101869SN/A CPPDEFINES = ['NDEBUG', 'TRACING_ON=0'], 4111869SN/A LINKFLAGS = '-pg') 4121869SN/A 4131869SN/AReturn('envList') 4141869SN/A