Make EXTRAS work for SConsopts too.

Requires pushing source files down into 'src' subdir relative
to directory listed in EXTRAS.

--HG--
extra : convert_revision : ca04adc3e24c60bd3e7b63ca5770b31333d76729
This commit is contained in:
Steve Reinhardt 2008-02-05 17:40:08 -08:00
parent ca313e2303
commit d725ff450d
2 changed files with 79 additions and 59 deletions

View file

@ -205,6 +205,10 @@ for t in abs_targets:
if build_path not in build_paths: if build_path not in build_paths:
build_paths.append(build_path) build_paths.append(build_path)
# Make sure build_root exists (might not if this is the first build there)
if not isdir(build_root):
os.mkdir(build_root)
################################################### ###################################################
# #
# Set up the default build environment. This environment is copied # Set up the default build environment. This environment is copied
@ -216,14 +220,6 @@ env = Environment(ENV = os.environ, # inherit user's environment vars
ROOT = ROOT, ROOT = ROOT,
SRCDIR = SRCDIR) SRCDIR = SRCDIR)
#Parse CC/CXX early so that we use the correct compiler for
# to test for dependencies/versions/libraries/includes
if ARGUMENTS.get('CC', None):
env['CC'] = ARGUMENTS.get('CC')
if ARGUMENTS.get('CXX', None):
env['CXX'] = ARGUMENTS.get('CXX')
Export('env') Export('env')
env.SConsignFile(joinpath(build_root,"sconsign")) env.SConsignFile(joinpath(build_root,"sconsign"))
@ -240,6 +236,61 @@ env.SetOption('duplicate', 'soft-copy')
if False: if False:
env.TargetSignatures('content') env.TargetSignatures('content')
#
# Set up global sticky options... these are common to an entire build
# tree (not specific to a particular build like ALPHA_SE)
#
# Option validators & converters for global sticky options
def PathListMakeAbsolute(val):
if not val:
return val
f = lambda p: os.path.abspath(os.path.expanduser(p))
return ':'.join(map(f, val.split(':')))
def PathListAllExist(key, val, env):
if not val:
return
paths = val.split(':')
for path in paths:
if not isdir(path):
raise SCons.Errors.UserError("Path does not exist: '%s'" % path)
global_sticky_opts_file = joinpath(build_root, 'options.global')
global_sticky_opts = Options(global_sticky_opts_file, args=ARGUMENTS)
global_sticky_opts.AddOptions(
('CC', 'C compiler', os.environ.get('CC', env['CC'])),
('CXX', 'C++ compiler', os.environ.get('CXX', env['CXX'])),
('EXTRAS', 'Add Extra directories to the compilation', '',
PathListAllExist, PathListMakeAbsolute)
)
# base help text
help_text = '''
Usage: scons [scons options] [build options] [target(s)]
'''
help_text += "Global sticky options:\n" \
+ global_sticky_opts.GenerateHelpText(env)
# Update env with values from ARGUMENTS & file global_sticky_opts_file
global_sticky_opts.Update(env)
# Save sticky option settings back to current options file
global_sticky_opts.Save(global_sticky_opts_file, env)
# Parse EXTRAS option to build list of all directories where we're
# look for sources etc. This list is exported as base_dir_list.
base_dir_list = [ROOT]
if env['EXTRAS']:
base_dir_list += env['EXTRAS'].split(':')
Export('base_dir_list')
# M5_PLY is used by isa_parser.py to find the PLY package. # M5_PLY is used by isa_parser.py to find the PLY package.
env.Append(ENV = { 'M5_PLY' : str(Dir('ext/ply')) }) env.Append(ENV = { 'M5_PLY' : str(Dir('ext/ply')) })
env['GCC'] = False env['GCC'] = False
@ -467,28 +518,16 @@ Export('nonsticky_opts')
# Walk the tree and execute all SConsopts scripts that wil add to the # Walk the tree and execute all SConsopts scripts that wil add to the
# above options # above options
for root, dirs, files in os.walk('.'): for base_dir in base_dir_list:
if 'SConsopts' in files: for root, dirs, files in os.walk(base_dir):
SConscript(os.path.join(root, 'SConsopts')) if 'SConsopts' in files:
print "Reading", os.path.join(root, 'SConsopts')
SConscript(os.path.join(root, 'SConsopts'))
all_isa_list.sort() all_isa_list.sort()
all_cpu_list.sort() all_cpu_list.sort()
default_cpus.sort() default_cpus.sort()
def PathListMakeAbsolute(val):
if not val:
return val
f = lambda p: os.path.abspath(os.path.expanduser(p))
return ':'.join(map(f, val.split(':')))
def PathListAllExist(key, val, env):
if not val:
return
paths = val.split(':')
for path in paths:
if not isdir(path):
raise SCons.Errors.UserError("Path does not exist: '%s'" % path)
sticky_opts.AddOptions( sticky_opts.AddOptions(
EnumOption('TARGET_ISA', 'Target ISA', 'alpha', all_isa_list), EnumOption('TARGET_ISA', 'Target ISA', 'alpha', all_isa_list),
BoolOption('FULL_SYSTEM', 'Full-system support', False), BoolOption('FULL_SYSTEM', 'Full-system support', False),
@ -509,15 +548,11 @@ sticky_opts.AddOptions(
BoolOption('USE_MYSQL', 'Use MySQL for stats output', have_mysql), BoolOption('USE_MYSQL', 'Use MySQL for stats output', have_mysql),
BoolOption('USE_FENV', 'Use <fenv.h> IEEE mode control', have_fenv), BoolOption('USE_FENV', 'Use <fenv.h> IEEE mode control', have_fenv),
BoolOption('USE_CHECKER', 'Use checker for detailed CPU models', False), BoolOption('USE_CHECKER', 'Use checker for detailed CPU models', False),
('CC', 'C compiler', os.environ.get('CC', env['CC'])),
('CXX', 'C++ compiler', os.environ.get('CXX', env['CXX'])),
BoolOption('BATCH', 'Use batch pool for build and tests', False), BoolOption('BATCH', 'Use batch pool for build and tests', False),
('BATCH_CMD', 'Batch pool submission command name', 'qdo'), ('BATCH_CMD', 'Batch pool submission command name', 'qdo'),
('PYTHONHOME', ('PYTHONHOME',
'Override the default PYTHONHOME for this system (use with caution)', 'Override the default PYTHONHOME for this system (use with caution)',
'%s:%s' % (sys.prefix, sys.exec_prefix)), '%s:%s' % (sys.prefix, sys.exec_prefix)),
('EXTRAS', 'Add Extra directories to the compilation', '',
PathListAllExist, PathListMakeAbsolute)
) )
nonsticky_opts.AddOptions( nonsticky_opts.AddOptions(
@ -607,12 +642,6 @@ concat_builder = Builder(action = Action(['cat $SOURCES > $TARGET',
env.Append(BUILDERS = { 'Concat' : concat_builder }) env.Append(BUILDERS = { 'Concat' : concat_builder })
# base help text
help_text = '''
Usage: scons [scons options] [build options] [target(s)]
'''
# libelf build is shared across all configs in the build root. # libelf build is shared across all configs in the build root.
env.SConscript('ext/libelf/SConscript', env.SConscript('ext/libelf/SConscript',
build_dir = joinpath(build_root, 'libelf'), build_dir = joinpath(build_root, 'libelf'),
@ -712,7 +741,7 @@ for build_path in build_paths:
sticky_opts.Update(env) sticky_opts.Update(env)
nonsticky_opts.Update(env) nonsticky_opts.Update(env)
help_text += "Sticky options for %s:\n" % build_dir \ help_text += "\nSticky options for %s:\n" % build_dir \
+ sticky_opts.GenerateHelpText(env) \ + sticky_opts.GenerateHelpText(env) \
+ "\nNon-sticky options for %s:\n" % build_dir \ + "\nNon-sticky options for %s:\n" % build_dir \
+ nonsticky_opts.GenerateHelpText(env) + nonsticky_opts.GenerateHelpText(env)

View file

@ -33,7 +33,7 @@ import os
import sys import sys
from os.path import basename from os.path import basename
from os.path import join as joinpath from os.path import isdir, join as joinpath
from os.path import exists from os.path import exists
from os.path import isdir from os.path import isdir
from os.path import isfile from os.path import isfile
@ -181,31 +181,22 @@ env.Append(CPPDEFINES=[('THE_ISA','%s_ISA' % env['TARGET_ISA'].upper())])
######################################################################## ########################################################################
# #
# Walk the tree and execute all SConscripts # Walk the tree and execute all SConscripts in 'src' subdirectories
# #
srcdir = env['SRCDIR']
for root, dirs, files in os.walk(srcdir, topdown=True): for base_dir in base_dir_list:
if root == srcdir: src_dir = joinpath(base_dir, 'src')
# we don't want to recurse back into this SConscript if not isdir(src_dir):
continue continue
here = Dir('.').srcnode().abspath
for root, dirs, files in os.walk(src_dir, topdown=True):
if root == here:
# we don't want to recurse back into this SConscript
continue
if 'SConscript' in files: if 'SConscript' in files:
# strip off the srcdir part since scons will try to find the build_dir = joinpath(env['BUILDDIR'], root[len(src_dir) + 1:])
# script in the build directory SConscript(joinpath(root, 'SConscript'), build_dir=build_dir)
base = root[len(srcdir) + 1:]
SConscript(joinpath(base, 'SConscript'))
extra_string = env['EXTRAS']
if extra_string and extra_string != '' and not extra_string.isspace():
for extra in extra_string.split(':'):
print 'Adding', extra, 'to source directory list'
env.Append(CPPPATH=[Dir(extra)])
for root, dirs, files in os.walk(extra, topdown=True):
if 'SConscript' in files:
subdir = root[len(os.path.dirname(extra))+1:]
print ' Found SConscript in', subdir
build_dir = joinpath(env['BUILDDIR'], subdir)
SConscript(joinpath(root, 'SConscript'), build_dir=build_dir)
for opt in env.ExportOptions: for opt in env.ExportOptions:
env.ConfigFile(opt) env.ConfigFile(opt)