SConscript revision 4007:8c3bfad8bb92
112391Sjason@lowepower.com# -*- mode:python -*-
212391Sjason@lowepower.com
312391Sjason@lowepower.com# Copyright (c) 2004-2005 The Regents of The University of Michigan
412391Sjason@lowepower.com# All rights reserved.
512391Sjason@lowepower.com#
612391Sjason@lowepower.com# Redistribution and use in source and binary forms, with or without
712391Sjason@lowepower.com# modification, are permitted provided that the following conditions are
812391Sjason@lowepower.com# met: redistributions of source code must retain the above copyright
912391Sjason@lowepower.com# notice, this list of conditions and the following disclaimer;
1012391Sjason@lowepower.com# redistributions in binary form must reproduce the above copyright
1112391Sjason@lowepower.com# notice, this list of conditions and the following disclaimer in the
1212391Sjason@lowepower.com# documentation and/or other materials provided with the distribution;
1312391Sjason@lowepower.com# neither the name of the copyright holders nor the names of its
1412391Sjason@lowepower.com# contributors may be used to endorse or promote products derived from
1512391Sjason@lowepower.com# this software without specific prior written permission.
1612391Sjason@lowepower.com#
1712391Sjason@lowepower.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1812391Sjason@lowepower.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1912391Sjason@lowepower.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2012391Sjason@lowepower.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2112391Sjason@lowepower.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2212391Sjason@lowepower.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2312391Sjason@lowepower.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2412391Sjason@lowepower.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2512391Sjason@lowepower.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2612391Sjason@lowepower.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2712391Sjason@lowepower.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2812391Sjason@lowepower.com#
2912391Sjason@lowepower.com# Authors: Steve Reinhardt
3012391Sjason@lowepower.com
3112391Sjason@lowepower.comimport os
3212391Sjason@lowepower.comimport sys
3312391Sjason@lowepower.comfrom os.path import isfile, join as joinpath
3412391Sjason@lowepower.com
3512391Sjason@lowepower.com# This file defines how to build a particular configuration of M5
3612391Sjason@lowepower.com# based on variable settings in the 'env' build environment.
3712391Sjason@lowepower.com
3812391Sjason@lowepower.com# Import build environment variable from SConstruct.
3912391Sjason@lowepower.comImport('env')
4012391Sjason@lowepower.com
4112391Sjason@lowepower.com###################################################
4212391Sjason@lowepower.com#
4312391Sjason@lowepower.com# Define needed sources.
4412391Sjason@lowepower.com#
4512391Sjason@lowepower.com###################################################
4612391Sjason@lowepower.com
4714299Sbbruce@ucdavis.edu# Base sources used by all configurations.
4814299Sbbruce@ucdavis.edu
4914299Sbbruce@ucdavis.edubase_sources = Split('''
5014299Sbbruce@ucdavis.edu	base/annotate.cc
5114299Sbbruce@ucdavis.edu	base/circlebuf.cc
5214299Sbbruce@ucdavis.edu	base/cprintf.cc
5314299Sbbruce@ucdavis.edu	base/fast_alloc.cc
5414299Sbbruce@ucdavis.edu	base/fifo_buffer.cc
5514299Sbbruce@ucdavis.edu	base/hostinfo.cc
5614299Sbbruce@ucdavis.edu	base/hybrid_pred.cc
5714299Sbbruce@ucdavis.edu	base/inifile.cc
5814299Sbbruce@ucdavis.edu	base/intmath.cc
5914299Sbbruce@ucdavis.edu	base/match.cc
6014299Sbbruce@ucdavis.edu	base/misc.cc
6114299Sbbruce@ucdavis.edu	base/output.cc
6214299Sbbruce@ucdavis.edu	base/pollevent.cc
6314299Sbbruce@ucdavis.edu	base/range.cc
6414299Sbbruce@ucdavis.edu	base/random.cc
6514299Sbbruce@ucdavis.edu	base/remote_gdb.cc
6614299Sbbruce@ucdavis.edu	base/sat_counter.cc
6714299Sbbruce@ucdavis.edu	base/socket.cc
6814299Sbbruce@ucdavis.edu	base/statistics.cc
6914299Sbbruce@ucdavis.edu	base/str.cc
7014299Sbbruce@ucdavis.edu	base/time.cc
7114299Sbbruce@ucdavis.edu	base/trace.cc
7212391Sjason@lowepower.com	base/traceflags.cc
7312391Sjason@lowepower.com	base/userinfo.cc
7412391Sjason@lowepower.com	base/compression/lzss_compression.cc
7512391Sjason@lowepower.com	base/loader/aout_object.cc
7612391Sjason@lowepower.com	base/loader/ecoff_object.cc
7712391Sjason@lowepower.com	base/loader/elf_object.cc
7812391Sjason@lowepower.com	base/loader/raw_object.cc
7912391Sjason@lowepower.com	base/loader/object_file.cc
8012391Sjason@lowepower.com	base/loader/symtab.cc
8112391Sjason@lowepower.com	base/stats/events.cc
8212391Sjason@lowepower.com	base/stats/statdb.cc
8312391Sjason@lowepower.com	base/stats/visit.cc
8412391Sjason@lowepower.com	base/stats/text.cc
8512391Sjason@lowepower.com
8612391Sjason@lowepower.com        cpu/activity.cc
8712391Sjason@lowepower.com	cpu/base.cc
8812391Sjason@lowepower.com	cpu/cpuevent.cc
8912391Sjason@lowepower.com	cpu/exetrace.cc
9012391Sjason@lowepower.com        cpu/func_unit.cc
9112391Sjason@lowepower.com        cpu/op_class.cc
9212391Sjason@lowepower.com	cpu/pc_event.cc
9312391Sjason@lowepower.com        cpu/quiesce_event.cc
9412391Sjason@lowepower.com	cpu/static_inst.cc
9512391Sjason@lowepower.com        cpu/simple_thread.cc
9612391Sjason@lowepower.com        cpu/thread_state.cc
9712391Sjason@lowepower.com
9812391Sjason@lowepower.com        mem/bridge.cc
9912391Sjason@lowepower.com        mem/bus.cc
10012391Sjason@lowepower.com        mem/dram.cc
10112391Sjason@lowepower.com        mem/mem_object.cc
10212391Sjason@lowepower.com        mem/packet.cc
10312391Sjason@lowepower.com        mem/physical.cc
10412391Sjason@lowepower.com        mem/port.cc
10512391Sjason@lowepower.com        mem/tport.cc
10612391Sjason@lowepower.com
10712391Sjason@lowepower.com        mem/cache/base_cache.cc
10812391Sjason@lowepower.com        mem/cache/cache.cc
10912391Sjason@lowepower.com        mem/cache/coherence/coherence_protocol.cc
11012391Sjason@lowepower.com        mem/cache/coherence/uni_coherence.cc
11112391Sjason@lowepower.com        mem/cache/miss/blocking_buffer.cc
11212391Sjason@lowepower.com        mem/cache/miss/miss_buffer.cc
11312391Sjason@lowepower.com        mem/cache/miss/miss_queue.cc
11412391Sjason@lowepower.com        mem/cache/miss/mshr.cc
11512391Sjason@lowepower.com        mem/cache/miss/mshr_queue.cc
11612391Sjason@lowepower.com        mem/cache/prefetch/base_prefetcher.cc
11712391Sjason@lowepower.com        mem/cache/prefetch/ghb_prefetcher.cc
11812391Sjason@lowepower.com        mem/cache/prefetch/stride_prefetcher.cc
11912391Sjason@lowepower.com        mem/cache/prefetch/tagged_prefetcher.cc
12012391Sjason@lowepower.com        mem/cache/tags/base_tags.cc
12112391Sjason@lowepower.com        mem/cache/tags/fa_lru.cc
12212391Sjason@lowepower.com        mem/cache/tags/iic.cc
12312391Sjason@lowepower.com        mem/cache/tags/lru.cc
12412391Sjason@lowepower.com        mem/cache/tags/repl/gen.cc
12512391Sjason@lowepower.com        mem/cache/tags/repl/repl.cc
12612391Sjason@lowepower.com        mem/cache/tags/split.cc
12712391Sjason@lowepower.com        mem/cache/tags/split_lifo.cc
12812391Sjason@lowepower.com        mem/cache/tags/split_lru.cc
12912391Sjason@lowepower.com
13012391Sjason@lowepower.com        mem/cache/cache_builder.cc
13112391Sjason@lowepower.com
13212391Sjason@lowepower.com        python/swig/init.cc
13312391Sjason@lowepower.com        python/swig/debug_wrap.cc
13412391Sjason@lowepower.com        python/swig/main_wrap.cc
13512391Sjason@lowepower.com        python/swig/event_wrap.cc
13612391Sjason@lowepower.com        python/swig/pyevent.cc
13712391Sjason@lowepower.com
13812391Sjason@lowepower.com	sim/builder.cc
13912391Sjason@lowepower.com	sim/debug.cc
14012391Sjason@lowepower.com	sim/eventq.cc
14112391Sjason@lowepower.com	sim/faults.cc
14212391Sjason@lowepower.com	sim/main.cc
14312391Sjason@lowepower.com	sim/param.cc
14412391Sjason@lowepower.com	sim/root.cc
14512391Sjason@lowepower.com	sim/serialize.cc
14612391Sjason@lowepower.com	sim/sim_events.cc
14712391Sjason@lowepower.com	sim/sim_object.cc
14812391Sjason@lowepower.com	sim/startup.cc
14912391Sjason@lowepower.com	sim/stat_context.cc
15012391Sjason@lowepower.com	sim/stat_control.cc
15112391Sjason@lowepower.com	sim/system.cc
15212391Sjason@lowepower.com	sim/trace_context.cc
15312391Sjason@lowepower.com        ''')
15412391Sjason@lowepower.com
15512391Sjason@lowepower.comtrace_reader_sources = Split('''
15612391Sjason@lowepower.com        cpu/trace/reader/mem_trace_reader.cc
15712391Sjason@lowepower.com        cpu/trace/reader/ibm_reader.cc
15812391Sjason@lowepower.com        cpu/trace/reader/itx_reader.cc
15912391Sjason@lowepower.com        cpu/trace/reader/m5_reader.cc
16012391Sjason@lowepower.com        cpu/trace/opt_cpu.cc
16112391Sjason@lowepower.com        cpu/trace/trace_cpu.cc
16212391Sjason@lowepower.com        ''')
16312391Sjason@lowepower.com
16412391Sjason@lowepower.com
16512391Sjason@lowepower.com
16612391Sjason@lowepower.com# MySql sources
16712391Sjason@lowepower.commysql_sources = Split('''
16812391Sjason@lowepower.com	base/mysql.cc
16912391Sjason@lowepower.com	base/stats/mysql.cc
17012391Sjason@lowepower.com        ''')
17112391Sjason@lowepower.com
17212391Sjason@lowepower.com# Full-system sources
17312391Sjason@lowepower.comfull_system_sources = Split('''
17412391Sjason@lowepower.com	base/crc.cc
17512391Sjason@lowepower.com	base/inet.cc
17612391Sjason@lowepower.com
17712391Sjason@lowepower.com	cpu/intr_control.cc
17812391Sjason@lowepower.com        cpu/profile.cc
17912391Sjason@lowepower.com
18012391Sjason@lowepower.com	dev/uart.cc
18112391Sjason@lowepower.com	dev/uart8250.cc
18212391Sjason@lowepower.com
18312391Sjason@lowepower.com        mem/vport.cc
18412391Sjason@lowepower.com
18512391Sjason@lowepower.com	sim/pseudo_inst.cc
18612391Sjason@lowepower.com        ''')
18712391Sjason@lowepower.com	#dev/sinic.cc
18812391Sjason@lowepower.com        #dev/i8254xGBe.cc
18912391Sjason@lowepower.com
19012391Sjason@lowepower.comif env['TARGET_ISA'] == 'alpha':
19112391Sjason@lowepower.com    full_system_sources += Split('''
19212391Sjason@lowepower.com	kern/tru64/dump_mbuf.cc
19312391Sjason@lowepower.com	kern/tru64/printf.cc
19412391Sjason@lowepower.com	kern/tru64/tru64_events.cc
19512391Sjason@lowepower.com	kern/tru64/tru64_syscalls.cc
19612391Sjason@lowepower.com        ''')
19712391Sjason@lowepower.com
19812391Sjason@lowepower.com# Syscall emulation (non-full-system) sources
19912391Sjason@lowepower.comsyscall_emulation_sources = Split('''
20012391Sjason@lowepower.com        mem/translating_port.cc
20112391Sjason@lowepower.com        mem/page_table.cc
20212391Sjason@lowepower.com	sim/process.cc
20312391Sjason@lowepower.com	sim/syscall_emul.cc
20412391Sjason@lowepower.com        ''')
20512391Sjason@lowepower.com
20612391Sjason@lowepower.com#if env['TARGET_ISA'] == 'alpha':
20712391Sjason@lowepower.com#    syscall_emulation_sources += Split('''
20812391Sjason@lowepower.com#        kern/tru64/tru64.cc
20912391Sjason@lowepower.com#        ''')
21012391Sjason@lowepower.com
21112391Sjason@lowepower.commemtest_sources = Split('''
21212391Sjason@lowepower.com	cpu/memtest/memtest.cc
21312391Sjason@lowepower.com        ''')
21412391Sjason@lowepower.com
21512391Sjason@lowepower.com# Include file paths are rooted in this directory.  SCons will
21612391Sjason@lowepower.com# automatically expand '.' to refer to both the source directory and
21712391Sjason@lowepower.com# the corresponding build directory to pick up generated include
21812391Sjason@lowepower.com# files.
21912391Sjason@lowepower.comenv.Append(CPPPATH=Dir('.'))
22012391Sjason@lowepower.com
22112391Sjason@lowepower.com# Add a flag defining what THE_ISA should be for all compilation
22212391Sjason@lowepower.comenv.Append(CPPDEFINES=[('THE_ISA','%s_ISA' % env['TARGET_ISA'].upper())])
22312391Sjason@lowepower.com
22412391Sjason@lowepower.comarch_sources = SConscript(os.path.join('arch', 'SConscript'), exports = 'env')
22512391Sjason@lowepower.com
22612391Sjason@lowepower.comcpu_sources = SConscript(os.path.join('cpu', 'SConscript'), exports = 'env')
22712391Sjason@lowepower.com
22812391Sjason@lowepower.comif env['FULL_SYSTEM']:
22912391Sjason@lowepower.com    dev_sources = SConscript(os.path.join('dev', 'SConscript'),
23012391Sjason@lowepower.com                             exports = 'env')
23114299Sbbruce@ucdavis.edu    full_system_sources += dev_sources
23214299Sbbruce@ucdavis.edu
23314299Sbbruce@ucdavis.edu    kern_sources = SConscript(os.path.join('kern', 'SConscript'),
23414299Sbbruce@ucdavis.edu                              exports = 'env')
23514299Sbbruce@ucdavis.edu    full_system_sources += kern_sources
23614299Sbbruce@ucdavis.edu
23712391Sjason@lowepower.com# Set up complete list of sources based on configuration.
23812391Sjason@lowepower.comsources = base_sources + arch_sources + cpu_sources
23912391Sjason@lowepower.com
24012391Sjason@lowepower.com# encumbered should be last because we're adding to some of the other groups
24112391Sjason@lowepower.comif isfile(joinpath(env['SRCDIR'], 'encumbered/SConscript')):
24212391Sjason@lowepower.com    sources += SConscript('encumbered/SConscript', exports = 'env')
24312391Sjason@lowepower.com
24412391Sjason@lowepower.com
24512391Sjason@lowepower.comif env['FULL_SYSTEM']:
24612391Sjason@lowepower.com    sources += full_system_sources
24712391Sjason@lowepower.comelse:
24812391Sjason@lowepower.com    sources += syscall_emulation_sources
24912391Sjason@lowepower.com
25012391Sjason@lowepower.comif env['USE_MYSQL']:
25112391Sjason@lowepower.com    sources += mysql_sources
25212391Sjason@lowepower.com
25312391Sjason@lowepower.comfor opt in env.ExportOptions:
25412391Sjason@lowepower.com    env.ConfigFile(opt)
25512391Sjason@lowepower.com
25612391Sjason@lowepower.com###################################################
25712391Sjason@lowepower.com#
25812391Sjason@lowepower.com# Special build rules.
25912391Sjason@lowepower.com#
26012391Sjason@lowepower.com###################################################
26112391Sjason@lowepower.com
26212391Sjason@lowepower.com# base/traceflags.{cc,hh} are generated from base/traceflags.py.
26314299Sbbruce@ucdavis.edu# $TARGET.base will expand to "<build-dir>/base/traceflags".
26414299Sbbruce@ucdavis.eduenv.Command(Split('base/traceflags.hh base/traceflags.cc'),
26514299Sbbruce@ucdavis.edu            'base/traceflags.py',
26612391Sjason@lowepower.com            'python $SOURCE $TARGET.base')
26714299Sbbruce@ucdavis.edu
26814299Sbbruce@ucdavis.eduSConscript('python/SConscript', exports = ['env'])
26914299Sbbruce@ucdavis.edu
27014299Sbbruce@ucdavis.edu# This function adds the specified sources to the given build
27114299Sbbruce@ucdavis.edu# environment, and returns a list of all the corresponding SCons
27214299Sbbruce@ucdavis.edu# Object nodes (including an extra one for date.cc).  We explicitly
27314299Sbbruce@ucdavis.edu# add the Object nodes so we can set up special dependencies for
27414299Sbbruce@ucdavis.edu# date.cc.
27514299Sbbruce@ucdavis.edudef make_objs(sources, env):
27614299Sbbruce@ucdavis.edu    objs = [env.Object(s) for s in sources]
27714299Sbbruce@ucdavis.edu    # make date.cc depend on all other objects so it always gets
27814299Sbbruce@ucdavis.edu    # recompiled whenever anything else does
27914299Sbbruce@ucdavis.edu    date_obj = env.Object('base/date.cc')
28014299Sbbruce@ucdavis.edu    env.Depends(date_obj, objs)
28114299Sbbruce@ucdavis.edu    objs.append(date_obj)
282    return objs
283
284###################################################
285#
286# Define binaries.  Each different build type (debug, opt, etc.) gets
287# a slightly different build environment.
288#
289###################################################
290
291# List of constructed environments to pass back to SConstruct
292envList = []
293
294# Function to create a new build environment as clone of current
295# environment 'env' with modified object suffix and optional stripped
296# binary.  Additional keyword arguments are appended to corresponding
297# build environment vars.
298def makeEnv(label, objsfx, strip = False, **kwargs):
299    newEnv = env.Copy(OBJSUFFIX=objsfx)
300    newEnv.Label = label
301    newEnv.Append(**kwargs)
302    exe = 'm5.' + label  # final executable
303    bin = exe + '.bin'   # executable w/o appended Python zip archive
304    newEnv.Program(bin, make_objs(sources, newEnv))
305    if strip:
306        stripped_bin = bin + '.stripped'
307        if sys.platform == 'sunos5':
308            newEnv.Command(stripped_bin, bin, 'cp $SOURCE $TARGET; strip $TARGET')
309        else:
310            newEnv.Command(stripped_bin, bin, 'strip $SOURCE -o $TARGET')
311        bin = stripped_bin
312    targets = newEnv.Concat(exe, [bin, 'python/m5py.zip'])
313    newEnv.M5Binary = targets[0]
314    envList.append(newEnv)
315
316# Debug binary
317ccflags = {}
318if env['GCC']:
319    if sys.platform == 'sunos5':
320        ccflags['debug'] = '-gstabs+'
321    else:
322        ccflags['debug'] = '-ggdb3'
323    ccflags['opt'] = '-g -O3'
324    ccflags['fast'] = '-O3'
325    ccflags['prof'] = '-O3 -g -pg'
326elif env['SUNCC']:
327    ccflags['debug'] = '-g0'
328    ccflags['opt'] = '-g -O'
329    ccflags['fast'] = '-fast'
330    ccflags['prof'] = '-fast -g -pg'
331elif env['ICC']:
332    ccflags['debug'] = '-g -O0'
333    ccflags['opt'] = '-g -O'
334    ccflags['fast'] = '-fast'
335    ccflags['prof'] = '-fast -g -pg'
336else:
337    print 'Unknown compiler, please fix compiler options'
338    Exit(1)    
339
340makeEnv('debug', '.do',
341        CCFLAGS = Split(ccflags['debug']),
342        CPPDEFINES = ['DEBUG', 'TRACING_ON=1'])
343
344# Optimized binary
345makeEnv('opt', '.o',
346        CCFLAGS = Split(ccflags['opt']),
347        CPPDEFINES = ['TRACING_ON=1'])
348
349# "Fast" binary
350makeEnv('fast', '.fo', strip = True,
351        CCFLAGS = Split(ccflags['fast']),
352        CPPDEFINES = ['NDEBUG', 'TRACING_ON=0'])
353
354# Profiled binary
355makeEnv('prof', '.po',
356        CCFLAGS = Split(ccflags['prof']),
357        CPPDEFINES = ['NDEBUG', 'TRACING_ON=0'],
358        LINKFLAGS = '-pg')
359
360Return('envList')
361