Index: scons-2.0.1/engine/SCons/Script/__init__.py |
=================================================================== |
--- scons-2.0.1/engine/SCons/Script/__init__.py (revision 0) |
+++ scons-2.0.1/engine/SCons/Script/__init__.py (revision 0) |
@@ -0,0 +1,412 @@ |
+"""SCons.Script |
+ |
+This file implements the main() function used by the scons script. |
+ |
+Architecturally, this *is* the scons script, and will likely only be |
+called from the external "scons" wrapper. Consequently, anything here |
+should not be, or be considered, part of the build engine. If it's |
+something that we expect other software to want to use, it should go in |
+some other module. If it's specific to the "scons" script invocation, |
+it goes here. |
+ |
+""" |
+ |
+# |
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation |
+# |
+# Permission is hereby granted, free of charge, to any person obtaining |
+# a copy of this software and associated documentation files (the |
+# "Software"), to deal in the Software without restriction, including |
+# without limitation the rights to use, copy, modify, merge, publish, |
+# distribute, sublicense, and/or sell copies of the Software, and to |
+# permit persons to whom the Software is furnished to do so, subject to |
+# the following conditions: |
+# |
+# The above copyright notice and this permission notice shall be included |
+# in all copies or substantial portions of the Software. |
+# |
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY |
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE |
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
+# |
+ |
+__revision__ = "src/engine/SCons/Script/__init__.py 5134 2010/08/16 23:02:40 bdeegan" |
+ |
+import time |
+start_time = time.time() |
+ |
+import collections |
+import os |
+import sys |
+ |
+# Special chicken-and-egg handling of the "--debug=memoizer" flag: |
+# |
+# SCons.Memoize contains a metaclass implementation that affects how |
+# the other classes are instantiated. The Memoizer may add shim methods |
+# to classes that have methods that cache computed values in order to |
+# count and report the hits and misses. |
+# |
+# If we wait to enable the Memoization until after we've parsed the |
+# command line options normally, it will be too late, because the Memoizer |
+# will have already analyzed the classes that it's Memoizing and decided |
+# to not add the shims. So we use a special-case, up-front check for |
+# the "--debug=memoizer" flag and enable Memoizer before we import any |
+# of the other modules that use it. |
+ |
+_args = sys.argv + os.environ.get('SCONSFLAGS', '').split() |
+if "--debug=memoizer" in _args: |
+ import SCons.Memoize |
+ import SCons.Warnings |
+ try: |
+ SCons.Memoize.EnableMemoization() |
+ except SCons.Warnings.Warning: |
+ # Some warning was thrown. Arrange for it to be displayed |
+ # or not after warnings are configured. |
+ import Main |
+ exc_type, exc_value, tb = sys.exc_info() |
+ Main.delayed_warnings.append((exc_type, exc_value)) |
+del _args |
+ |
+import SCons.Action |
+import SCons.Builder |
+import SCons.Environment |
+import SCons.Node.FS |
+import SCons.Options |
+import SCons.Platform |
+import SCons.Scanner |
+import SCons.SConf |
+import SCons.Subst |
+import SCons.Tool |
+import SCons.Util |
+import SCons.Variables |
+import SCons.Defaults |
+ |
+import Main |
+ |
+main = Main.main |
+ |
+# The following are global class definitions and variables that used to |
+# live directly in this module back before 0.96.90, when it contained |
+# a lot of code. Some SConscript files in widely-distributed packages |
+# (Blender is the specific example) actually reached into SCons.Script |
+# directly to use some of these. Rather than break those SConscript |
+# files, we're going to propagate these names into the SCons.Script |
+# namespace here. |
+# |
+# Some of these are commented out because it's *really* unlikely anyone |
+# used them, but we're going to leave the comment here to try to make |
+# it obvious what to do if the situation arises. |
+BuildTask = Main.BuildTask |
+CleanTask = Main.CleanTask |
+QuestionTask = Main.QuestionTask |
+#PrintHelp = Main.PrintHelp |
+#SConscriptSettableOptions = Main.SConscriptSettableOptions |
+ |
+AddOption = Main.AddOption |
+GetOption = Main.GetOption |
+SetOption = Main.SetOption |
+Progress = Main.Progress |
+GetBuildFailures = Main.GetBuildFailures |
+ |
+#keep_going_on_error = Main.keep_going_on_error |
+#print_dtree = Main.print_dtree |
+#print_explanations = Main.print_explanations |
+#print_includes = Main.print_includes |
+#print_objects = Main.print_objects |
+#print_time = Main.print_time |
+#print_tree = Main.print_tree |
+#memory_stats = Main.memory_stats |
+#ignore_errors = Main.ignore_errors |
+#sconscript_time = Main.sconscript_time |
+#command_time = Main.command_time |
+#exit_status = Main.exit_status |
+#profiling = Main.profiling |
+#repositories = Main.repositories |
+ |
+# |
+import SConscript |
+_SConscript = SConscript |
+ |
+call_stack = _SConscript.call_stack |
+ |
+# |
+Action = SCons.Action.Action |
+AddMethod = SCons.Util.AddMethod |
+AllowSubstExceptions = SCons.Subst.SetAllowableExceptions |
+Builder = SCons.Builder.Builder |
+Configure = _SConscript.Configure |
+Environment = SCons.Environment.Environment |
+#OptParser = SCons.SConsOptions.OptParser |
+FindPathDirs = SCons.Scanner.FindPathDirs |
+Platform = SCons.Platform.Platform |
+Return = _SConscript.Return |
+Scanner = SCons.Scanner.Base |
+Tool = SCons.Tool.Tool |
+WhereIs = SCons.Util.WhereIs |
+ |
+# |
+BoolVariable = SCons.Variables.BoolVariable |
+EnumVariable = SCons.Variables.EnumVariable |
+ListVariable = SCons.Variables.ListVariable |
+PackageVariable = SCons.Variables.PackageVariable |
+PathVariable = SCons.Variables.PathVariable |
+ |
+# Deprecated names that will go away some day. |
+BoolOption = SCons.Options.BoolOption |
+EnumOption = SCons.Options.EnumOption |
+ListOption = SCons.Options.ListOption |
+PackageOption = SCons.Options.PackageOption |
+PathOption = SCons.Options.PathOption |
+ |
+# Action factories. |
+Chmod = SCons.Defaults.Chmod |
+Copy = SCons.Defaults.Copy |
+Delete = SCons.Defaults.Delete |
+Mkdir = SCons.Defaults.Mkdir |
+Move = SCons.Defaults.Move |
+Touch = SCons.Defaults.Touch |
+ |
+# Pre-made, public scanners. |
+CScanner = SCons.Tool.CScanner |
+DScanner = SCons.Tool.DScanner |
+DirScanner = SCons.Defaults.DirScanner |
+ProgramScanner = SCons.Tool.ProgramScanner |
+SourceFileScanner = SCons.Tool.SourceFileScanner |
+ |
+# Functions we might still convert to Environment methods. |
+CScan = SCons.Defaults.CScan |
+DefaultEnvironment = SCons.Defaults.DefaultEnvironment |
+ |
+# Other variables we provide. |
+class TargetList(collections.UserList): |
+ def _do_nothing(self, *args, **kw): |
+ pass |
+ def _add_Default(self, list): |
+ self.extend(list) |
+ def _clear(self): |
+ del self[:] |
+ |
+ARGUMENTS = {} |
+ARGLIST = [] |
+BUILD_TARGETS = TargetList() |
+COMMAND_LINE_TARGETS = [] |
+DEFAULT_TARGETS = [] |
+ |
+# BUILD_TARGETS can be modified in the SConscript files. If so, we |
+# want to treat the modified BUILD_TARGETS list as if they specified |
+# targets on the command line. To do that, though, we need to know if |
+# BUILD_TARGETS was modified through "official" APIs or by hand. We do |
+# this by updating two lists in parallel, the documented BUILD_TARGETS |
+# list, above, and this internal _build_plus_default targets list which |
+# should only have "official" API changes. Then Script/Main.py can |
+# compare these two afterwards to figure out if the user added their |
+# own targets to BUILD_TARGETS. |
+_build_plus_default = TargetList() |
+ |
+def _Add_Arguments(alist): |
+ for arg in alist: |
+ a, b = arg.split('=', 1) |
+ ARGUMENTS[a] = b |
+ ARGLIST.append((a, b)) |
+ |
+def _Add_Targets(tlist): |
+ if tlist: |
+ COMMAND_LINE_TARGETS.extend(tlist) |
+ BUILD_TARGETS.extend(tlist) |
+ BUILD_TARGETS._add_Default = BUILD_TARGETS._do_nothing |
+ BUILD_TARGETS._clear = BUILD_TARGETS._do_nothing |
+ _build_plus_default.extend(tlist) |
+ _build_plus_default._add_Default = _build_plus_default._do_nothing |
+ _build_plus_default._clear = _build_plus_default._do_nothing |
+ |
+def _Set_Default_Targets_Has_Been_Called(d, fs): |
+ return DEFAULT_TARGETS |
+ |
+def _Set_Default_Targets_Has_Not_Been_Called(d, fs): |
+ if d is None: |
+ d = [fs.Dir('.')] |
+ return d |
+ |
+_Get_Default_Targets = _Set_Default_Targets_Has_Not_Been_Called |
+ |
+def _Set_Default_Targets(env, tlist): |
+ global DEFAULT_TARGETS |
+ global _Get_Default_Targets |
+ _Get_Default_Targets = _Set_Default_Targets_Has_Been_Called |
+ for t in tlist: |
+ if t is None: |
+ # Delete the elements from the list in-place, don't |
+ # reassign an empty list to DEFAULT_TARGETS, so that the |
+ # variables will still point to the same object we point to. |
+ del DEFAULT_TARGETS[:] |
+ BUILD_TARGETS._clear() |
+ _build_plus_default._clear() |
+ elif isinstance(t, SCons.Node.Node): |
+ DEFAULT_TARGETS.append(t) |
+ BUILD_TARGETS._add_Default([t]) |
+ _build_plus_default._add_Default([t]) |
+ else: |
+ nodes = env.arg2nodes(t, env.fs.Entry) |
+ DEFAULT_TARGETS.extend(nodes) |
+ BUILD_TARGETS._add_Default(nodes) |
+ _build_plus_default._add_Default(nodes) |
+ |
+# |
+help_text = None |
+ |
+def HelpFunction(text): |
+ global help_text |
+ if SCons.Script.help_text is None: |
+ SCons.Script.help_text = text |
+ else: |
+ help_text = help_text + text |
+ |
+# |
+# Will be non-zero if we are reading an SConscript file. |
+sconscript_reading = 0 |
+ |
+# |
+def Variables(files=[], args=ARGUMENTS): |
+ return SCons.Variables.Variables(files, args) |
+ |
+def Options(files=[], args=ARGUMENTS): |
+ return SCons.Options.Options(files, args) |
+ |
+# The list of global functions to add to the SConscript name space |
+# that end up calling corresponding methods or Builders in the |
+# DefaultEnvironment(). |
+GlobalDefaultEnvironmentFunctions = [ |
+ # Methods from the SConsEnvironment class, above. |
+ 'Default', |
+ 'EnsurePythonVersion', |
+ 'EnsureSConsVersion', |
+ 'Exit', |
+ 'Export', |
+ 'GetLaunchDir', |
+ 'Help', |
+ 'Import', |
+ #'SConscript', is handled separately, below. |
+ 'SConscriptChdir', |
+ |
+ # Methods from the Environment.Base class. |
+ 'AddPostAction', |
+ 'AddPreAction', |
+ 'Alias', |
+ 'AlwaysBuild', |
+ 'BuildDir', |
+ 'CacheDir', |
+ 'Clean', |
+ #The Command() method is handled separately, below. |
+ 'Decider', |
+ 'Depends', |
+ 'Dir', |
+ 'NoClean', |
+ 'NoCache', |
+ 'Entry', |
+ 'Execute', |
+ 'File', |
+ 'FindFile', |
+ 'FindInstalledFiles', |
+ 'FindSourceFiles', |
+ 'Flatten', |
+ 'GetBuildPath', |
+ 'Glob', |
+ 'Ignore', |
+ 'Install', |
+ 'InstallAs', |
+ 'Literal', |
+ 'Local', |
+ 'ParseDepends', |
+ 'Precious', |
+ 'Repository', |
+ 'Requires', |
+ 'SConsignFile', |
+ 'SideEffect', |
+ 'SourceCode', |
+ 'SourceSignatures', |
+ 'Split', |
+ 'Tag', |
+ 'TargetSignatures', |
+ 'Value', |
+ 'VariantDir', |
+] |
+ |
+GlobalDefaultBuilders = [ |
+ # Supported builders. |
+ 'CFile', |
+ 'CXXFile', |
+ 'DVI', |
+ 'Jar', |
+ 'Java', |
+ 'JavaH', |
+ 'Library', |
+ 'M4', |
+ 'MSVSProject', |
+ 'Object', |
+ 'PCH', |
+ 'PDF', |
+ 'PostScript', |
+ 'Program', |
+ 'RES', |
+ 'RMIC', |
+ 'SharedLibrary', |
+ 'SharedObject', |
+ 'StaticLibrary', |
+ 'StaticObject', |
+ 'Tar', |
+ 'TypeLibrary', |
+ 'Zip', |
+ 'Package', |
+] |
+ |
+for name in GlobalDefaultEnvironmentFunctions + GlobalDefaultBuilders: |
+ exec "%s = _SConscript.DefaultEnvironmentCall(%s)" % (name, repr(name)) |
+del name |
+ |
+# There are a handful of variables that used to live in the |
+# Script/SConscript.py module that some SConscript files out there were |
+# accessing directly as SCons.Script.SConscript.*. The problem is that |
+# "SConscript" in this namespace is no longer a module, it's a global |
+# function call--or more precisely, an object that implements a global |
+# function call through the default Environment. Nevertheless, we can |
+# maintain backwards compatibility for SConscripts that were reaching in |
+# this way by hanging some attributes off the "SConscript" object here. |
+SConscript = _SConscript.DefaultEnvironmentCall('SConscript') |
+ |
+# Make SConscript look enough like the module it used to be so |
+# that pychecker doesn't barf. |
+SConscript.__name__ = 'SConscript' |
+ |
+SConscript.Arguments = ARGUMENTS |
+SConscript.ArgList = ARGLIST |
+SConscript.BuildTargets = BUILD_TARGETS |
+SConscript.CommandLineTargets = COMMAND_LINE_TARGETS |
+SConscript.DefaultTargets = DEFAULT_TARGETS |
+ |
+# The global Command() function must be handled differently than the |
+# global functions for other construction environment methods because |
+# we want people to be able to use Actions that must expand $TARGET |
+# and $SOURCE later, when (and if) the Action is invoked to build |
+# the target(s). We do this with the subst=1 argument, which creates |
+# a DefaultEnvironmentCall instance that wraps up a normal default |
+# construction environment that performs variable substitution, not a |
+# proxy that doesn't. |
+# |
+# There's a flaw here, though, because any other $-variables on a command |
+# line will *also* be expanded, each to a null string, but that should |
+# only be a problem in the unusual case where someone was passing a '$' |
+# on a command line and *expected* the $ to get through to the shell |
+# because they were calling Command() and not env.Command()... This is |
+# unlikely enough that we're going to leave this as is and cross that |
+# bridge if someone actually comes to it. |
+Command = _SConscript.DefaultEnvironmentCall('Command', subst=1) |
+ |
+# Local Variables: |
+# tab-width:4 |
+# indent-tabs-mode:nil |
+# End: |
+# vim: set expandtab tabstop=4 shiftwidth=4: |
Property changes on: scons-2.0.1/engine/SCons/Script/__init__.py |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |