diff options
Diffstat (limited to 'src/engine/SCons/Script')
| -rw-r--r-- | src/engine/SCons/Script/Interactive.py | 36 | ||||
| -rw-r--r-- | src/engine/SCons/Script/Main.py | 91 | ||||
| -rw-r--r-- | src/engine/SCons/Script/Main.xml | 14 | ||||
| -rw-r--r-- | src/engine/SCons/Script/MainTests.py | 4 | ||||
| -rw-r--r-- | src/engine/SCons/Script/SConsOptions.py | 28 | ||||
| -rw-r--r-- | src/engine/SCons/Script/SConscript.py | 35 | ||||
| -rw-r--r-- | src/engine/SCons/Script/SConscript.xml | 2 | ||||
| -rw-r--r-- | src/engine/SCons/Script/SConscriptTests.py | 4 | ||||
| -rw-r--r-- | src/engine/SCons/Script/__init__.py | 23 | 
9 files changed, 141 insertions, 96 deletions
diff --git a/src/engine/SCons/Script/Interactive.py b/src/engine/SCons/Script/Interactive.py index 97797b5..dee770c 100644 --- a/src/engine/SCons/Script/Interactive.py +++ b/src/engine/SCons/Script/Interactive.py @@ -1,5 +1,5 @@  # -# Copyright (c) 2001 - 2016 The SCons Foundation +# Copyright (c) 2001 - 2017 The SCons Foundation  #  # Permission is hereby granted, free of charge, to any person obtaining  # a copy of this software and associated documentation files (the @@ -19,8 +19,9 @@  # 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. +from __future__ import print_function -__revision__ = "src/engine/SCons/Script/Interactive.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Script/Interactive.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  __doc__ = """  SCons interactive mode @@ -98,17 +99,14 @@ except ImportError:  class SConsInteractiveCmd(cmd.Cmd):      """\ -    build [TARGETS]         Build the specified TARGETS and their dependencies. -                            'b' is a synonym. -    clean [TARGETS]         Clean (remove) the specified TARGETS and their -                            dependencies.  'c' is a synonym. -    exit                    Exit SCons interactive mode. -    help [COMMAND]          Prints help for the specified COMMAND.  'h' and -                            '?' are synonyms. -    shell [COMMANDLINE]     Execute COMMANDLINE in a subshell.  'sh' and '!' -                            are synonyms. -    version                 Prints SCons version information. -    """ + +build [TARGETS]         Build the specified TARGETS and their dependencies. 'b' is a synonym. +clean [TARGETS]         Clean (remove) the specified TARGETS and their dependencies.  'c' is a synonym. +exit                    Exit SCons interactive mode. +help [COMMAND]          Prints help for the specified COMMAND.  'h' and '?' are synonyms. +shell [COMMANDLINE]     Execute COMMANDLINE in a subshell.  'sh' and '!' are synonyms. +version                 Prints SCons version information. +"""      synonyms = {          'b'     : 'build', @@ -129,12 +127,12 @@ class SConsInteractiveCmd(cmd.Cmd):              self.shell_variable = 'SHELL'      def default(self, argv): -        print "*** Unknown command: %s" % argv[0] +        print("*** Unknown command: %s" % argv[0])      def onecmd(self, line):          line = line.strip()          if not line: -            print self.lastcmd +            print(self.lastcmd)              return self.emptyline()          self.lastcmd = line          if line[0] == '!': @@ -221,7 +219,7 @@ class SConsInteractiveCmd(cmd.Cmd):          def get_unseen_children(node, parent, seen_nodes=seen_nodes):              def is_unseen(node, seen_nodes=seen_nodes):                  return node not in seen_nodes -            return list(filter(is_unseen, node.children(scan=1))) +            return [child for child in node.children(scan=1) if is_unseen(child)]          def add_to_seen_nodes(node, parent, seen_nodes=seen_nodes):              seen_nodes[node] = 1 @@ -249,7 +247,7 @@ class SConsInteractiveCmd(cmd.Cmd):              while n:                  n = walker.get_next() -        for node in seen_nodes.keys(): +        for node in list(seen_nodes.keys()):              # Call node.clear() to clear most of the state              node.clear()              # node.clear() doesn't reset node.state, so call @@ -274,7 +272,7 @@ class SConsInteractiveCmd(cmd.Cmd):          return self.do_build(['build', '--clean'] + argv[1:])      def do_EOF(self, argv): -        print +        print()          self.do_exit(argv)      def _do_one_help(self, arg): @@ -351,7 +349,7 @@ class SConsInteractiveCmd(cmd.Cmd):              # Doing the right thing with an argument list currently              # requires different shell= values on Windows and Linux.              p = subprocess.Popen(argv, shell=(sys.platform=='win32')) -        except EnvironmentError, e: +        except EnvironmentError as e:              sys.stderr.write('scons: %s: %s\n' % (argv[0], e.strerror))          else:              p.wait() diff --git a/src/engine/SCons/Script/Main.py b/src/engine/SCons/Script/Main.py index 19f8763..076c30b 100644 --- a/src/engine/SCons/Script/Main.py +++ b/src/engine/SCons/Script/Main.py @@ -10,10 +10,14 @@ some other module.  If it's specific to the "scons" script invocation,  it goes here.  """ +from __future__ import print_function + +  unsupported_python_version = (2, 6, 0)  deprecated_python_version = (2, 7, 0) -# Copyright (c) 2001 - 2016 The SCons Foundation + +# Copyright (c) 2001 - 2017 The SCons Foundation  #  # Permission is hereby granted, free of charge, to any person obtaining  # a copy of this software and associated documentation files (the @@ -34,7 +38,8 @@ deprecated_python_version = (2, 7, 0)  # 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/Main.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Script/Main.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" +  import SCons.compat @@ -42,6 +47,7 @@ import os  import sys  import time  import traceback +import sysconfig  import SCons.CacheDir  import SCons.Debug @@ -60,6 +66,7 @@ import SCons.Warnings  import SCons.Script.Interactive +  def fetch_win32_parallel_msg():      # A subsidiary function that exists solely to isolate this import      # so we don't have to pull it in on all platforms, and so that an @@ -70,6 +77,7 @@ def fetch_win32_parallel_msg():      import SCons.Platform.win32      return SCons.Platform.win32.parallel_msg +  def revert_io():      # This call is added to revert stderr and stdout to the original      # ones just in case some build rule or something else in the system @@ -86,6 +94,7 @@ progress_display = SCons.Util.DisplayEngine()  first_command_start = None  last_command_end = None +  class Progressor(object):      prev = ''      count = 0 @@ -149,9 +158,11 @@ def Progress(*args, **kw):  _BuildFailures = [] +  def GetBuildFailures():      return _BuildFailures +  class BuildTask(SCons.Taskmaster.OutOfDateTask):      """An SCons build task."""      progress = ProgressObject @@ -220,7 +231,7 @@ class BuildTask(SCons.Taskmaster.OutOfDateTask):                      self.exception_set()                  self.do_failed()              else: -                print "scons: Nothing to be done for `%s'." % t +                print("scons: Nothing to be done for `%s'." % t)                  SCons.Taskmaster.OutOfDateTask.executed(self)          else:              SCons.Taskmaster.OutOfDateTask.executed(self) @@ -289,8 +300,8 @@ class BuildTask(SCons.Taskmaster.OutOfDateTask):              if self.options.debug_includes:                  tree = t.render_include_tree()                  if tree: -                    print -                    print tree +                    print() +                    print(tree)          SCons.Taskmaster.OutOfDateTask.postprocess(self)      def make_ready(self): @@ -301,6 +312,7 @@ class BuildTask(SCons.Taskmaster.OutOfDateTask):              if explanation:                  sys.stdout.write("scons: " + explanation) +  class CleanTask(SCons.Taskmaster.AlwaysTask):      """An SCons clean task."""      def fs_delete(self, path, pathstr, remove=True): @@ -325,10 +337,10 @@ class CleanTask(SCons.Taskmaster.AlwaysTask):                  else:                      errstr = "Path '%s' exists but isn't a file or directory."                      raise SCons.Errors.UserError(errstr % (pathstr)) -        except SCons.Errors.UserError, e: -            print e -        except (IOError, OSError), e: -            print "scons: Could not remove '%s':" % pathstr, e.strerror +        except SCons.Errors.UserError as e: +            print(e) +        except (IOError, OSError) as e: +            print("scons: Could not remove '%s':" % pathstr, e.strerror)      def _get_files_to_clean(self):          result = [] @@ -354,13 +366,13 @@ class CleanTask(SCons.Taskmaster.AlwaysTask):          for t in self._get_files_to_clean():              try:                  removed = t.remove() -            except OSError, e: +            except OSError as e:                  # An OSError may indicate something like a permissions                  # issue, an IOError would indicate something like                  # the file not existing.  In either case, print a                  # message and keep going to try to remove as many                  # targets as possible. -                print "scons: Could not remove '%s':" % str(t), e.strerror +                print("scons: Could not remove '{0}'".format(str(t)), e.strerror)              else:                  if removed:                      display("Removed " + str(t)) @@ -600,7 +612,7 @@ def _scons_internal_error():      """Handle all errors but user errors. Print out a message telling      the user what to do in this case and print a normal trace.      """ -    print 'internal error' +    print('internal error')      traceback.print_exc()      sys.exit(2) @@ -714,7 +726,7 @@ def _load_site_scons_dir(topdir, site_dir_name=None):                  # the error checking makes it longer.                  try:                      m = sys.modules['SCons.Script'] -                except Exception, e: +                except Exception as e:                      fmt = 'cannot import site_init.py: missing SCons.Script module %s'                      raise SCons.Errors.InternalError(fmt % repr(e))                  try: @@ -722,15 +734,15 @@ def _load_site_scons_dir(topdir, site_dir_name=None):                      modname = os.path.basename(pathname)[:-len(sfx)]                      site_m = {"__file__": pathname, "__name__": modname, "__doc__": None}                      re_special = re.compile("__[^_]+__") -                    for k in m.__dict__.keys(): +                    for k in list(m.__dict__.keys()):                          if not re_special.match(k):                              site_m[k] = m.__dict__[k]                      # This is the magic. -                    exec fp in site_m +                    exec(compile(fp.read(), fp.name, 'exec'), site_m)                  except KeyboardInterrupt:                      raise -                except Exception, e: +                except Exception as e:                      fmt = '*** Error loading site_init file %s:\n'                      sys.stderr.write(fmt % repr(site_init_file))                      raise @@ -740,7 +752,7 @@ def _load_site_scons_dir(topdir, site_dir_name=None):                              m.__dict__[k] = site_m[k]              except KeyboardInterrupt:                  raise -            except ImportError, e: +            except ImportError as e:                  fmt = '*** cannot import site init file %s:\n'                  sys.stderr.write(fmt % repr(site_init_file))                  raise @@ -792,7 +804,7 @@ def _load_all_site_scons_dirs(topdir, verbose=None):      dirs=sysdirs + [topdir]      for d in dirs:          if verbose:    # this is used by unit tests. -            print "Loading site dir ", d +            print("Loading site dir ", d)          _load_site_scons_dir(d)  def test_load_all_site_scons_dirs(d): @@ -992,7 +1004,7 @@ def _main(parser):      try:          for script in scripts:              SCons.Script._SConscript._SConscript(fs, script) -    except SCons.Errors.StopError, e: +    except SCons.Errors.StopError as e:          # We had problems reading an SConscript file, such as it          # couldn't be copied in to the VariantDir.  Since we're just          # reading SConscript files and haven't started building @@ -1053,8 +1065,8 @@ def _main(parser):              # SConscript files.  Give them the options usage.              raise SConsPrintHelpException          else: -            print help_text -            print "Use scons -H for help about command-line options." +            print(help_text) +            print("Use scons -H for help about command-line options.")          exit_status = 0          return @@ -1091,7 +1103,7 @@ def _main(parser):          nodes = _build_targets(fs, options, targets, target_top)          if not nodes:              revert_io() -            print 'Found nothing to build' +            print('Found nothing to build')              exit_status = 2  def _build_targets(fs, options, targets, target_top): @@ -1157,7 +1169,7 @@ def _build_targets(fs, options, targets, target_top):                          # or not a file, so go ahead and keep it as a default                          # target and let the engine sort it out:                          return 1 -                d = list(filter(check_dir, SCons.Script.DEFAULT_TARGETS)) +                d = [tgt for tgt in SCons.Script.DEFAULT_TARGETS if check_dir(tgt)]                  SCons.Script.DEFAULT_TARGETS[:] = d                  target_top = None                  lookup_top = None @@ -1231,7 +1243,7 @@ def _build_targets(fs, options, targets, target_top):      if options.taskmastertrace_file == '-':          tmtrace = sys.stdout      elif options.taskmastertrace_file: -        tmtrace = open(options.taskmastertrace_file, 'wb') +        tmtrace = open(options.taskmastertrace_file, 'w')      else:          tmtrace = None      taskmaster = SCons.Taskmaster.Taskmaster(nodes, task_class, order, tmtrace) @@ -1240,16 +1252,19 @@ def _build_targets(fs, options, targets, target_top):      # various print_* settings, tree_printer list, etc.      BuildTask.options = options + +    python_has_threads = sysconfig.get_config_var('WITH_THREAD') +    # to check if python configured with threads.      global num_jobs      num_jobs = options.num_jobs      jobs = SCons.Job.Jobs(num_jobs, taskmaster)      if num_jobs > 1:          msg = None -        if jobs.num_jobs == 1: +        if sys.platform == 'win32': +            msg = fetch_win32_parallel_msg() +        elif jobs.num_jobs == 1 or not python_has_threads:              msg = "parallel builds are unsupported by this version of Python;\n" + \                    "\tignoring -j or num_jobs option.\n" -        elif sys.platform == 'win32': -            msg = fetch_win32_parallel_msg()          if msg:              SCons.Warnings.warn(SCons.Warnings.NoParallelSupportWarning, msg) @@ -1332,10 +1347,10 @@ def main():          pass      parts.append(version_string("engine", SCons))      parts.append(path_string("engine", SCons)) -    parts.append("Copyright (c) 2001 - 2016 The SCons Foundation") +    parts.append("Copyright (c) 2001 - 2017 The SCons Foundation")      version = ''.join(parts) -    import SConsOptions +    from . import SConsOptions      parser = SConsOptions.Parser(version)      values = SConsOptions.SConsValues(parser.get_default_values()) @@ -1346,23 +1361,23 @@ def main():              _exec_main(parser, values)          finally:              revert_io() -    except SystemExit, s: +    except SystemExit as s:          if s:              exit_status = s      except KeyboardInterrupt:          print("scons: Build interrupted.")          sys.exit(2) -    except SyntaxError, e: +    except SyntaxError as e:          _scons_syntax_error(e)      except SCons.Errors.InternalError:          _scons_internal_error() -    except SCons.Errors.UserError, e: +    except SCons.Errors.UserError as e:          _scons_user_error(e)      except SConsPrintHelpException:          parser.print_help()          exit_status = 0 -    except SCons.Errors.BuildError, e: -        print e +    except SCons.Errors.BuildError as e: +        print(e)          exit_status = e.exitstatus      except:          # An exception here is likely a builtin Python exception Python @@ -1398,10 +1413,10 @@ def main():              else:                  ct = last_command_end - first_command_start          scons_time = total_time - sconscript_time - ct -        print "Total build time: %f seconds"%total_time -        print "Total SConscript file execution time: %f seconds"%sconscript_time -        print "Total SCons execution time: %f seconds"%scons_time -        print "Total command execution time: %f seconds"%ct +        print("Total build time: %f seconds"%total_time) +        print("Total SConscript file execution time: %f seconds"%sconscript_time) +        print("Total SCons execution time: %f seconds"%scons_time) +        print("Total command execution time: %f seconds"%ct)      sys.exit(exit_status) diff --git a/src/engine/SCons/Script/Main.xml b/src/engine/SCons/Script/Main.xml index 809cf2b..73db83e 100644 --- a/src/engine/SCons/Script/Main.xml +++ b/src/engine/SCons/Script/Main.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <!-- -Copyright (c) 2001 - 2016 The SCons Foundation +Copyright (c) 2001 - 2017 The SCons Foundation  This file is processed by the bin/SConsDoc.py module.  See its __doc__ string for a discussion of the format. @@ -256,7 +256,7 @@ import atexit  def print_build_failures():      from SCons.Script import GetBuildFailures      for bf in GetBuildFailures(): -        print "%s failed: %s" % (bf.node, bf.errstr) +        print("%s failed: %s" % (bf.node, bf.errstr))  atexit.register(print_build_failures)  </example_commands> @@ -577,7 +577,7 @@ every 10 Nodes:  <example_commands>  def my_progress_function(node, *args, **kw): -    print 'Evaluating node %s!' % node +    print('Evaluating node %s!' % node)  Progress(my_progress_function, interval=10)  </example_commands> @@ -781,6 +781,14 @@ which corresponds to --random; and  </listitem>  </varlistentry>  <varlistentry> +<term><literal>silent</literal></term> +<listitem> +<para> +which corresponds to --silent. +</para> +</listitem> +</varlistentry> +<varlistentry>  <term><literal>stack_size</literal></term>  <listitem>  <para> diff --git a/src/engine/SCons/Script/MainTests.py b/src/engine/SCons/Script/MainTests.py index 3df68a8..f5660b0 100644 --- a/src/engine/SCons/Script/MainTests.py +++ b/src/engine/SCons/Script/MainTests.py @@ -1,5 +1,5 @@  # -# Copyright (c) 2001 - 2016 The SCons Foundation +# Copyright (c) 2001 - 2017 The SCons Foundation  #  # Permission is hereby granted, free of charge, to any person obtaining  # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Script/MainTests.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Script/MainTests.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import unittest diff --git a/src/engine/SCons/Script/SConsOptions.py b/src/engine/SCons/Script/SConsOptions.py index 5bebed9..5515c7d 100644 --- a/src/engine/SCons/Script/SConsOptions.py +++ b/src/engine/SCons/Script/SConsOptions.py @@ -1,5 +1,5 @@  # -# Copyright (c) 2001 - 2016 The SCons Foundation +# Copyright (c) 2001 - 2017 The SCons Foundation  #  # Permission is hereby granted, free of charge, to any person obtaining  # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Script/SConsOptions.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Script/SConsOptions.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import optparse  import re @@ -63,6 +63,7 @@ def diskcheck_convert(value):              raise ValueError(v)      return result +  class SConsValues(optparse.Values):      """      Holder class for uniform access to SCons options, regardless @@ -112,7 +113,18 @@ class SConsValues(optparse.Values):              try:                  return self.__dict__['__SConscript_settings__'][attr]              except KeyError: -                return getattr(self.__dict__['__defaults__'], attr) +                try: +                    return getattr(self.__dict__['__defaults__'], attr) +                except KeyError: +                    # Added because with py3 this is a new class, +                    # not a classic class, and due to the way +                    # In that case it will create an object without +                    # __defaults__, and then query for __setstate__ +                    # which will throw an exception of KeyError +                    # deepcopy() is expecting AttributeError if __setstate__ +                    # is not available. +                    raise AttributeError(attr) +      settable = [          'clean', @@ -127,6 +139,7 @@ class SConsValues(optparse.Values):          'random',          'stack_size',          'warn', +        'silent'      ]      def set_option(self, name, value): @@ -161,7 +174,7 @@ class SConsValues(optparse.Values):          elif name == 'diskcheck':              try:                  value = diskcheck_convert(value) -            except ValueError, v: +            except ValueError as v:                  raise SCons.Errors.UserError("Not a valid diskcheck value: %s"%v)              if 'diskcheck' not in self.__dict__:                  # No --diskcheck= option was specified on the command line. @@ -186,6 +199,7 @@ class SConsValues(optparse.Values):          self.__SConscript_settings__[name] = value +  class SConsOption(optparse.Option):      def convert_value(self, opt, value):          if value is not None: @@ -638,7 +652,7 @@ def Parser(version):          for value in value__.split(','):              if value in debug_options:                  parser.values.debug.append(value) -            elif value in deprecated_debug_options.keys(): +            elif value in list(deprecated_debug_options.keys()):                  parser.values.debug.append(value)                  try:                      parser.values.delayed_warnings @@ -663,7 +677,7 @@ def Parser(version):      def opt_diskcheck(option, opt, value, parser):          try:              diskcheck_value = diskcheck_convert(value) -        except ValueError, e: +        except ValueError as e:              raise OptionValueError("`%s' is not a valid diskcheck type" % e)          setattr(parser.values, option.dest, diskcheck_value) @@ -830,7 +844,7 @@ def Parser(version):      tree_options = ["all", "derived", "prune", "status"]      def opt_tree(option, opt, value, parser, tree_options=tree_options): -        import Main +        from . import Main          tp = Main.TreePrinter()          for o in value.split(','):              if o == 'all': diff --git a/src/engine/SCons/Script/SConscript.py b/src/engine/SCons/Script/SConscript.py index a9b2d57..350772e 100644 --- a/src/engine/SCons/Script/SConscript.py +++ b/src/engine/SCons/Script/SConscript.py @@ -5,8 +5,10 @@ files.  """ +from __future__ import print_function +  # -# Copyright (c) 2001 - 2016 The SCons Foundation +# Copyright (c) 2001 - 2017 The SCons Foundation  #  # Permission is hereby granted, free of charge, to any person obtaining  # a copy of this software and associated documentation files (the @@ -26,9 +28,8 @@ files.  # 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. -from __future__ import division -__revision__ = "src/engine/SCons/Script/SConscript.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Script/SConscript.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons  import SCons.Action @@ -69,7 +70,7 @@ def get_calling_namespaces():      """Return the locals and globals for the function that called      into this module in the current call stack."""      try: 1//0 -    except ZeroDivisionError:  +    except ZeroDivisionError:          # Don't start iterating with the current stack-frame to          # prevent creating reference cycles (f_back is safe).          frame = sys.exc_info()[2].tb_frame.f_back @@ -103,7 +104,7 @@ def compute_exports(exports):                      retval[export] = loc[export]                  except KeyError:                      retval[export] = glob[export] -    except KeyError, x: +    except KeyError as x:          raise SCons.Errors.UserError("Export of non-existent variable '%s'"%x)      return retval @@ -135,7 +136,7 @@ def Return(*vars, **kw):          for var in fvars:              for v in var.split():                  retval.append(call_stack[-1].globals[v]) -    except KeyError, x: +    except KeyError as x:          raise SCons.Errors.UserError("Return of non-existent variable '%s'"%x)      if len(retval) == 1: @@ -164,7 +165,7 @@ def _SConscript(fs, *files, **kw):          try:              SCons.Script.sconscript_reading = SCons.Script.sconscript_reading + 1              if fn == "-": -                exec sys.stdin in call_stack[-1].globals +                exec(sys.stdin.read(), call_stack[-1].globals)              else:                  if isinstance(fn, SCons.Node.Node):                      f = fn @@ -178,10 +179,10 @@ def _SConscript(fs, *files, **kw):                  fs.chdir(top, change_os_dir=1)                  if f.rexists():                      actual = f.rfile() -                    _file_ = open(actual.get_abspath(), "r") +                    _file_ = open(actual.get_abspath(), "rb")                  elif f.srcnode().rexists():                      actual = f.srcnode().rfile() -                    _file_ = open(actual.get_abspath(), "r") +                    _file_ = open(actual.get_abspath(), "rb")                  elif f.has_src_builder():                      # The SConscript file apparently exists in a source                      # code management system.  Build it, but then clear @@ -191,7 +192,7 @@ def _SConscript(fs, *files, **kw):                      f.built()                      f.builder_set(None)                      if f.exists(): -                        _file_ = open(f.get_abspath(), "r") +                        _file_ = open(f.get_abspath(), "rb")                  if _file_:                      # Chdir to the SConscript directory.  Use a path                      # name relative to the SConstruct file so that if @@ -247,7 +248,9 @@ def _SConscript(fs, *files, **kw):                          pass                      try:                          try: -                            exec _file_ in call_stack[-1].globals +#                            _file_ = SCons.Util.to_str(_file_) +                            exec(compile(_file_.read(), _file_.name, 'exec'), +                                 call_stack[-1].globals)                          except SConscriptReturn:                              pass                      finally: @@ -272,7 +275,7 @@ def _SConscript(fs, *files, **kw):                  rdir._create()  # Make sure there's a directory there.                  try:                      os.chdir(rdir.get_abspath()) -                except OSError, e: +                except OSError as e:                      # We still couldn't chdir there, so raise the error,                      # but only if actions are being executed.                      # @@ -462,15 +465,15 @@ class SConsEnvironment(SCons.Environment.Base):                  scons_ver_string = '%d.%d.%d' % (major, minor, revision)              else:                  scons_ver_string = '%d.%d' % (major, minor) -            print "SCons %s or greater required, but you have SCons %s" % \ -                  (scons_ver_string, SCons.__version__) +            print("SCons %s or greater required, but you have SCons %s" % \ +                  (scons_ver_string, SCons.__version__))              sys.exit(2)      def EnsurePythonVersion(self, major, minor):          """Exit abnormally if the Python version is not late enough."""          if sys.version_info < (major, minor):              v = sys.version.split()[0] -            print "Python %d.%d or greater required, but you have Python %s" %(major,minor,v) +            print("Python %d.%d or greater required, but you have Python %s" %(major,minor,v))              sys.exit(2)      def Exit(self, value=0): @@ -509,7 +512,7 @@ class SConsEnvironment(SCons.Environment.Base):                              globals[v] = exports[v]                          else:                              globals[v] = global_exports[v] -        except KeyError,x: +        except KeyError as x:              raise SCons.Errors.UserError("Import of non-existent variable '%s'"%x)      def SConscript(self, *ls, **kw): diff --git a/src/engine/SCons/Script/SConscript.xml b/src/engine/SCons/Script/SConscript.xml index 10b5446..e6be6d2 100644 --- a/src/engine/SCons/Script/SConscript.xml +++ b/src/engine/SCons/Script/SConscript.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <!-- -Copyright (c) 2001 - 2016 The SCons Foundation +Copyright (c) 2001 - 2017 The SCons Foundation  This file is processed by the bin/SConsDoc.py module.  See its __doc__ string for a discussion of the format. diff --git a/src/engine/SCons/Script/SConscriptTests.py b/src/engine/SCons/Script/SConscriptTests.py index 40c3c80..2b10446 100644 --- a/src/engine/SCons/Script/SConscriptTests.py +++ b/src/engine/SCons/Script/SConscriptTests.py @@ -1,5 +1,5 @@  # -# Copyright (c) 2001 - 2016 The SCons Foundation +# Copyright (c) 2001 - 2017 The SCons Foundation  #  # Permission is hereby granted, free of charge, to any person obtaining  # a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Script/SConscriptTests.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Script/SConscriptTests.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Script.SConscript diff --git a/src/engine/SCons/Script/__init__.py b/src/engine/SCons/Script/__init__.py index ea9d4fa..ffafadf 100644 --- a/src/engine/SCons/Script/__init__.py +++ b/src/engine/SCons/Script/__init__.py @@ -12,7 +12,7 @@ it goes here.  """  # -# Copyright (c) 2001 - 2016 The SCons Foundation +# Copyright (c) 2001 - 2017 The SCons Foundation  #  # Permission is hereby granted, free of charge, to any person obtaining  # a copy of this software and associated documentation files (the @@ -34,14 +34,19 @@ it goes here.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Script/__init__.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Script/__init__.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import time  start_time = time.time()  import collections  import os -import StringIO + +try: +    from StringIO import StringIO +except ImportError: +    from io import StringIO +  import sys  # Special chicken-and-egg handling of the "--debug=memoizer" flag: @@ -67,7 +72,7 @@ if "--debug=memoizer" in _args:      except SCons.Warnings.Warning:          # Some warning was thrown.  Arrange for it to be displayed          # or not after warnings are configured. -        import Main +        from . import Main          exc_type, exc_value, tb = sys.exc_info()          Main.delayed_warnings.append((exc_type, exc_value))  del _args @@ -86,7 +91,7 @@ import SCons.Util  import SCons.Variables  import SCons.Defaults -import Main +from . import Main  main                    = Main.main @@ -130,7 +135,7 @@ GetBuildFailures        = Main.GetBuildFailures  #repositories            = Main.repositories  # -import SConscript +from . import SConscript  _SConscript = SConscript  call_stack              = _SConscript.call_stack @@ -264,7 +269,7 @@ def HelpFunction(text, append=False):      global help_text      if help_text is None:          if append: -            s = StringIO.StringIO() +            s = StringIO()              PrintHelp(s)                help_text = s.getvalue()              s.close() @@ -332,6 +337,7 @@ GlobalDefaultEnvironmentFunctions = [      'Local',      'ParseDepends',      'Precious', +    'PyPackageDir',      'Repository',      'Requires',      'SConsignFile', @@ -354,6 +360,7 @@ GlobalDefaultBuilders = [      'Java',      'JavaH',      'Library', +    'LoadableModule',      'M4',      'MSVSProject',      'Object', @@ -374,7 +381,7 @@ GlobalDefaultBuilders = [  ]  for name in GlobalDefaultEnvironmentFunctions + GlobalDefaultBuilders: -    exec "%s = _SConscript.DefaultEnvironmentCall(%s)" % (name, repr(name)) +    exec ("%s = _SConscript.DefaultEnvironmentCall(%s)" % (name, repr(name)))  del name  # There are a handful of variables that used to live in the  | 
