Package SCons :: Package Script
[hide private]
[frames] | no frames]

Source Code for Package SCons.Script

  1  """SCons.Script 
  2   
  3  This file implements the main() function used by the scons script. 
  4   
  5  Architecturally, this *is* the scons script, and will likely only be 
  6  called from the external "scons" wrapper.  Consequently, anything here 
  7  should not be, or be considered, part of the build engine.  If it's 
  8  something that we expect other software to want to use, it should go in 
  9  some other module.  If it's specific to the "scons" script invocation, 
 10  it goes here. 
 11   
 12  """ 
 13   
 14  # 
 15  # Copyright (c) 2001 - 2015 The SCons Foundation 
 16  # 
 17  # Permission is hereby granted, free of charge, to any person obtaining 
 18  # a copy of this software and associated documentation files (the 
 19  # "Software"), to deal in the Software without restriction, including 
 20  # without limitation the rights to use, copy, modify, merge, publish, 
 21  # distribute, sublicense, and/or sell copies of the Software, and to 
 22  # permit persons to whom the Software is furnished to do so, subject to 
 23  # the following conditions: 
 24  # 
 25  # The above copyright notice and this permission notice shall be included 
 26  # in all copies or substantial portions of the Software. 
 27  # 
 28  # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY 
 29  # KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE 
 30  # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
 31  # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
 32  # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
 33  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
 34  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
 35  # 
 36   
 37  __revision__ = "src/engine/SCons/Script/__init__.py rel_2.4.1:3453:73fefd3ea0b0 2015/11/09 03:25:05 bdbaddog" 
 38   
 39  import time 
 40  start_time = time.time() 
 41   
 42  import collections 
 43  import os 
 44  import StringIO 
 45  import sys 
 46   
 47  # Special chicken-and-egg handling of the "--debug=memoizer" flag: 
 48  # 
 49  # SCons.Memoize contains a metaclass implementation that affects how 
 50  # the other classes are instantiated.  The Memoizer may add shim methods 
 51  # to classes that have methods that cache computed values in order to 
 52  # count and report the hits and misses. 
 53  # 
 54  # If we wait to enable the Memoization until after we've parsed the 
 55  # command line options normally, it will be too late, because the Memoizer 
 56  # will have already analyzed the classes that it's Memoizing and decided 
 57  # to not add the shims.  So we use a special-case, up-front check for 
 58  # the "--debug=memoizer" flag and enable Memoizer before we import any 
 59  # of the other modules that use it. 
 60   
 61  _args = sys.argv + os.environ.get('SCONSFLAGS', '').split() 
 62  if "--debug=memoizer" in _args: 
 63      import SCons.Memoize 
 64      import SCons.Warnings 
 65      try: 
 66          SCons.Memoize.EnableMemoization() 
 67      except SCons.Warnings.Warning: 
 68          # Some warning was thrown.  Arrange for it to be displayed 
 69          # or not after warnings are configured. 
 70          import Main 
 71          exc_type, exc_value, tb = sys.exc_info() 
 72          Main.delayed_warnings.append((exc_type, exc_value)) 
 73  del _args 
 74   
 75  import SCons.Action 
 76  import SCons.Builder 
 77  import SCons.Environment 
 78  import SCons.Node.FS 
 79  import SCons.Options 
 80  import SCons.Platform 
 81  import SCons.Scanner 
 82  import SCons.SConf 
 83  import SCons.Subst 
 84  import SCons.Tool 
 85  import SCons.Util 
 86  import SCons.Variables 
 87  import SCons.Defaults 
 88   
 89  import Main 
 90   
 91  main                    = Main.main 
 92   
 93  # The following are global class definitions and variables that used to 
 94  # live directly in this module back before 0.96.90, when it contained 
 95  # a lot of code.  Some SConscript files in widely-distributed packages 
 96  # (Blender is the specific example) actually reached into SCons.Script 
 97  # directly to use some of these.  Rather than break those SConscript 
 98  # files, we're going to propagate these names into the SCons.Script 
 99  # namespace here. 
100  # 
101  # Some of these are commented out because it's *really* unlikely anyone 
102  # used them, but we're going to leave the comment here to try to make 
103  # it obvious what to do if the situation arises. 
104  BuildTask               = Main.BuildTask 
105  CleanTask               = Main.CleanTask 
106  QuestionTask            = Main.QuestionTask 
107  #PrintHelp               = Main.PrintHelp 
108  #SConscriptSettableOptions = Main.SConscriptSettableOptions 
109   
110  AddOption               = Main.AddOption 
111  PrintHelp               = Main.PrintHelp 
112  GetOption               = Main.GetOption 
113  SetOption               = Main.SetOption 
114  Progress                = Main.Progress 
115  GetBuildFailures        = Main.GetBuildFailures 
116   
117  #keep_going_on_error     = Main.keep_going_on_error 
118  #print_dtree             = Main.print_dtree 
119  #print_explanations      = Main.print_explanations 
120  #print_includes          = Main.print_includes 
121  #print_objects           = Main.print_objects 
122  #print_time              = Main.print_time 
123  #print_tree              = Main.print_tree 
124  #memory_stats            = Main.memory_stats 
125  #ignore_errors           = Main.ignore_errors 
126  #sconscript_time         = Main.sconscript_time 
127  #command_time            = Main.command_time 
128  #exit_status             = Main.exit_status 
129  #profiling               = Main.profiling 
130  #repositories            = Main.repositories 
131   
132  # 
133  import SConscript 
134  _SConscript = SConscript 
135   
136  call_stack              = _SConscript.call_stack 
137   
138  # 
139  Action                  = SCons.Action.Action 
140  AddMethod               = SCons.Util.AddMethod 
141  AllowSubstExceptions    = SCons.Subst.SetAllowableExceptions 
142  Builder                 = SCons.Builder.Builder 
143  Configure               = _SConscript.Configure 
144  Environment             = SCons.Environment.Environment 
145  #OptParser               = SCons.SConsOptions.OptParser 
146  FindPathDirs            = SCons.Scanner.FindPathDirs 
147  Platform                = SCons.Platform.Platform 
148  Return                  = _SConscript.Return 
149  Scanner                 = SCons.Scanner.Base 
150  Tool                    = SCons.Tool.Tool 
151  WhereIs                 = SCons.Util.WhereIs 
152   
153  # 
154  BoolVariable            = SCons.Variables.BoolVariable 
155  EnumVariable            = SCons.Variables.EnumVariable 
156  ListVariable            = SCons.Variables.ListVariable 
157  PackageVariable         = SCons.Variables.PackageVariable 
158  PathVariable            = SCons.Variables.PathVariable 
159   
160  # Deprecated names that will go away some day. 
161  BoolOption              = SCons.Options.BoolOption 
162  EnumOption              = SCons.Options.EnumOption 
163  ListOption              = SCons.Options.ListOption 
164  PackageOption           = SCons.Options.PackageOption 
165  PathOption              = SCons.Options.PathOption 
166   
167  # Action factories. 
168  Chmod                   = SCons.Defaults.Chmod 
169  Copy                    = SCons.Defaults.Copy 
170  Delete                  = SCons.Defaults.Delete 
171  Mkdir                   = SCons.Defaults.Mkdir 
172  Move                    = SCons.Defaults.Move 
173  Touch                   = SCons.Defaults.Touch 
174   
175  # Pre-made, public scanners. 
176  CScanner                = SCons.Tool.CScanner 
177  DScanner                = SCons.Tool.DScanner 
178  DirScanner              = SCons.Defaults.DirScanner 
179  ProgramScanner          = SCons.Tool.ProgramScanner 
180  SourceFileScanner       = SCons.Tool.SourceFileScanner 
181   
182  # Functions we might still convert to Environment methods. 
183  CScan                   = SCons.Defaults.CScan 
184  DefaultEnvironment      = SCons.Defaults.DefaultEnvironment 
185   
186  # Other variables we provide. 
187 -class TargetList(collections.UserList):
188 - def _do_nothing(self, *args, **kw):
189 pass
190 - def _add_Default(self, list):
191 self.extend(list)
192 - def _clear(self):
193 del self[:]
194 195 ARGUMENTS = {} 196 ARGLIST = [] 197 BUILD_TARGETS = TargetList() 198 COMMAND_LINE_TARGETS = [] 199 DEFAULT_TARGETS = [] 200 201 # BUILD_TARGETS can be modified in the SConscript files. If so, we 202 # want to treat the modified BUILD_TARGETS list as if they specified 203 # targets on the command line. To do that, though, we need to know if 204 # BUILD_TARGETS was modified through "official" APIs or by hand. We do 205 # this by updating two lists in parallel, the documented BUILD_TARGETS 206 # list, above, and this internal _build_plus_default targets list which 207 # should only have "official" API changes. Then Script/Main.py can 208 # compare these two afterwards to figure out if the user added their 209 # own targets to BUILD_TARGETS. 210 _build_plus_default = TargetList() 211
212 -def _Add_Arguments(alist):
213 for arg in alist: 214 a, b = arg.split('=', 1) 215 ARGUMENTS[a] = b 216 ARGLIST.append((a, b))
217
218 -def _Add_Targets(tlist):
219 if tlist: 220 COMMAND_LINE_TARGETS.extend(tlist) 221 BUILD_TARGETS.extend(tlist) 222 BUILD_TARGETS._add_Default = BUILD_TARGETS._do_nothing 223 BUILD_TARGETS._clear = BUILD_TARGETS._do_nothing 224 _build_plus_default.extend(tlist) 225 _build_plus_default._add_Default = _build_plus_default._do_nothing 226 _build_plus_default._clear = _build_plus_default._do_nothing
227
228 -def _Set_Default_Targets_Has_Been_Called(d, fs):
229 return DEFAULT_TARGETS
230
231 -def _Set_Default_Targets_Has_Not_Been_Called(d, fs):
232 if d is None: 233 d = [fs.Dir('.')] 234 return d
235 236 _Get_Default_Targets = _Set_Default_Targets_Has_Not_Been_Called 237
238 -def _Set_Default_Targets(env, tlist):
239 global DEFAULT_TARGETS 240 global _Get_Default_Targets 241 _Get_Default_Targets = _Set_Default_Targets_Has_Been_Called 242 for t in tlist: 243 if t is None: 244 # Delete the elements from the list in-place, don't 245 # reassign an empty list to DEFAULT_TARGETS, so that the 246 # variables will still point to the same object we point to. 247 del DEFAULT_TARGETS[:] 248 BUILD_TARGETS._clear() 249 _build_plus_default._clear() 250 elif isinstance(t, SCons.Node.Node): 251 DEFAULT_TARGETS.append(t) 252 BUILD_TARGETS._add_Default([t]) 253 _build_plus_default._add_Default([t]) 254 else: 255 nodes = env.arg2nodes(t, env.fs.Entry) 256 DEFAULT_TARGETS.extend(nodes) 257 BUILD_TARGETS._add_Default(nodes) 258 _build_plus_default._add_Default(nodes)
259 260 # 261 help_text = None 262
263 -def HelpFunction(text, append=False):
264 global help_text 265 if help_text is None: 266 if append: 267 s = StringIO.StringIO() 268 PrintHelp(s) 269 help_text = s.getvalue() 270 s.close() 271 else: 272 help_text = "" 273 # 274 # Was in original patch but this text is arbitrary and breaks tests 275 # so I removed it (Deegan) 276 # help_text = help_text + "\nLocal Build Variables:\n" + text 277 # else: 278 # help_text = help_text + text 279 280 help_text= help_text + text
281 282 283 # 284 # Will be non-zero if we are reading an SConscript file. 285 sconscript_reading = 0 286 287 #
288 -def Variables(files=[], args=ARGUMENTS):
289 return SCons.Variables.Variables(files, args)
290
291 -def Options(files=[], args=ARGUMENTS):
292 return SCons.Options.Options(files, args)
293 294 # The list of global functions to add to the SConscript name space 295 # that end up calling corresponding methods or Builders in the 296 # DefaultEnvironment(). 297 GlobalDefaultEnvironmentFunctions = [ 298 # Methods from the SConsEnvironment class, above. 299 'Default', 300 'EnsurePythonVersion', 301 'EnsureSConsVersion', 302 'Exit', 303 'Export', 304 'GetLaunchDir', 305 'Help', 306 'Import', 307 #'SConscript', is handled separately, below. 308 'SConscriptChdir', 309 310 # Methods from the Environment.Base class. 311 'AddPostAction', 312 'AddPreAction', 313 'Alias', 314 'AlwaysBuild', 315 'BuildDir', 316 'CacheDir', 317 'Clean', 318 #The Command() method is handled separately, below. 319 'Decider', 320 'Depends', 321 'Dir', 322 'NoClean', 323 'NoCache', 324 'Entry', 325 'Execute', 326 'File', 327 'FindFile', 328 'FindInstalledFiles', 329 'FindSourceFiles', 330 'Flatten', 331 'GetBuildPath', 332 'Glob', 333 'Ignore', 334 'Install', 335 'InstallAs', 336 'InstallVersionedLib', 337 'Literal', 338 'Local', 339 'ParseDepends', 340 'Precious', 341 'Repository', 342 'Requires', 343 'SConsignFile', 344 'SideEffect', 345 'SourceCode', 346 'SourceSignatures', 347 'Split', 348 'Tag', 349 'TargetSignatures', 350 'Value', 351 'VariantDir', 352 ] 353 354 GlobalDefaultBuilders = [ 355 # Supported builders. 356 'CFile', 357 'CXXFile', 358 'DVI', 359 'Jar', 360 'Java', 361 'JavaH', 362 'Library', 363 'M4', 364 'MSVSProject', 365 'Object', 366 'PCH', 367 'PDF', 368 'PostScript', 369 'Program', 370 'RES', 371 'RMIC', 372 'SharedLibrary', 373 'SharedObject', 374 'StaticLibrary', 375 'StaticObject', 376 'Tar', 377 'TypeLibrary', 378 'Zip', 379 'Package', 380 ] 381 382 for name in GlobalDefaultEnvironmentFunctions + GlobalDefaultBuilders: 383 exec "%s = _SConscript.DefaultEnvironmentCall(%s)" % (name, repr(name)) 384 del name 385 386 # There are a handful of variables that used to live in the 387 # Script/SConscript.py module that some SConscript files out there were 388 # accessing directly as SCons.Script.SConscript.*. The problem is that 389 # "SConscript" in this namespace is no longer a module, it's a global 390 # function call--or more precisely, an object that implements a global 391 # function call through the default Environment. Nevertheless, we can 392 # maintain backwards compatibility for SConscripts that were reaching in 393 # this way by hanging some attributes off the "SConscript" object here. 394 SConscript = _SConscript.DefaultEnvironmentCall('SConscript') 395 396 # Make SConscript look enough like the module it used to be so 397 # that pychecker doesn't barf. 398 SConscript.__name__ = 'SConscript' 399 400 SConscript.Arguments = ARGUMENTS 401 SConscript.ArgList = ARGLIST 402 SConscript.BuildTargets = BUILD_TARGETS 403 SConscript.CommandLineTargets = COMMAND_LINE_TARGETS 404 SConscript.DefaultTargets = DEFAULT_TARGETS 405 406 # The global Command() function must be handled differently than the 407 # global functions for other construction environment methods because 408 # we want people to be able to use Actions that must expand $TARGET 409 # and $SOURCE later, when (and if) the Action is invoked to build 410 # the target(s). We do this with the subst=1 argument, which creates 411 # a DefaultEnvironmentCall instance that wraps up a normal default 412 # construction environment that performs variable substitution, not a 413 # proxy that doesn't. 414 # 415 # There's a flaw here, though, because any other $-variables on a command 416 # line will *also* be expanded, each to a null string, but that should 417 # only be a problem in the unusual case where someone was passing a '$' 418 # on a command line and *expected* the $ to get through to the shell 419 # because they were calling Command() and not env.Command()... This is 420 # unlikely enough that we're going to leave this as is and cross that 421 # bridge if someone actually comes to it. 422 Command = _SConscript.DefaultEnvironmentCall('Command', subst=1) 423 424 # Local Variables: 425 # tab-width:4 426 # indent-tabs-mode:nil 427 # End: 428 # vim: set expandtab tabstop=4 shiftwidth=4: 429