SCons: Allow top level directory of EXTRAS able to contain SConscripts.

The current EXTRAS will fail if the top level directory pointed to by EXTRAS
has a SConscript file in it.  We allow this by including the directory name
of the EXTRA in the build directory which prevents a clash between
src/SConscript and extra/SConscript. Maintain compatibility with older uses
of EXTRAS by adding a -I for each top level extra directory.
This commit is contained in:
Nathan Binkert 2008-11-10 11:51:18 -08:00
parent eb5d9ba72b
commit 4d64d7664c
2 changed files with 25 additions and 13 deletions

View file

@ -324,11 +324,14 @@ global_sticky_opts.Save(global_sticky_opts_file, env)
# Parse EXTRAS option to build list of all directories where we're # Parse EXTRAS option to build list of all directories where we're
# look for sources etc. This list is exported as base_dir_list. # look for sources etc. This list is exported as base_dir_list.
base_dir_list = [joinpath(ROOT, 'src')] base_dir = joinpath(ROOT, 'src')
if env['EXTRAS']: if env['EXTRAS']:
base_dir_list += env['EXTRAS'].split(':') extras_dir_list = env['EXTRAS'].split(':')
else:
extras_dir_list = []
Export('base_dir_list') Export('base_dir')
Export('extras_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')) })
@ -594,8 +597,8 @@ 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 base_dir in base_dir_list: for bdir in [ base_dir ] + extras_dir_list:
for root, dirs, files in os.walk(base_dir): for root, dirs, files in os.walk(bdir):
if 'SConsopts' in files: if 'SConsopts' in files:
print "Reading", joinpath(root, 'SConsopts') print "Reading", joinpath(root, 'SConsopts')
SConscript(joinpath(root, 'SConsopts')) SConscript(joinpath(root, 'SConsopts'))

View file

@ -36,7 +36,7 @@ import re
import sys import sys
import zlib import zlib
from os.path import basename, exists, isdir, isfile, join as joinpath from os.path import basename, dirname, exists, isdir, isfile, join as joinpath
import SCons import SCons
@ -214,6 +214,9 @@ Export('CompoundFlag')
# files. # files.
env.Append(CPPPATH=Dir('.')) env.Append(CPPPATH=Dir('.'))
for extra_dir in extras_dir_list:
env.Append(CPPPATH=Dir(extra_dir))
# Add a flag defining what THE_ISA should be for all compilation # Add a flag defining what THE_ISA should be for all compilation
env.Append(CPPDEFINES=[('THE_ISA','%s_ISA' % env['TARGET_ISA'].upper())]) env.Append(CPPDEFINES=[('THE_ISA','%s_ISA' % env['TARGET_ISA'].upper())])
@ -222,15 +225,21 @@ env.Append(CPPDEFINES=[('THE_ISA','%s_ISA' % env['TARGET_ISA'].upper())])
# Walk the tree and execute all SConscripts in subdirectories # Walk the tree and execute all SConscripts in subdirectories
# #
for base_dir in base_dir_list: here = Dir('.').srcnode().abspath
here = Dir('.').srcnode().abspath for root, dirs, files in os.walk(base_dir, topdown=True):
for root, dirs, files in os.walk(base_dir, topdown=True): if root == here:
if root == here: # we don't want to recurse back into this SConscript
# we don't want to recurse back into this SConscript continue
continue
if 'SConscript' in files:
build_dir = joinpath(env['BUILDDIR'], root[len(base_dir) + 1:])
SConscript(joinpath(root, 'SConscript'), build_dir=build_dir)
for extra_dir in extras_dir_list:
prefix_len = len(dirname(extra_dir)) + 1
for root, dirs, files in os.walk(extra_dir, topdown=True):
if 'SConscript' in files: if 'SConscript' in files:
build_dir = joinpath(env['BUILDDIR'], root[len(base_dir) + 1:]) build_dir = joinpath(env['BUILDDIR'], root[prefix_len:])
SConscript(joinpath(root, 'SConscript'), build_dir=build_dir) SConscript(joinpath(root, 'SConscript'), build_dir=build_dir)
for opt in env.ExportOptions: for opt in env.ExportOptions: