diff options
Diffstat (limited to 'site_scons/site_init.py')
-rw-r--r-- | site_scons/site_init.py | 416 |
1 files changed, 0 insertions, 416 deletions
diff --git a/site_scons/site_init.py b/site_scons/site_init.py deleted file mode 100644 index 369b886..0000000 --- a/site_scons/site_init.py +++ /dev/null @@ -1,416 +0,0 @@ -#!/usr/bin/python2.4 -# Copyright 2008, Google Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Software construction toolkit site_scons configuration. - -This module sets up SCons for use with this toolkit. This should contain setup -which occurs outside of environments. If a method operates within the context -of an environment, it should instead go in a tool in site_tools and be invoked -for the target environment. -""" - -import __builtin__ -import sys -import SCons - - -def _HostPlatform(): - """Returns the current host platform. - - That is, the platform we're actually running SCons on. You shouldn't use - this inside your SConscript files; instead, include the appropriate - target_platform tool for your environments. When you call - BuildEnvironments(), only environments with the current host platform will be - built. - - Returns: - The host platform name - one of ('WINDOWS', 'LINUX', 'MAC'). - """ - - platform_map = { - 'win32': 'WINDOWS', - 'cygwin': 'WINDOWS', - 'linux': 'LINUX', - 'linux2': 'LINUX', - 'darwin': 'MAC', - } - - if sys.platform not in platform_map: - print ('site_init.py warning: platform "%s" is not in platfom map.' % - sys.platform) - - return platform_map.get(sys.platform, sys.platform) - - -#------------------------------------------------------------------------------ - - -def _CheckBuildModes(build_modes, environments, host_platform): - """Checks the build modes for the environments. - - Args: - build_modes: List of build mode strings. - environments: List of SCons environments. - host_platform: Host platform string. - - Raises: - ValueError: build groups and/or types invalid. - """ - # Make sure the list of environments for the current host platform have - # unique BUILD_TYPE. This ensures they won't overwrite each others' build - # output. (It is ok for build types in different host platforms to overlap; - # that is, WINDOWS and MAC can both have a 'dbg' build type.) - all_build_types = [] - all_build_groups = {} - build_desc = {} - for e in environments: - if not e.Overlap(e['HOST_PLATFORMS'], [host_platform, '*']): - continue - if e['BUILD_TYPE'] in all_build_types: - raise ValueError('Multiple environments have the same BUILD_TYPE=%s' % - e['BUILD_TYPE']) - else: - all_build_types.append(e['BUILD_TYPE']) - build_desc[e['BUILD_TYPE']] = e.get('BUILD_TYPE_DESCRIPTION') - - # Keep track of build groups and the build types which belong to them - for g in e['BUILD_GROUPS']: - if g not in all_build_groups: - all_build_groups[g] = [] - # Don't allow build types and groups to share names - if g in all_build_types: - raise ValueError('Build group %s also specified as BUILD_TYPE.' % g) - else: - all_build_types.append(g) - all_build_groups[g].append(e['BUILD_TYPE']) - - # Add help for build types - help_text = ''' -Use --mode=type to specify the type of build to perform. The following types -may be specified: -''' - - for build_type in all_build_types: - if build_type not in all_build_groups: - help_text += ' %-16s %s\n' % ( - build_type, build_desc.get(build_type, '')) - - help_text += ''' -The following build groups may also be specified via --mode. Build groups -build one or more of the other build types. The available build groups are: -''' - - groups_sorted = all_build_groups.keys() - groups_sorted.sort() - for g in groups_sorted: - help_text += ' %-16s %s\n' % (g, ','.join(all_build_groups[g])) - - help_text += ''' -Multiple modes may be specified, separated by commas: --mode=mode1,mode2. If -no mode is specified, the default group will be built. This is equivalent to -specifying --mode=default. - ''' - SCons.Script.Help(help_text) - - # Make sure all build modes specified by the user are ones which apply to - # the current environment. - for mode in build_modes: - if mode not in all_build_types and mode not in all_build_groups: - print ('Warning: Ignoring build mode "%s", which is not defined on this ' - 'platform.' % mode) - - -#------------------------------------------------------------------------------ - - -def BuildEnvironmentSConscripts(env): - """Evaluates SConscripts for the environment. - - Called by BuildEnvironments(). - """ - # Read SConscript for each component - # TODO(rspangler): Remove BUILD_COMPONENTS once all projects have - # transitioned to the BUILD_SCONSCRIPTS nomenclature. - for c in env.SubstList2('$BUILD_SCONSCRIPTS', '$BUILD_COMPONENTS'): - # Clone the environment so components can't interfere with each other - ec = env.Clone() - - if ec.Entry(c).isdir(): - # The component is a directory, so assume it contains a SConscript - # file. - c_dir = ec.Dir(c) - - # Use 'build.scons' as the default filename, but if that doesn't - # exist, fall back to 'SConscript'. - c_script = c_dir.File('build.scons') - if not c_script.exists(): - c_script = c_dir.File('SConscript') - else: - # The component is a SConscript file. - c_script = ec.File(c) - c_dir = c_script.dir - - # Make c_dir a string. - c_dir = str(c_dir) - - # Use build_dir differently depending on where the SConscript is. - if not ec.RelativePath('$TARGET_ROOT', c_dir).startswith('..'): - # The above expression means: if c_dir is $TARGET_ROOT or anything - # under it. Going from c_dir to $TARGET_ROOT and dropping the not fails - # to include $TARGET_ROOT. - # We want to be able to allow people to use addRepository to back things - # under $TARGET_ROOT/$OBJ_ROOT with things from above the current - # directory. When we are passed a SConscript that is already under - # $TARGET_ROOT, we should not use build_dir. - ec.SConscript(c_script, exports={'env': ec}, duplicate=0) - elif not ec.RelativePath('$MAIN_DIR', c_dir).startswith('..'): - # The above expression means: if c_dir is $MAIN_DIR or anything - # under it. Going from c_dir to $TARGET_ROOT and dropping the not fails - # to include $MAIN_DIR. - # Also, if we are passed a SConscript that - # is not under $MAIN_DIR, we should fail loudly, because it is unclear how - # this will correspond to things under $OBJ_ROOT. - ec.SConscript(c_script, build_dir='$OBJ_ROOT/' + c_dir, - exports={'env': ec}, duplicate=0) - else: - raise SCons.Error.UserError( - 'Bad location for a SConscript. "%s" is not under ' - '\$TARGET_ROOT or \$MAIN_DIR' % c_script) - - -def BuildEnvironments(environments): - """Build a collection of SConscripts under a collection of environments. - - Only environments with HOST_PLATFORMS containing the platform specified by - --host-platform (or the native host platform, if --host-platform was not - specified) will be matched. - - Each matching environment is checked against the modes passed to the --mode - command line argument (or 'default', if no mode(s) were specified). If any - of the modes match the environment's BUILD_TYPE or any of the environment's - BUILD_GROUPS, all the BUILD_SCONSCRIPTS (and for legacy reasons, - BUILD_COMPONENTS) in that environment will be built. - - Args: - environments: List of SCons environments. - - Returns: - List of environments which were actually evaluated (built). - """ - # Get options - build_modes = SCons.Script.GetOption('build_mode') - # TODO(rspangler): Remove support legacy MODE= argument, once everyone has - # transitioned to --mode. - legacy_mode_option = SCons.Script.ARGUMENTS.get('MODE') - if legacy_mode_option: - build_modes = legacy_mode_option - build_modes = build_modes.split(',') - - host_platform = SCons.Script.GetOption('host_platform') - if not host_platform: - host_platform = _HostPlatform() - - # Check build modes - _CheckBuildModes(build_modes, environments, host_platform) - - environments_to_evaluate = [] - for e in environments: - if not e.Overlap(e['HOST_PLATFORMS'], [host_platform, '*']): - continue # Environment requires a host platform which isn't us - - if e.Overlap([e['BUILD_TYPE'], e['BUILD_GROUPS']], build_modes): - environments_to_evaluate.append(e) - - for e in environments_to_evaluate: - # Make this the root environment for deferred functions, so they don't - # execute until our call to ExecuteDefer(). - e.SetDeferRoot() - - # Defer building the SConscripts, so that other tools can do - # per-environment setup first. - e.Defer(BuildEnvironmentSConscripts) - - # Execute deferred functions - e.ExecuteDefer() - - # Add help on targets. - AddTargetHelp() - - # Return list of environments actually evaluated - return environments_to_evaluate - - -#------------------------------------------------------------------------------ - - -def _ToolExists(): - """Replacement for SCons tool module exists() function, if one isn't present. - - Returns: - True. This enables modules which always exist not to need to include a - dummy exists() function. - """ - return True - - -def _ToolModule(self): - """Thunk for SCons.Tool.Tool._tool_module to patch in exists() function. - - Returns: - The module from the original SCons.Tool.Tool._tool_module call, with an - exists() method added if it wasn't present. - """ - module = self._tool_module_orig() - if not hasattr(module, 'exists'): - module.exists = _ToolExists - - return module - -#------------------------------------------------------------------------------ - - -def AddSiteDir(site_dir): - """Adds a site directory, as if passed to the --site-dir option. - - Args: - site_dir: Site directory path to add, relative to the location of the - SConstruct file. - - This may be called from the SConscript file to add a local site scons - directory for a project. This does the following: - * Adds site_dir/site_scons to sys.path. - * Imports site_dir/site_init.py. - * Adds site_dir/site_scons to the SCons tools path. - """ - # Call the same function that SCons does for the --site-dir option. - SCons.Script.Main._load_site_scons_dir( - SCons.Node.FS.get_default_fs().SConstruct_dir, site_dir) - - -#------------------------------------------------------------------------------ - - -_new_options_help = ''' -Additional options for SCons: - - --mode=MODE Specify build mode (see below). - --host-platform=PLATFORM Force SCons to use PLATFORM as the host platform, - instead of the actual platform on which SCons is - run. Useful for examining the dependency tree - which would be created, but not useful for - actually running the build because it'll attempt - to use the wrong tools for your actual platform. - --site-path=DIRLIST Comma-separated list of additional site - directory paths; each is processed as if passed - to --site-dir. -''' - -def SiteInitMain(): - """Main code executed in site_init.""" - - # Bail out if we've been here before. This is needed to handle the case where - # this site_init.py has been dropped into a project directory. - if hasattr(__builtin__, 'BuildEnvironments'): - return - - # Let people use new global methods directly. - __builtin__.AddSiteDir = AddSiteDir - __builtin__.BuildEnvironments = BuildEnvironments - # Legacy method names - # TODO(rspangler): Remove these once they're no longer used anywhere. - __builtin__.BuildComponents = BuildEnvironments - - - # Set list of default tools for component_setup - __builtin__.component_setup_tools = [ - # Defer must be first so other tools can register environment - # setup/cleanup functions. - 'defer', - # Component_targets must precede component_builders so builders can - # define target groups. - 'component_targets', - 'command_output', - 'component_bits', - 'component_builders', - 'concat_source', - 'environment_tools', - 'publish', - 'replicate', - ] - - # Patch Tool._tool_module method to fill in an exists() method for the - # module if it isn't present. - # TODO(sgk): This functionality should be patched into SCons itself by - # changing Tool.__init__(). - SCons.Tool.Tool._tool_module_orig = SCons.Tool.Tool._tool_module - SCons.Tool.Tool._tool_module = _ToolModule - - # Add our options - SCons.Script.AddOption( - '--mode', '--build-mode', - dest='build_mode', - nargs=1, type='string', - action='store', - metavar='MODE', - default='default', - help='build mode(s)') - SCons.Script.AddOption( - '--host-platform', - dest='host_platform', - nargs=1, type='string', - action='store', - metavar='PLATFORM', - help='build mode(s)') - SCons.Script.AddOption( - '--site-path', - dest='site_path', - nargs=1, type='string', - action='store', - metavar='PATH', - help='comma-separated list of site directories') - - SCons.Script.Help(_new_options_help) - - # Check for site path. This is a list of site directories which each are - # processed as if they were passed to --site-dir. - site_path = SCons.Script.GetOption('site_path') - if site_path: - for site_dir in site_path.split(','): - AddSiteDir(site_dir) - - # Since our site dir was specified on the SCons command line, SCons will - # normally only look at our site dir. Add back checking for project-local - # site_scons directories. - if not SCons.Script.GetOption('no_site_dir'): - SCons.Script.Main._load_site_scons_dir( - SCons.Node.FS.get_default_fs().SConstruct_dir, None) - -# Run main code -SiteInitMain() |