diff options
Diffstat (limited to 'site_scons/site_tools/environment_tools.py')
-rw-r--r-- | site_scons/site_tools/environment_tools.py | 284 |
1 files changed, 0 insertions, 284 deletions
diff --git a/site_scons/site_tools/environment_tools.py b/site_scons/site_tools/environment_tools.py deleted file mode 100644 index 7672ca1..0000000 --- a/site_scons/site_tools/environment_tools.py +++ /dev/null @@ -1,284 +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. - -"""Set up tools for environments for for software construction toolkit. - -This module is a SCons tool which should be include in all environments. It -will automatically be included by the component_setup tool. -""" - - -import os -import SCons - - -#------------------------------------------------------------------------------ - - -def FilterOut(self, **kw): - """Removes values from existing construction variables in an Environment. - - The values to remove should be a list. For example: - - self.FilterOut(CPPDEFINES=['REMOVE_ME', 'ME_TOO']) - - Args: - self: Environment to alter. - kw: (Any other named arguments are values to remove). - """ - - kw = SCons.Environment.copy_non_reserved_keywords(kw) - for key, val in kw.items(): - envval = self.get(key, None) - if envval is None: - # No existing variable in the environment, so nothing to delete. - continue - - for vremove in val: - # Use while not if, so we can handle duplicates. - while vremove in envval: - envval.remove(vremove) - - self[key] = envval - - # TODO(sgk): SCons.Environment.Append() has much more logic to deal - # with various types of values. We should handle all those cases in here - # too. (If variable is a dict, etc.) - -#------------------------------------------------------------------------------ - - -def Overlap(self, values1, values2): - """Checks for overlap between the values. - - Args: - self: Environment to use for variable substitution. - values1: First value(s) to compare. May be a string or list of strings. - values2: Second value(s) to compare. May be a string or list of strings. - - Returns: - The list of values in common after substitution, or an empty list if - the values do not overlap. - - Converts the values to a set of plain strings via self.SubstList2() before - comparison, so SCons $ variables are evaluated. - """ - set1 = set(self.SubstList2(values1)) - set2 = set(self.SubstList2(values2)) - return list(set1.intersection(set2)) - -#------------------------------------------------------------------------------ - - -def ApplySConscript(self, sconscript_file): - """Applies a SConscript to the current environment. - - Args: - self: Environment to modify. - sconscript_file: Name of SConscript file to apply. - - Returns: - The return value from the call to SConscript(). - - ApplySConscript() should be used when an existing SConscript which sets up an - environment gets too large, or when there is common setup between multiple - environments which can't be reduced into a parent environment which the - multiple child environments Clone() from. The latter case is necessary - because env.Clone() only enables single inheritance for environments. - - ApplySConscript() is NOT intended to replace the Tool() method. If you need - to add methods or builders to one or more environments, do that as a tool - (and write unit tests for them). - - ApplySConscript() is equivalent to the following SCons call: - SConscript(sconscript_file, exports={'env':self}) - - The called SConscript should import the 'env' variable to get access to the - calling environment: - Import('env') - - Changes made to env in the called SConscript will be applied to the - environment calling ApplySConscript() - that is, env in the called SConscript - is a reference to the calling environment. - - If you need to export multiple variables to the called SConscript, or return - variables from it, use the existing SConscript() function. - """ - return self.SConscript(sconscript_file, exports={'env': self}) - -#------------------------------------------------------------------------------ - - -def BuildSConscript(self, sconscript_file): - """Builds a SConscript based on the current environment. - - Args: - self: Environment to clone and pass to the called SConscript. - sconscript_file: Name of SConscript file to build. If this is a directory, - this method will look for sconscript_file+'/build.scons', and if that - is not found, sconscript_file+'/SConscript'. - - Returns: - The return value from the call to SConscript(). - - BuildSConscript() should be used when an existing SConscript which builds a - project gets too large, or when a group of SConscripts are logically related - but should not directly affect each others' environments (for example, a - library might want to build a number of unit tests which exist in - subdirectories, but not allow those tests' SConscripts to affect/pollute the - library's environment. - - BuildSConscript() is NOT intended to replace the Tool() method. If you need - to add methods or builders to one or more environments, do that as a tool - (and write unit tests for them). - - BuildSConscript() is equivalent to the following SCons call: - SConscript(sconscript_file, exports={'env':self.Clone()}) - or if sconscript_file is a directory: - SConscript(sconscript_file+'/build.scons', exports={'env':self.Clone()}) - - The called SConscript should import the 'env' variable to get access to the - calling environment: - Import('env') - - Changes made to env in the called SConscript will NOT be applied to the - environment calling BuildSConscript() - that is, env in the called SConscript - is a clone/copy of the calling environment, not a reference to that - environment. - - If you need to export multiple variables to the called SConscript, or return - variables from it, use the existing SConscript() function. - """ - # Need to look for the source node, since by default SCons will look for the - # entry in the variant_dir, which won't exist (and thus won't be a directory - # or a file). This isn't a problem in BuildComponents(), since the variant - # dir is only set inside its call to SConscript(). - if self.Entry(sconscript_file).srcnode().isdir(): - # Building a subdirectory, so look for build.scons or SConscript - script_file = sconscript_file + '/build.scons' - if not self.File(script_file).srcnode().exists(): - script_file = sconscript_file + '/SConscript' - else: - script_file = sconscript_file - - self.SConscript(script_file, exports={'env': self.Clone()}) - -#------------------------------------------------------------------------------ - - -def SubstList2(self, *args): - """Replacement subst_list designed for flags/parameters, not command lines. - - Args: - self: Environment context. - args: One or more strings or lists of strings. - - Returns: - A flattened, substituted list of strings. - - SCons's built-in subst_list evaluates (substitutes) variables in its - arguments, and returns a list of lists (one per positional argument). Since - it is designed for use in command line expansion, the list items are - SCons.Subst.CmdStringHolder instances. These instances can't be passed into - env.File() (or subsequent calls to env.subst(), either). The returned - nested lists also need to be flattened via env.Flatten() before the caller - can iterate over the contents. - - SubstList2() does a subst_list, flattens the result, then maps the flattened - list to strings. - - It is better to do: - for x in env.SubstList2('$MYPARAMS'): - than to do: - for x in env.get('MYPARAMS', []): - and definitely better than: - for x in env['MYPARAMS']: - which will throw an exception if MYPARAMS isn't defined. - """ - return map(str, self.Flatten(self.subst_list(args))) - - -#------------------------------------------------------------------------------ - - -def RelativePath(self, source, target, sep=os.sep, source_is_file=False): - """Calculates the relative path from source to target. - - Args: - self: Environment context. - source: Source path or node. - target: Target path or node. - sep: Path separator to use in returned relative path. - source_is_file: If true, calculates the relative path from the directory - containing the source, rather than the source itself. Note that if - source is a node, you can pass in source.dir instead, which is shorter. - - Returns: - The relative path from source to target. - """ - # Split source and target into list of directories - source = self.Entry(str(source)) - if source_is_file: - source = source.dir - source = source.abspath.split(os.sep) - target = self.Entry(str(target)).abspath.split(os.sep) - - # Handle source and target identical - if source == target: - if source_is_file: - return source[-1] # Bare filename - else: - return '.' # Directory pointing to itself - - # TODO(rspangler): Handle UNC paths and drive letters (fine if they're the - # same, but if they're different, there IS no relative path) - - # Remove common elements - while source and target and source[0] == target[0]: - source.pop(0) - target.pop(0) - # Join the remaining elements - return sep.join(['..'] * len(source) + target) - - -#------------------------------------------------------------------------------ - - -def generate(env): - # NOTE: SCons requires the use of this name, which fails gpylint. - """SCons entry point for this tool.""" - - # Add methods to environment - env.AddMethod(ApplySConscript) - env.AddMethod(BuildSConscript) - env.AddMethod(FilterOut) - env.AddMethod(Overlap) - env.AddMethod(RelativePath) - env.AddMethod(SubstList2) |