compile revision 3855
16157Snate@binkert.org#!/usr/bin/env python 26157Snate@binkert.org# Copyright (c) 2006 The Regents of The University of Michigan 36157Snate@binkert.org# All rights reserved. 46157Snate@binkert.org# 56157Snate@binkert.org# Redistribution and use in source and binary forms, with or without 66157Snate@binkert.org# modification, are permitted provided that the following conditions are 76157Snate@binkert.org# met: redistributions of source code must retain the above copyright 86157Snate@binkert.org# notice, this list of conditions and the following disclaimer; 96157Snate@binkert.org# redistributions in binary form must reproduce the above copyright 106157Snate@binkert.org# notice, this list of conditions and the following disclaimer in the 116157Snate@binkert.org# documentation and/or other materials provided with the distribution; 126157Snate@binkert.org# neither the name of the copyright holders nor the names of its 136157Snate@binkert.org# contributors may be used to endorse or promote products derived from 146157Snate@binkert.org# this software without specific prior written permission. 156157Snate@binkert.org# 166157Snate@binkert.org# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 176157Snate@binkert.org# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 186157Snate@binkert.org# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 196157Snate@binkert.org# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 206157Snate@binkert.org# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 216157Snate@binkert.org# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 226157Snate@binkert.org# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 236157Snate@binkert.org# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 246157Snate@binkert.org# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 256157Snate@binkert.org# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 266157Snate@binkert.org# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276157Snate@binkert.org# 286157Snate@binkert.org# Authors: Nathan Binkert 296157Snate@binkert.org 306157Snate@binkert.orgimport os, re, sys 316157Snate@binkert.orgfrom os.path import isdir, isfile, join as joinpath 326157Snate@binkert.org 336157Snate@binkert.orghomedir = os.environ['HOME'] 346157Snate@binkert.org 356157Snate@binkert.orgdef do_compile(): 366157Snate@binkert.org # 376157Snate@binkert.org # Find SCons 386157Snate@binkert.org # 396157Snate@binkert.org search_dirs = [ joinpath(homedir, 'local/lib'), '/opt/local/lib', 407768SAli.Saidi@ARM.com '/usr/local/lib', '/usr/lib' ] 417768SAli.Saidi@ARM.com 427768SAli.Saidi@ARM.com if os.environ.has_key("SCONS_LIB_DIR"): 436168Snate@binkert.org search_dirs.append(os.environ["SCONS_LIB_DIR"]) 446168Snate@binkert.org 456168Snate@binkert.org local = re.compile(r'^scons-local-([0-9]*)\.([0-9]*)\.([0-9]*)$') 466157Snate@binkert.org standard = re.compile(r'^scons-([0-9]*)\.([0-9]*)\.([0-9]*)$') 476157Snate@binkert.org 486157Snate@binkert.org scons_dirs = [] 496157Snate@binkert.org for dir in search_dirs: 506157Snate@binkert.org if not isdir(dir): 516157Snate@binkert.org continue 526157Snate@binkert.org 536157Snate@binkert.org entries = os.listdir(dir) 546157Snate@binkert.org for entry in entries: 556157Snate@binkert.org if not entry.startswith('scons'): 566157Snate@binkert.org continue 576157Snate@binkert.org 586157Snate@binkert.org version = (0,0,0) 596157Snate@binkert.org path = joinpath(dir, entry) 606157Snate@binkert.org 616157Snate@binkert.org match = local.search(entry) 626157Snate@binkert.org if not match: 636157Snate@binkert.org match = standard.search(entry) 646157Snate@binkert.org 656157Snate@binkert.org if match: 666157Snate@binkert.org version = match.group(1), match.group(2), match.group(3) 676157Snate@binkert.org 686157Snate@binkert.org scons_dirs.append((version, path)) 696157Snate@binkert.org 706157Snate@binkert.org scons_dirs.sort() 716157Snate@binkert.org scons_dirs.reverse() 726157Snate@binkert.org 736157Snate@binkert.org if not scons_dirs: 746157Snate@binkert.org print >>sys.stderr, \ 756157Snate@binkert.org "could not find scons in the following dirs: %s" % search_dirs 766157Snate@binkert.org sys.exit(1) 776157Snate@binkert.org 786157Snate@binkert.org sys.path = [ scons_dirs[0][1] ] + sys.path 796157Snate@binkert.org 806157Snate@binkert.org # invoke SCons 816157Snate@binkert.org import SCons.Script 826157Snate@binkert.org SCons.Script.main() 836157Snate@binkert.org 846157Snate@binkert.org# 856157Snate@binkert.org# do argument parsing 866157Snate@binkert.org# 876157Snate@binkert.orgprogname = sys.argv[0] 886157Snate@binkert.org 896157Snate@binkert.orgimport optparse 906157Snate@binkert.org 916882SBrad.Beckmann@amd.comusage = '''%prog [compile options] <version> [SCons options] 926286Snate@binkert.org 936286Snate@binkert.org%prog assumes that the user has a directory called ~/m5/<version> where 946286Snate@binkert.orgthe source tree resides, and a directory called ~/build, where %prog 956286Snate@binkert.orgwill create ~/build/<version> if it does not exist and build the resulting 968092Snilay@cs.wisc.edusimulators there. 976286Snate@binkert.org 986286Snate@binkert.orgIf ~/build is set up in such a way that it points to a local disk on 996157Snate@binkert.orgeach host, compiles will be very efficient. For example: 1006157Snate@binkert.org~/build -> /z/<username>/.build (Assuming that /z is a local disk and 1016157Snate@binkert.orgnot NFS mounted, whereas your home directory is NFS mounted). 1026157Snate@binkert.org''' 1036157Snate@binkert.orgversion = '%prog 0.1' 1046286Snate@binkert.orgparser = optparse.OptionParser(usage=usage, version=version, 1056157Snate@binkert.org formatter=optparse.TitledHelpFormatter()) 1066286Snate@binkert.orgparser.disable_interspersed_args() 1076157Snate@binkert.org 1086157Snate@binkert.org# current option group 1096157Snate@binkert.orggroup = None 1108191SLisa.Hsu@amd.com 1116157Snate@binkert.orgdef set_group(*args, **kwargs): 1126157Snate@binkert.org '''set the current option group''' 1136797SBrad.Beckmann@amd.com global group 1146157Snate@binkert.org if not args and not kwargs: 1156157Snate@binkert.org group = None 1166157Snate@binkert.org else: 117 group = parser.add_option_group(*args, **kwargs) 118 119def add_option(*args, **kwargs): 120 if group: 121 return group.add_option(*args, **kwargs) 122 else: 123 return parser.add_option(*args, **kwargs) 124 125def bool_option(name, default, help): 126 '''add a boolean option called --name and --no-name. 127 Display help depending on which is the default''' 128 129 tname = '--%s' % name 130 fname = '--no-%s' % name 131 dest = name.replace('-', '_') 132 if default: 133 thelp = optparse.SUPPRESS_HELP 134 fhelp = help 135 else: 136 thelp = help 137 fhelp = optparse.SUPPRESS_HELP 138 139 add_option(tname, action="store_true", default=default, help=thelp) 140 add_option(fname, action="store_false", dest=dest, help=fhelp) 141 142add_option('-n', '--no-compile', default=False, action='store_true', 143 help="don't actually compile, just echo SCons command line") 144add_option('--everything', default=False, action='store_true', 145 help="compile everything that can be compiled") 146add_option('-E', "--experimental", action='store_true', default=False, 147 help="enable experimental builds") 148add_option('-v', "--verbose", default=False, action='store_true', 149 help="be verbose") 150 151set_group("Output binary types") 152bool_option("debug", default=False, help="compile debug binaries") 153bool_option("opt", default=False, help="compile opt binaries") 154bool_option("fast", default=False, help="compile fast binaries") 155bool_option("prof", default=False, help="compile profile binaries") 156add_option('-a', "--all-bin", default=False, action='store_true', 157 help="compile debug, opt, and fast binaries") 158 159set_group("ISA options") 160bool_option("alpha", default=False, help="compile Alpha") 161bool_option("mips", default=False, help="compile MIPS") 162bool_option("sparc", default=False, help="compile SPARC") 163add_option('-i', "--all-isa", default=False, action='store_true', 164 help="compile all ISAs") 165 166set_group("Emulation options") 167bool_option("syscall", default=True, 168 help="Do not compile System Call Emulation mode") 169bool_option("fullsys", default=True, 170 help="Do not compile Full System mode") 171 172def usage(exitcode=None): 173 parser.print_help() 174 if exitcode is not None: 175 sys.exit(exitcode) 176 177(options, args) = parser.parse_args() 178 179if options.everything: 180 options.all_bin = True 181 options.prof = True 182 options.all_isa = True 183 184if options.all_bin: 185 options.debug = True 186 options.opt = True 187 options.fast = True 188 189binaries = [] 190if options.debug: 191 binaries.append('m5.debug') 192if options.opt: 193 binaries.append('m5.opt') 194if options.fast: 195 binaries.append('m5.fast') 196if options.prof: 197 binaries.append('m5.prof') 198 199if not binaries: 200 binaries.append('m5.debug') 201 202if options.all_isa: 203 options.alpha = True 204 options.mips = True 205 options.sparc = True 206 207isas = [] 208if options.alpha: 209 isas.append('alpha') 210if options.mips: 211 isas.append('mips') 212if options.sparc: 213 isas.append('sparc') 214 215if not isas: 216 isas.append('alpha') 217 218modes = [] 219if options.syscall: 220 modes.append('syscall') 221if options.fullsys: 222 modes.append('fullsys') 223 224if not modes: 225 sys.exit("must specify at least one mode") 226 227# 228# Convert options into SCons command line arguments 229# 230 231# valid combinations of ISA and emulation mode 232valid = { ('alpha', 'syscall') : 'ALPHA_SE', 233 ('alpha', 'fullsys') : 'ALPHA_FS', 234 ('mips', 'syscall') : 'MIPS_SE', 235 ('sparc', 'syscall') : 'SPARC_SE' } 236 237# experimental combinations of ISA and emulation mode 238experiment = { ('mips', 'fullsys') : 'MIPS_FS', 239 ('sparc', 'fullsys') : 'SPARC_FS' } 240 241if options.experimental: 242 valid.update(experiment) 243 244builds = [] 245for isa in isas: 246 for mode in modes: 247 try: 248 build = valid[(isa, mode)] 249 builds.append(build) 250 except KeyError: 251 pass 252 253if not builds: 254 sys.exit("must specify at least one valid combination of ISA and mode") 255 256if not args: 257 usage(2) 258 259version = args[0] 260del args[0] 261 262for bin in binaries: 263 for build in builds: 264 args.append('%s/%s' % (build, bin)) 265 266# 267# set up compile 268# 269build_base = joinpath(homedir, 'build') 270m5_base = joinpath(homedir, 'm5') 271 272if not isdir(build_base): 273 sys.exit('build directory %s not found' % build_base) 274 275if not isdir(m5_base): 276 sys.exit('m5 base directory %s not found' % m5_base) 277 278m5_dir = joinpath(m5_base, version) 279if not isdir(m5_dir): 280 sys.exit('source directory %s not found' % m5_dir) 281 282# support M5 1.x 283oldstyle = isfile(joinpath(m5_dir, 'SConscript')) 284if oldstyle: 285 ext_dir = joinpath(m5_base, 'ext') 286 test_dir = joinpath(m5_base, 'test.' + version) 287 288 if not isdir(ext_dir): 289 sys.exit('ext directory not found at %s' % ext_dir) 290 291 if not isdir(test_dir): 292 sys.exit('test directory not found at %s' % test_dir) 293 294build_dir = joinpath(build_base, version) 295if not isdir(build_dir): 296 os.mkdir(build_dir) 297 # need some symlinks for m5 1.x 298 if oldstyle: 299 os.symlink(m5_dir, joinpath(build_dir, 'm5')) 300 os.symlink(ext_dir, joinpath(build_dir, 'ext')) 301 os.symlink(test_dir, joinpath(build_dir, 'test')) 302 os.symlink(joinpath(m5_dir, 'build', 'SConstruct'), 303 joinpath(build_dir, 'SConstruct')) 304 os.symlink(joinpath(m5_dir, 'build', 'default_options'), 305 joinpath(build_dir, 'default_options')) 306 307sys.argv = [ progname ] 308if oldstyle: 309 os.chdir(build_dir) 310 sys.argv.extend(args) 311else: 312 os.chdir(m5_dir) 313 for arg in args: 314 if not arg.startswith('-') and '=' not in arg: 315 arg = joinpath(build_dir, 'build', arg) 316 sys.argv.append(arg) 317 318if options.no_compile or options.verbose: 319 for arg in sys.argv[1:]: 320 print arg 321 322if not options.no_compile: 323 do_compile() 324