diff options
Diffstat (limited to 'src/engine/SCons/Tool')
243 files changed, 3524 insertions, 3181 deletions
diff --git a/src/engine/SCons/Tool/386asm.py b/src/engine/SCons/Tool/386asm.py index 8fee694..b318c4b 100644 --- a/src/engine/SCons/Tool/386asm.py +++ b/src/engine/SCons/Tool/386asm.py @@ -10,7 +10,7 @@ selection method.  """  # -# 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 @@ -32,12 +32,12 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/386asm.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/386asm.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  from SCons.Tool.PharLapCommon import addPharLapPaths  import SCons.Util -as_module = __import__('as', globals(), locals(), []) +as_module = __import__('as', globals(), locals(), [], 1)  def generate(env):      """Add Builders and construction variables for ar to an Environment.""" diff --git a/src/engine/SCons/Tool/386asm.xml b/src/engine/SCons/Tool/386asm.xml index a29fc0f..80a2cd6 100644 --- a/src/engine/SCons/Tool/386asm.xml +++ b/src/engine/SCons/Tool/386asm.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/Tool/BitKeeper.xml b/src/engine/SCons/Tool/BitKeeper.xml deleted file mode 100644 index 30f3221..0000000 --- a/src/engine/SCons/Tool/BitKeeper.xml +++ /dev/null @@ -1,123 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -Copyright (c) 2001 - 2016 The SCons Foundation - -This file is processed by the bin/SConsDoc.py module. -See its __doc__ string for a discussion of the format. ---> - -<!DOCTYPE sconsdoc [ -<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'> -%scons; -<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'> -%builders-mod; -<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'> -%functions-mod; -<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'> -%tools-mod; -<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'> -%variables-mod; -]> - -<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0" -          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -          xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd"> - -<tool name="BitKeeper"> -<summary> -<para> -Sets construction variables for the BitKeeper -source code control system. -</para> -</summary> -<sets> -<item>BITKEEPER</item> -<item>BITKEEPERGET</item> -<item>BITKEEPERGETFLAGS</item> -<item>BITKEEPERCOM</item> -</sets> -<uses> -<item>BITKEEPERCOMSTR</item> -</uses> -</tool> - -<cvar name="BITKEEPER"> -<summary> -<para> -The BitKeeper executable. -</para> -</summary> -</cvar> - -<cvar name="BITKEEPERCOM"> -<summary> -<para> -The command line for -fetching source files using BitKeeper. -</para> -</summary> -</cvar> - -<cvar name="BITKEEPERCOMSTR"> -<summary> -<para> -The string displayed when fetching -a source file using BitKeeper. -If this is not set, then &cv-link-BITKEEPERCOM; -(the command line) is displayed. -</para> -</summary> -</cvar> - -<cvar name="BITKEEPERGET"> -<summary> -<para> -The command (&cv-link-BITKEEPER;) and subcommand -for fetching source files using BitKeeper. -</para> -</summary> -</cvar> - -<cvar name="BITKEEPERGETFLAGS"> -<summary> -<para> -Options that are passed to the BitKeeper -<command>get</command> -subcommand. -</para> -</summary> -</cvar> - -<scons_function name="BitKeeper"> -<arguments signature="env"> -() -</arguments> -<summary> -<para> -A factory function that -returns a Builder object -to be used to fetch source files -using BitKeeper. -The returned Builder -is intended to be passed to the -&f-SourceCode; -function. -</para> - -<para> -This function is deprecated.  For details, see the entry for the -&f-SourceCode; -function. -</para> - -<para> -Example: -</para> - -<example_commands> -env.SourceCode('.', env.BitKeeper()) -</example_commands> -</summary> -</scons_function> - -</sconsdoc> diff --git a/src/engine/SCons/Tool/CVS.py b/src/engine/SCons/Tool/CVS.py deleted file mode 100644 index a8e5a8d..0000000 --- a/src/engine/SCons/Tool/CVS.py +++ /dev/null @@ -1,72 +0,0 @@ -"""SCons.Tool.CVS.py - -Tool-specific initialization for CVS. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# Copyright (c) 2001 - 2016 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/Tool/CVS.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" - -import SCons.Action -import SCons.Builder -import SCons.Util - -def generate(env): -    """Add a Builder factory function and construction variables for -    CVS to an Environment.""" - -    def CVSFactory(repos, module='', env=env): -        """ """ -        import SCons.Warnings as W -        W.warn(W.DeprecatedSourceCodeWarning, """The CVS() factory is deprecated and there is no replacement.""") -        # fail if repos is not an absolute path name? -        if module != '': -           # Don't use os.path.join() because the name we fetch might -           # be across a network and must use POSIX slashes as separators. -           module = module + '/' -           env['CVSCOM']   = '$CVS $CVSFLAGS co $CVSCOFLAGS -d ${TARGET.dir} $CVSMODULE${TARGET.posix}' -        act = SCons.Action.Action('$CVSCOM', '$CVSCOMSTR') -        return SCons.Builder.Builder(action = act, -                                     env = env, -                                     CVSREPOSITORY = repos, -                                     CVSMODULE = module) - -    env.CVS = CVSFactory - -    env['CVS']        = 'cvs' -    env['CVSFLAGS']   = SCons.Util.CLVar('-d $CVSREPOSITORY') -    env['CVSCOFLAGS'] = SCons.Util.CLVar('') -    env['CVSCOM']     = '$CVS $CVSFLAGS co $CVSCOFLAGS ${TARGET.posix}' - -def exists(env): -    return env.Detect('cvs') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/src/engine/SCons/Tool/CVS.xml b/src/engine/SCons/Tool/CVS.xml deleted file mode 100644 index b6ff10a..0000000 --- a/src/engine/SCons/Tool/CVS.xml +++ /dev/null @@ -1,159 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -Copyright (c) 2001 - 2016 The SCons Foundation - -This file is processed by the bin/SConsDoc.py module. -See its __doc__ string for a discussion of the format. ---> - -<!DOCTYPE sconsdoc [ -<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'> -%scons; -<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'> -%builders-mod; -<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'> -%functions-mod; -<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'> -%tools-mod; -<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'> -%variables-mod; -]> - -<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0" -          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -          xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd"> - -<tool name="CVS"> -<summary> -<para> -Sets construction variables for the CVS source code -management system. -</para> -</summary> -<sets> -<item>CVS</item> -<item>CVSCOM</item> -<item>CVSFLAGS</item> -<item>CVSCOFLAGS</item> -</sets> -<uses> -<item>CVSCOMSTR</item> -</uses> -</tool> - -<cvar name="CVS"> -<summary> -<para> -The CVS executable. -</para> -</summary> -</cvar> - -<cvar name="CVSCOFLAGS"> -<summary> -<para> -Options that are passed to the CVS checkout subcommand. -</para> -</summary> -</cvar> - -<cvar name="CVSCOM"> -<summary> -<para> -The command line used to -fetch source files from a CVS repository. -</para> -</summary> -</cvar> - -<cvar name="CVSCOMSTR"> -<summary> -<para> -The string displayed when fetching -a source file from a CVS repository. -If this is not set, then &cv-link-CVSCOM; -(the command line) is displayed. -</para> -</summary> -</cvar> - -<cvar name="CVSFLAGS"> -<summary> -<para> -General options that are passed to CVS. -By default, this is set to -<literal>-d $CVSREPOSITORY</literal> -to specify from where the files must be fetched. -</para> -</summary> -</cvar> - -<cvar name="CVSREPOSITORY"> -<summary> -<para> -The path to the CVS repository. -This is referenced in the default -&cv-link-CVSFLAGS; value. -</para> -</summary> -</cvar> - -<scons_function name="CVS"> -<arguments signature="env"> -(repository, module) -</arguments> -<summary> -<para> -A factory function that -returns a Builder object -to be used to fetch source files -from the specified -CVS -<varname>repository</varname>. -The returned Builder -is intended to be passed to the -&f-link-SourceCode; -function. -</para> - -<para> -This function is deprecated.  For details, see the entry for the -&f-SourceCode; -function. -</para> - -<para> -The optional specified -<varname>module</varname> -will be added to the beginning -of all repository path names; -this can be used, in essence, -to strip initial directory names -from the repository path names, -so that you only have to -replicate part of the repository -directory hierarchy in your -local build directory. -</para> - -<para> -Examples: -</para> - -<example_commands> -# Will fetch foo/bar/src.c -# from /usr/local/CVSROOT/foo/bar/src.c. -env.SourceCode('.', env.CVS('/usr/local/CVSROOT')) - -# Will fetch bar/src.c -# from /usr/local/CVSROOT/foo/bar/src.c. -env.SourceCode('.', env.CVS('/usr/local/CVSROOT', 'foo')) - -# Will fetch src.c -# from /usr/local/CVSROOT/foo/bar/src.c. -env.SourceCode('.', env.CVS('/usr/local/CVSROOT', 'foo/bar')) -</example_commands> -</summary> -</scons_function> - -</sconsdoc> diff --git a/src/engine/SCons/Tool/DCommon.py b/src/engine/SCons/Tool/DCommon.py index e2750a4..8973853 100644 --- a/src/engine/SCons/Tool/DCommon.py +++ b/src/engine/SCons/Tool/DCommon.py @@ -1,3 +1,5 @@ +from __future__ import print_function +  """SCons.Tool.DCommon  Common code for the various D tools. @@ -5,8 +7,9 @@ Common code for the various D tools.  Coded by Russel Winder (russel@winder.org.uk)  2012-09-06  """ +  # -# 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 @@ -28,10 +31,11 @@ Coded by Russel Winder (russel@winder.org.uk)  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/DCommon.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/DCommon.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os.path +  def isD(env, source):      if not source:          return 0 @@ -42,6 +46,7 @@ def isD(env, source):                  return 1      return 0 +  def addDPATHToEnv(env, executable):      dPath = env.WhereIs(executable)      if dPath: @@ -49,6 +54,14 @@ def addDPATHToEnv(env, executable):          if os.path.isdir(phobosDir):              env.Append(DPATH=[phobosDir]) + +def allAtOnceEmitter(target, source, env): +    if env['DC'] in ('ldc2', 'dmd'): +        env.SideEffect(str(target[0]) + '.o', target[0]) +        env.Clean(target[0], str(target[0]) + '.o') +    return target, source + +  # Local Variables:  # tab-width:4  # indent-tabs-mode:nil diff --git a/src/engine/SCons/Tool/DCommon.xml b/src/engine/SCons/Tool/DCommon.xml new file mode 100644 index 0000000..b1deb82 --- /dev/null +++ b/src/engine/SCons/Tool/DCommon.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +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. +--> + +<!DOCTYPE sconsdoc [ +        <!ENTITY % scons SYSTEM '../../../../doc/scons.mod'> +        %scons; +        <!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'> +        %builders-mod; +        <!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'> +        %functions-mod; +        <!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'> +        %tools-mod; +        <!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'> +        %variables-mod; +        ]> + +<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0" +          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +          xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0/scons.xsd"> + + + + + +    <cvar name="DRPATHPREFIX"> +        <summary> +            <para> +                DRPATHPREFIX. +            </para> +        </summary> +    </cvar> + +    <cvar name="DRPATHSUFFIX"> +        <summary> +            <para> +                DRPATHSUFFIX. +            </para> +        </summary> +    </cvar> + + +    <cvar name="DShLibSonameGenerator"> +        <summary> +            <para> +                DShLibSonameGenerator. +            </para> +        </summary> +    </cvar> + +    <cvar name="SHDLIBVERSION"> +        <summary> +            <para> +                SHDLIBVERSION. +            </para> +        </summary> +    </cvar> +    <cvar name="SHDLIBVERSIONFLAGS"> +        <summary> +            <para> +                SHDLIBVERSIONFLAGS. +            </para> +        </summary> +    </cvar> + + +</sconsdoc> diff --git a/src/engine/SCons/Tool/FortranCommon.py b/src/engine/SCons/Tool/FortranCommon.py index 058f24d..d2126a4 100644 --- a/src/engine/SCons/Tool/FortranCommon.py +++ b/src/engine/SCons/Tool/FortranCommon.py @@ -5,7 +5,7 @@ Stuff for processing Fortran, common to all fortran dialects.  """  # -# 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,8 +26,9 @@ Stuff for processing Fortran, common to all fortran dialects.  # 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/Tool/FortranCommon.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/FortranCommon.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import re  import os.path @@ -61,7 +62,7 @@ def isfortran(env, source):  def _fortranEmitter(target, source, env):      node = source[0].rfile()      if not node.exists() and not node.is_derived(): -       print "Could not locate " + str(node.name) +       print("Could not locate " + str(node.name))         return ([], [])      mod_regex = """(?i)^\s*MODULE\s+(?!PROCEDURE)(\w+)"""      cre = re.compile(mod_regex,re.M) @@ -167,7 +168,7 @@ def add_fortran_to_env(env):      except KeyError:          FortranSuffixes = ['.f', '.for', '.ftn'] -    #print "Adding %s to fortran suffixes" % FortranSuffixes +    #print("Adding %s to fortran suffixes" % FortranSuffixes)      try:          FortranPPSuffixes = env['FORTRANPPFILESUFFIXES']      except KeyError: @@ -191,7 +192,7 @@ def add_f77_to_env(env):      except KeyError:          F77Suffixes = ['.f77'] -    #print "Adding %s to f77 suffixes" % F77Suffixes +    #print("Adding %s to f77 suffixes" % F77Suffixes)      try:          F77PPSuffixes = env['F77PPFILESUFFIXES']      except KeyError: @@ -206,7 +207,7 @@ def add_f90_to_env(env):      except KeyError:          F90Suffixes = ['.f90'] -    #print "Adding %s to f90 suffixes" % F90Suffixes +    #print("Adding %s to f90 suffixes" % F90Suffixes)      try:          F90PPSuffixes = env['F90PPFILESUFFIXES']      except KeyError: @@ -222,7 +223,7 @@ def add_f95_to_env(env):      except KeyError:          F95Suffixes = ['.f95'] -    #print "Adding %s to f95 suffixes" % F95Suffixes +    #print("Adding %s to f95 suffixes" % F95Suffixes)      try:          F95PPSuffixes = env['F95PPFILESUFFIXES']      except KeyError: @@ -238,7 +239,7 @@ def add_f03_to_env(env):      except KeyError:          F03Suffixes = ['.f03'] -    #print "Adding %s to f95 suffixes" % F95Suffixes +    #print("Adding %s to f95 suffixes" % F95Suffixes)      try:          F03PPSuffixes = env['F03PPFILESUFFIXES']      except KeyError: diff --git a/src/engine/SCons/Tool/GettextCommon.py b/src/engine/SCons/Tool/GettextCommon.py index 596586c..b475d8f 100644 --- a/src/engine/SCons/Tool/GettextCommon.py +++ b/src/engine/SCons/Tool/GettextCommon.py @@ -3,7 +3,7 @@  Used by several tools of `gettext` toolset.  """ -# 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 @@ -24,20 +24,37 @@ Used by several tools of `gettext` toolset.  # 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/Tool/GettextCommon.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/GettextCommon.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Warnings  import re +  #############################################################################  class XgettextToolWarning(SCons.Warnings.Warning): pass + +  class XgettextNotFound(XgettextToolWarning): pass + +  class MsginitToolWarning(SCons.Warnings.Warning): pass + +  class MsginitNotFound(MsginitToolWarning): pass + +  class MsgmergeToolWarning(SCons.Warnings.Warning): pass + +  class MsgmergeNotFound(MsgmergeToolWarning): pass + +  class MsgfmtToolWarning(SCons.Warnings.Warning): pass + +  class MsgfmtNotFound(MsgfmtToolWarning): pass + +  #############################################################################  SCons.Warnings.enableWarningClass(XgettextToolWarning)  SCons.Warnings.enableWarningClass(XgettextNotFound) @@ -47,367 +64,406 @@ SCons.Warnings.enableWarningClass(MsgmergeToolWarning)  SCons.Warnings.enableWarningClass(MsgmergeNotFound)  SCons.Warnings.enableWarningClass(MsgfmtToolWarning)  SCons.Warnings.enableWarningClass(MsgfmtNotFound) + +  #############################################################################  #############################################################################  class _POTargetFactory(object): -  """ A factory of `PO` target files. -   -  Factory defaults differ from these of `SCons.Node.FS.FS`.  We set `precious` -  (this is required by builders and actions gettext) and `noclean` flags by -  default for all produced nodes. -  """ -  def __init__( self, env, nodefault = True, alias = None, precious = True -              , noclean = True ): -    """ Object constructor. - -    **Arguments** - -        - *env* (`SCons.Environment.Environment`) -        - *nodefault* (`boolean`) - if `True`, produced nodes will be ignored -          from default target `'.'` -        - *alias* (`string`) - if provided, produced nodes will be automatically -          added to this alias, and alias will be set as `AlwaysBuild` -        - *precious* (`boolean`) - if `True`, the produced nodes will be set as -          `Precious`. -        - *noclen* (`boolean`) - if `True`, the produced nodes will be excluded -          from `Clean`. +    """ A factory of `PO` target files. +     +    Factory defaults differ from these of `SCons.Node.FS.FS`.  We set `precious` +    (this is required by builders and actions gettext) and `noclean` flags by +    default for all produced nodes.      """ -    self.env = env -    self.alias = alias -    self.precious = precious -    self.noclean = noclean -    self.nodefault = nodefault - -  def _create_node(self, name, factory, directory = None, create = 1): -    """ Create node, and set it up to factory settings. """ -    import SCons.Util -    node = factory(name, directory, create) -    node.set_noclean(self.noclean) -    node.set_precious(self.precious) -    if self.nodefault: -      self.env.Ignore('.', node) -    if self.alias: -      self.env.AlwaysBuild(self.env.Alias(self.alias, node)) -    return node - -  def Entry(self, name, directory = None, create = 1): -    """ Create `SCons.Node.FS.Entry` """ -    return self._create_node(name, self.env.fs.Entry, directory, create) - -  def File(self, name, directory = None, create = 1): -    """ Create `SCons.Node.FS.File` """ -    return self._create_node(name, self.env.fs.File, directory, create) + +    def __init__(self, env, nodefault=True, alias=None, precious=True +                 , noclean=True): +        """ Object constructor. +     +        **Arguments** +     +            - *env* (`SCons.Environment.Environment`) +            - *nodefault* (`boolean`) - if `True`, produced nodes will be ignored +              from default target `'.'` +            - *alias* (`string`) - if provided, produced nodes will be automatically +              added to this alias, and alias will be set as `AlwaysBuild` +            - *precious* (`boolean`) - if `True`, the produced nodes will be set as +              `Precious`. +            - *noclen* (`boolean`) - if `True`, the produced nodes will be excluded +              from `Clean`. +        """ +        self.env = env +        self.alias = alias +        self.precious = precious +        self.noclean = noclean +        self.nodefault = nodefault + +    def _create_node(self, name, factory, directory=None, create=1): +        """ Create node, and set it up to factory settings. """ +        import SCons.Util +        node = factory(name, directory, create) +        node.set_noclean(self.noclean) +        node.set_precious(self.precious) +        if self.nodefault: +            self.env.Ignore('.', node) +        if self.alias: +            self.env.AlwaysBuild(self.env.Alias(self.alias, node)) +        return node + +    def Entry(self, name, directory=None, create=1): +        """ Create `SCons.Node.FS.Entry` """ +        return self._create_node(name, self.env.fs.Entry, directory, create) + +    def File(self, name, directory=None, create=1): +        """ Create `SCons.Node.FS.File` """ +        return self._create_node(name, self.env.fs.File, directory, create) + +  #############################################################################  #############################################################################  _re_comment = re.compile(r'(#[^\n\r]+)$', re.M)  _re_lang = re.compile(r'([a-zA-Z0-9_]+)', re.M) + +  ############################################################################# -def _read_linguas_from_files(env, linguas_files = None): -  """ Parse `LINGUAS` file and return list of extracted languages """ -  import SCons.Util -  import SCons.Environment -  global _re_comment -  global _re_lang -  if not SCons.Util.is_List(linguas_files) \ -  and not SCons.Util.is_String(linguas_files) \ -  and not isinstance(linguas_files, SCons.Node.FS.Base) \ -  and linguas_files: -    # If, linguas_files==True or such, then read 'LINGUAS' file. -    linguas_files = [ 'LINGUAS' ] -  if linguas_files is None: -    return []   -  fnodes = env.arg2nodes(linguas_files) -  linguas = [] -  for fnode in fnodes: -    contents =  _re_comment.sub("", fnode.get_text_contents()) -    ls = [ l for l in _re_lang.findall(contents) if l ] -    linguas.extend(ls) -  return linguas  +def _read_linguas_from_files(env, linguas_files=None): +    """ Parse `LINGUAS` file and return list of extracted languages """ +    import SCons.Util +    import SCons.Environment +    global _re_comment +    global _re_lang +    if not SCons.Util.is_List(linguas_files) \ +            and not SCons.Util.is_String(linguas_files) \ +            and not isinstance(linguas_files, SCons.Node.FS.Base) \ +            and linguas_files: +        # If, linguas_files==True or such, then read 'LINGUAS' file. +        linguas_files = ['LINGUAS'] +    if linguas_files is None: +        return [] +    fnodes = env.arg2nodes(linguas_files) +    linguas = [] +    for fnode in fnodes: +        contents = _re_comment.sub("", fnode.get_text_contents()) +        ls = [l for l in _re_lang.findall(contents) if l] +        linguas.extend(ls) +    return linguas + +  #############################################################################  #############################################################################  from SCons.Builder import BuilderBase + +  #############################################################################  class _POFileBuilder(BuilderBase): -  """ `PO` file builder. - -  This is multi-target single-source builder. In typical situation the source -  is single `POT` file, e.g. `messages.pot`, and there are multiple `PO` -  targets to be updated from this `POT`. We must run -  `SCons.Builder.BuilderBase._execute()` separatelly for each target to track -  dependencies separatelly for each target file. +    """ `PO` file builder. -  **NOTE**: if we call `SCons.Builder.BuilderBase._execute(.., target, ...)` -  with target being list of all targets, all targets would be rebuilt each time -  one of the targets from this list is missing. This would happen, for example, -  when new language `ll` enters `LINGUAS_FILE` (at this moment there is no -  `ll.po` file yet). To avoid this, we override -  `SCons.Builder.BuilerBase._execute()` and call it separatelly for each -  target. Here we also append to the target list the languages read from -  `LINGUAS_FILE`. -  """ -  # -  #* The argument for overriding _execute(): We must use environment with -  #  builder overrides applied (see BuilderBase.__init__(). Here it comes for -  #  free. -  #* The argument against using 'emitter': The emitter is called too late -  #  by BuilderBase._execute(). If user calls, for example: -  #   -  #    env.POUpdate(LINGUAS_FILE = 'LINGUAS') -  # -  #  the builder throws error, because it is called with target=None, -  #  source=None and is trying to "generate" sources or target list first. -  #  If user calls -  # -  #    env.POUpdate(['foo', 'baz'], LINGUAS_FILE = 'LINGUAS') -  # -  #  the env.BuilderWrapper() calls our builder with target=None, -  #  source=['foo', 'baz']. The BuilderBase._execute() then splits execution -  #  and execute iterativelly (recursion) self._execute(None, source[i]).  -  #  After that it calls emitter (which is quite too late). The emitter is -  #  also called in each iteration, what makes things yet worse. -  def __init__(self, env, **kw): -    if not 'suffix' in kw: -       kw['suffix'] = '$POSUFFIX' -    if not 'src_suffix' in kw: -       kw['src_suffix'] = '$POTSUFFIX' -    if not 'src_builder' in kw: -       kw['src_builder'] = '_POTUpdateBuilder' -    if not 'single_source' in kw: -       kw['single_source'] = True -    alias = None -    if 'target_alias' in kw: -       alias = kw['target_alias'] -       del kw['target_alias'] -    if not 'target_factory' in kw: -       kw['target_factory'] = _POTargetFactory(env, alias=alias).File -    BuilderBase.__init__(self, **kw) - -  def _execute(self, env, target, source, *args, **kw): -    """ Execute builder's actions. +    This is multi-target single-source builder. In typical situation the source +    is single `POT` file, e.g. `messages.pot`, and there are multiple `PO` +    targets to be updated from this `POT`. We must run +    `SCons.Builder.BuilderBase._execute()` separatelly for each target to track +    dependencies separatelly for each target file. -    Here we append to `target` the languages read from `$LINGUAS_FILE` and  -    apply `SCons.Builder.BuilderBase._execute()` separatelly to each target. -    The arguments and return value are same as for -    `SCons.Builder.BuilderBase._execute()`.  +    **NOTE**: if we call `SCons.Builder.BuilderBase._execute(.., target, ...)` +    with target being list of all targets, all targets would be rebuilt each time +    one of the targets from this list is missing. This would happen, for example, +    when new language `ll` enters `LINGUAS_FILE` (at this moment there is no +    `ll.po` file yet). To avoid this, we override +    `SCons.Builder.BuilerBase._execute()` and call it separatelly for each +    target. Here we also append to the target list the languages read from +    `LINGUAS_FILE`.      """ -    import SCons.Util -    import SCons.Node -    linguas_files = None -    if env.has_key('LINGUAS_FILE') and env['LINGUAS_FILE']: -      linguas_files = env['LINGUAS_FILE'] -      # This prevents endless recursion loop (we'll be invoked once for  -      # each target appended here, we must not extend the list again). -      env['LINGUAS_FILE'] = None -      linguas = _read_linguas_from_files(env,linguas_files) -      if SCons.Util.is_List(target): -        target.extend(linguas) -      elif target is not None: -        target = [target] + linguas -      else: -        target = linguas -    if not target: -      # Let the SCons.BuilderBase to handle this patologic situation -      return BuilderBase._execute( self, env, target, source, *args, **kw) -    # The rest is ours -    if not SCons.Util.is_List(target): -      target = [ target ] -    result = [] -    for tgt in target: -      r = BuilderBase._execute( self, env, [tgt], source, *args, **kw) -      result.extend(r) -    if linguas_files is not None: -      env['LINGUAS_FILE'] = linguas_files -    return SCons.Node.NodeList(result) + +    # +    # * The argument for overriding _execute(): We must use environment with +    #  builder overrides applied (see BuilderBase.__init__(). Here it comes for +    #  free. +    # * The argument against using 'emitter': The emitter is called too late +    #  by BuilderBase._execute(). If user calls, for example: +    # +    #    env.POUpdate(LINGUAS_FILE = 'LINGUAS') +    # +    #  the builder throws error, because it is called with target=None, +    #  source=None and is trying to "generate" sources or target list first. +    #  If user calls +    # +    #    env.POUpdate(['foo', 'baz'], LINGUAS_FILE = 'LINGUAS') +    # +    #  the env.BuilderWrapper() calls our builder with target=None, +    #  source=['foo', 'baz']. The BuilderBase._execute() then splits execution +    #  and execute iterativelly (recursion) self._execute(None, source[i]). +    #  After that it calls emitter (which is quite too late). The emitter is +    #  also called in each iteration, what makes things yet worse. +    def __init__(self, env, **kw): +        if not 'suffix' in kw: +            kw['suffix'] = '$POSUFFIX' +        if not 'src_suffix' in kw: +            kw['src_suffix'] = '$POTSUFFIX' +        if not 'src_builder' in kw: +            kw['src_builder'] = '_POTUpdateBuilder' +        if not 'single_source' in kw: +            kw['single_source'] = True +        alias = None +        if 'target_alias' in kw: +            alias = kw['target_alias'] +            del kw['target_alias'] +        if not 'target_factory' in kw: +            kw['target_factory'] = _POTargetFactory(env, alias=alias).File +        BuilderBase.__init__(self, **kw) + +    def _execute(self, env, target, source, *args, **kw): +        """ Execute builder's actions. +         +        Here we append to `target` the languages read from `$LINGUAS_FILE` and  +        apply `SCons.Builder.BuilderBase._execute()` separatelly to each target. +        The arguments and return value are same as for +        `SCons.Builder.BuilderBase._execute()`.  +        """ +        import SCons.Util +        import SCons.Node +        linguas_files = None +        if 'LINGUAS_FILE' in env and env['LINGUAS_FILE']: +            linguas_files = env['LINGUAS_FILE'] +            # This prevents endless recursion loop (we'll be invoked once for +            # each target appended here, we must not extend the list again). +            env['LINGUAS_FILE'] = None +            linguas = _read_linguas_from_files(env, linguas_files) +            if SCons.Util.is_List(target): +                target.extend(linguas) +            elif target is not None: +                target = [target] + linguas +            else: +                target = linguas +        if not target: +            # Let the SCons.BuilderBase to handle this patologic situation +            return BuilderBase._execute(self, env, target, source, *args, **kw) +        # The rest is ours +        if not SCons.Util.is_List(target): +            target = [target] +        result = [] +        for tgt in target: +            r = BuilderBase._execute(self, env, [tgt], source, *args, **kw) +            result.extend(r) +        if linguas_files is not None: +            env['LINGUAS_FILE'] = linguas_files +        return SCons.Node.NodeList(result) + +  #############################################################################  import SCons.Environment + +  #############################################################################  def _translate(env, target=None, source=SCons.Environment._null, *args, **kw): -  """ Function for `Translate()` pseudo-builder """ -  if target is None: target = [] -  pot = env.POTUpdate(None, source, *args, **kw) -  po = env.POUpdate(target, pot, *args, **kw) -  return po +    """ Function for `Translate()` pseudo-builder """ +    if target is None: target = [] +    pot = env.POTUpdate(None, source, *args, **kw) +    po = env.POUpdate(target, pot, *args, **kw) +    return po + +  #############################################################################  #############################################################################  class RPaths(object): -  """ Callable object, which returns pathnames relative to SCons current -  working directory. - -  It seems like `SCons.Node.FS.Base.get_path()` returns absolute paths -  for nodes that are outside of current working directory (`env.fs.getcwd()`). -  Here, we often have `SConscript`, `POT` and `PO` files within `po/` -  directory and source files (e.g. `*.c`) outside of it. When generating `POT` -  template file, references to source files are written to `POT` template, so -  a translator may later quickly jump to appropriate source file and line from -  its `PO` editor (e.g. `poedit`).  Relative paths in  `PO` file are usually -  interpreted by `PO` editor as paths relative to the place, where `PO` file -  lives. The absolute paths would make resultant `POT` file nonportable, as -  the references would be correct only on the machine, where `POT` file was -  recently re-created. For such reason, we need a function, which always -  returns relative paths. This is the purpose of `RPaths` callable object. - -  The `__call__` method returns paths relative to current working directory, but -  we assume, that *xgettext(1)* is run from the directory, where target file is -  going to be created. - -  Note, that this may not work for files distributed over several hosts or -  across different drives on windows. We assume here, that single local -  filesystem holds both source files and target `POT` templates. - -  Intended use of `RPaths` - in `xgettext.py`:: - -    def generate(env): -        from GettextCommon import RPaths -        ... -        sources = '$( ${_concat( "", SOURCES, "", __env__, XgettextRPaths, TARGET, SOURCES)} $)' -        env.Append( -          ... -          XGETTEXTCOM = 'XGETTEXT ... ' + sources, -          ... -          XgettextRPaths = RPaths(env) -        ) -  """ -  # NOTE: This callable object returns pathnames of dirs/files relative to -  # current working directory. The pathname remains relative also for entries -  # that are outside of current working directory (node, that -  # SCons.Node.FS.File and siblings return absolute path in such case). For -  # simplicity we compute path relative to current working directory, this -  # seems be enough for our purposes (don't need TARGET variable and -  # SCons.Defaults.Variable_Caller stuff). +    """ Callable object, which returns pathnames relative to SCons current +    working directory. -  def __init__(self, env): -    """ Initialize `RPaths` callable object. - -      **Arguments**: - -        - *env* - a `SCons.Environment.Environment` object, defines *current -          working dir*. +    It seems like `SCons.Node.FS.Base.get_path()` returns absolute paths +    for nodes that are outside of current working directory (`env.fs.getcwd()`). +    Here, we often have `SConscript`, `POT` and `PO` files within `po/` +    directory and source files (e.g. `*.c`) outside of it. When generating `POT` +    template file, references to source files are written to `POT` template, so +    a translator may later quickly jump to appropriate source file and line from +    its `PO` editor (e.g. `poedit`).  Relative paths in  `PO` file are usually +    interpreted by `PO` editor as paths relative to the place, where `PO` file +    lives. The absolute paths would make resultant `POT` file nonportable, as +    the references would be correct only on the machine, where `POT` file was +    recently re-created. For such reason, we need a function, which always +    returns relative paths. This is the purpose of `RPaths` callable object. +   +    The `__call__` method returns paths relative to current working directory, but +    we assume, that *xgettext(1)* is run from the directory, where target file is +    going to be created. +   +    Note, that this may not work for files distributed over several hosts or +    across different drives on windows. We assume here, that single local +    filesystem holds both source files and target `POT` templates. +   +    Intended use of `RPaths` - in `xgettext.py`:: +   +      def generate(env): +          from GettextCommon import RPaths +          ... +          sources = '$( ${_concat( "", SOURCES, "", __env__, XgettextRPaths, TARGET, SOURCES)} $)' +          env.Append( +            ... +            XGETTEXTCOM = 'XGETTEXT ... ' + sources, +            ... +            XgettextRPaths = RPaths(env) +          )      """ -    self.env = env -  # FIXME: I'm not sure, how it should be implemented (what the *args are in -  # general, what is **kw). -  def __call__(self, nodes, *args, **kw): -    """ Return nodes' paths (strings) relative to current working directory.  -     -      **Arguments**: +    # NOTE: This callable object returns pathnames of dirs/files relative to +    # current working directory. The pathname remains relative also for entries +    # that are outside of current working directory (node, that +    # SCons.Node.FS.File and siblings return absolute path in such case). For +    # simplicity we compute path relative to current working directory, this +    # seems be enough for our purposes (don't need TARGET variable and +    # SCons.Defaults.Variable_Caller stuff). -        - *nodes* ([`SCons.Node.FS.Base`]) - list of nodes. -        - *args* -  currently unused. -        - *kw* - currently unused. +    def __init__(self, env): +        """ Initialize `RPaths` callable object. +     +          **Arguments**: +     +            - *env* - a `SCons.Environment.Environment` object, defines *current +              working dir*. +        """ +        self.env = env + +    # FIXME: I'm not sure, how it should be implemented (what the *args are in +    # general, what is **kw). +    def __call__(self, nodes, *args, **kw): +        """ Return nodes' paths (strings) relative to current working directory.  +         +          **Arguments**: +     +            - *nodes* ([`SCons.Node.FS.Base`]) - list of nodes. +            - *args* -  currently unused. +            - *kw* - currently unused. +     +          **Returns**: +     +           - Tuple of strings, which represent paths relative to current working +             directory (for given environment). +        """ +        import os +        import SCons.Node.FS +        rpaths = () +        cwd = self.env.fs.getcwd().get_abspath() +        for node in nodes: +            rpath = None +            if isinstance(node, SCons.Node.FS.Base): +                rpath = os.path.relpath(node.get_abspath(), cwd) +            # FIXME: Other types possible here? +            if rpath is not None: +                rpaths += (rpath,) +        return rpaths -      **Returns**: -       - Tuple of strings, which represent paths relative to current working -         directory (for given environment). -    """ -    import os  -    import SCons.Node.FS -    rpaths = () -    cwd =  self.env.fs.getcwd().get_abspath() -    for node in nodes: -      rpath = None -      if isinstance(node, SCons.Node.FS.Base): -        rpath = os.path.relpath(node.get_abspath(), cwd) -      # FIXME: Other types possible here? -      if rpath is not None: -        rpaths += (rpath,) -    return rpaths  ############################################################################# -    +  #############################################################################  def _init_po_files(target, source, env): -  """ Action function for `POInit` builder. """ -  nop = lambda target, source, env : 0 -  if env.has_key('POAUTOINIT'): -    autoinit = env['POAUTOINIT'] -  else: -    autoinit = False -  # Well, if everything outside works well, this loop should do single -  # iteration. Otherwise we are rebuilding all the targets even, if just -  # one has changed (but is this our fault?). -  for tgt in target: -    if not tgt.exists(): -      if autoinit: -        action = SCons.Action.Action('$MSGINITCOM', '$MSGINITCOMSTR') -      else: -        msg = 'File ' + repr(str(tgt)) + ' does not exist. ' \ -            + 'If you are a translator, you can create it through: \n' \ -            + '$MSGINITCOM' -        action = SCons.Action.Action(nop, msg) -      status = action([tgt], source, env) -      if status: return status -  return 0 +    """ Action function for `POInit` builder. """ +    nop = lambda target, source, env: 0 +    if 'POAUTOINIT' in env: +        autoinit = env['POAUTOINIT'] +    else: +        autoinit = False +    # Well, if everything outside works well, this loop should do single +    # iteration. Otherwise we are rebuilding all the targets even, if just +    # one has changed (but is this our fault?). +    for tgt in target: +        if not tgt.exists(): +            if autoinit: +                action = SCons.Action.Action('$MSGINITCOM', '$MSGINITCOMSTR') +            else: +                msg = 'File ' + repr(str(tgt)) + ' does not exist. ' \ +                      + 'If you are a translator, you can create it through: \n' \ +                      + '$MSGINITCOM' +                action = SCons.Action.Action(nop, msg) +            status = action([tgt], source, env) +            if status: return status +    return 0 + +  #############################################################################  #############################################################################  def _detect_xgettext(env): -  """ Detects *xgettext(1)* binary """ -  if env.has_key('XGETTEXT'): -    return env['XGETTEXT'] -  xgettext = env.Detect('xgettext'); -  if xgettext: -    return xgettext -  raise SCons.Errors.StopError(XgettextNotFound,"Could not detect xgettext") -  return None +    """ Detects *xgettext(1)* binary """ +    if 'XGETTEXT' in env: +        return env['XGETTEXT'] +    xgettext = env.Detect('xgettext'); +    if xgettext: +        return xgettext +    raise SCons.Errors.StopError(XgettextNotFound, "Could not detect xgettext") +    return None + +  #############################################################################  def _xgettext_exists(env): -  return _detect_xgettext(env) +    return _detect_xgettext(env) + +  #############################################################################  #############################################################################  def _detect_msginit(env): -  """ Detects *msginit(1)* program. """ -  if env.has_key('MSGINIT'): -    return env['MSGINIT'] -  msginit = env.Detect('msginit'); -  if msginit: -    return msginit -  raise SCons.Errors.StopError(MsginitNotFound, "Could not detect msginit") -  return None +    """ Detects *msginit(1)* program. """ +    if 'MSGINIT' in env: +        return env['MSGINIT'] +    msginit = env.Detect('msginit'); +    if msginit: +        return msginit +    raise SCons.Errors.StopError(MsginitNotFound, "Could not detect msginit") +    return None + +  #############################################################################  def _msginit_exists(env): -  return  _detect_msginit(env) +    return _detect_msginit(env) + +  #############################################################################  #############################################################################  def _detect_msgmerge(env): -  """ Detects *msgmerge(1)* program. """ -  if env.has_key('MSGMERGE'): -    return env['MSGMERGE'] -  msgmerge = env.Detect('msgmerge'); -  if msgmerge: -    return msgmerge -  raise SCons.Errors.StopError(MsgmergeNotFound, "Could not detect msgmerge") -  return None +    """ Detects *msgmerge(1)* program. """ +    if 'MSGMERGE' in env: +        return env['MSGMERGE'] +    msgmerge = env.Detect('msgmerge'); +    if msgmerge: +        return msgmerge +    raise SCons.Errors.StopError(MsgmergeNotFound, "Could not detect msgmerge") +    return None + +  #############################################################################  def _msgmerge_exists(env): -  return  _detect_msgmerge(env) +    return _detect_msgmerge(env) + +  #############################################################################  #############################################################################  def _detect_msgfmt(env): -  """ Detects *msgmfmt(1)* program. """ -  if env.has_key('MSGFMT'): -    return env['MSGFMT'] -  msgfmt = env.Detect('msgfmt'); -  if msgfmt: -    return msgfmt -  raise SCons.Errors.StopError(MsgfmtNotFound, "Could not detect msgfmt") -  return None +    """ Detects *msgmfmt(1)* program. """ +    if 'MSGFMT' in env: +        return env['MSGFMT'] +    msgfmt = env.Detect('msgfmt'); +    if msgfmt: +        return msgfmt +    raise SCons.Errors.StopError(MsgfmtNotFound, "Could not detect msgfmt") +    return None + +  #############################################################################  def _msgfmt_exists(env): -  return _detect_msgfmt(env) +    return _detect_msgfmt(env) + +  #############################################################################  #############################################################################  def tool_list(platform, env): -  """ List tools that shall be generated by top-level `gettext` tool """ -  return [ 'xgettext', 'msginit', 'msgmerge', 'msgfmt' ] -############################################################################# +    """ List tools that shall be generated by top-level `gettext` tool """ +    return ['xgettext', 'msginit', 'msgmerge', 'msgfmt'] +############################################################################# diff --git a/src/engine/SCons/Tool/JavaCommon.py b/src/engine/SCons/Tool/JavaCommon.py index 38f4e47..5c2507d 100644 --- a/src/engine/SCons/Tool/JavaCommon.py +++ b/src/engine/SCons/Tool/JavaCommon.py @@ -5,7 +5,7 @@ Stuff for processing Java.  """  # -# 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 @@ -27,7 +27,7 @@ Stuff for processing Java.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/JavaCommon.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/JavaCommon.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os  import os.path diff --git a/src/engine/SCons/Tool/JavaCommonTests.py b/src/engine/SCons/Tool/JavaCommonTests.py index 6a67370..da405f0 100644 --- a/src/engine/SCons/Tool/JavaCommonTests.py +++ b/src/engine/SCons/Tool/JavaCommonTests.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/Tool/JavaCommonTests.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/JavaCommonTests.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os.path  import sys diff --git a/src/engine/SCons/Tool/MSCommon/__init__.py b/src/engine/SCons/Tool/MSCommon/__init__.py index 6b637fe..989ab08 100644 --- a/src/engine/SCons/Tool/MSCommon/__init__.py +++ b/src/engine/SCons/Tool/MSCommon/__init__.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/Tool/MSCommon/__init__.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/MSCommon/__init__.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  __doc__ = """  Common functions for Microsoft Visual Studio and Visual C/C++. @@ -41,7 +41,8 @@ from SCons.Tool.MSCommon.sdk import mssdk_exists, \  from SCons.Tool.MSCommon.vc import msvc_exists, \                                     msvc_setup_env, \ -                                   msvc_setup_env_once +                                   msvc_setup_env_once, \ +                                   msvc_version_to_maj_min  from SCons.Tool.MSCommon.vs import get_default_version, \                                     get_vs_by_version, \ diff --git a/src/engine/SCons/Tool/MSCommon/arch.py b/src/engine/SCons/Tool/MSCommon/arch.py index 46fb601..96f05a8 100644 --- a/src/engine/SCons/Tool/MSCommon/arch.py +++ b/src/engine/SCons/Tool/MSCommon/arch.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/Tool/MSCommon/arch.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/MSCommon/arch.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  __doc__ = """Module to define supported Windows chip architectures.  """ diff --git a/src/engine/SCons/Tool/MSCommon/common.py b/src/engine/SCons/Tool/MSCommon/common.py index 1467543..fcf623f 100644 --- a/src/engine/SCons/Tool/MSCommon/common.py +++ b/src/engine/SCons/Tool/MSCommon/common.py @@ -1,5 +1,8 @@ +""" +Common helper functions for working with the Microsoft tool chain. +"""  # -# 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 @@ -20,12 +23,9 @@  # 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/Tool/MSCommon/common.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" - -__doc__ = """ -Common helper functions for working with the Microsoft tool chain. -""" +__revision__ = "src/engine/SCons/Tool/MSCommon/common.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import copy  import os @@ -35,17 +35,17 @@ import re  import SCons.Util -logfile = os.environ.get('SCONS_MSCOMMON_DEBUG') -if logfile == '-': -    def debug(x): -        print x -elif logfile: +LOGFILE = os.environ.get('SCONS_MSCOMMON_DEBUG') +if LOGFILE == '-': +    def debug(message): +        print(message) +elif LOGFILE:      try:          import logging      except ImportError: -        debug = lambda x: open(logfile, 'a').write(x + '\n') +        debug = lambda message: open(LOGFILE, 'a').write(message + '\n')      else: -        logging.basicConfig(filename=logfile, level=logging.DEBUG) +        logging.basicConfig(filename=LOGFILE, level=logging.DEBUG)          debug = logging.debug  else:      debug = lambda x: None @@ -75,7 +75,7 @@ def is_win64():          # I structured these tests to make it easy to add new ones or          # add exceptions in the future, because this is a bit fragile.          _is_win64 = False -        if os.environ.get('PROCESSOR_ARCHITECTURE','x86') != 'x86': +        if os.environ.get('PROCESSOR_ARCHITECTURE', 'x86') != 'x86':              _is_win64 = True          if os.environ.get('PROCESSOR_ARCHITEW6432'):              _is_win64 = True @@ -113,21 +113,30 @@ def normalize_env(env, keys, force=False):      Note: the environment is copied."""      normenv = {}      if env: -        for k in env.keys(): -            normenv[k] = copy.deepcopy(env[k]).encode('mbcs') +        for k in list(env.keys()): +            normenv[k] = copy.deepcopy(env[k])          for k in keys:              if k in os.environ and (force or not k in normenv): -                normenv[k] = os.environ[k].encode('mbcs') +                normenv[k] = os.environ[k]      # This shouldn't be necessary, since the default environment should include system32,      # but keep this here to be safe, since it's needed to find reg.exe which the MSVC      # bat scripts use. -    sys32_dir = os.path.join(os.environ.get("SystemRoot", os.environ.get("windir",r"C:\Windows\system32")),"System32") +    sys32_dir = os.path.join(os.environ.get("SystemRoot", +                                            os.environ.get("windir", r"C:\Windows\system32")), +                             "System32")      if sys32_dir not in normenv['PATH']:          normenv['PATH'] = normenv['PATH'] + os.pathsep + sys32_dir +    # Without Wbem in PATH, vcvarsall.bat has a "'wmic' is not recognized" +    # error starting with Visual Studio 2017, although the script still +    # seems to work anyway. +    sys32_wbem_dir = os.path.join(sys32_dir, 'Wbem') +    if sys32_wbem_dir not in normenv['PATH']: +        normenv['PATH'] = normenv['PATH'] + os.pathsep + sys32_wbem_dir +      debug("PATH: %s"%normenv['PATH'])      return normenv @@ -144,11 +153,13 @@ def get_output(vcbat, args = None, env = None):      # execution to work.  This list should really be either directly      # controlled by vc.py, or else derived from the common_tools_var      # settings in vs.py. -    vars = [ +    vs_vc_vars = [          'COMSPEC', -# VS100 and VS110: Still set, but modern MSVC setup scripts will -# discard these if registry has values.  However Intel compiler setup -# script still requires these as of 2013/2014. +        # VS100 and VS110: Still set, but modern MSVC setup scripts will +        # discard these if registry has values.  However Intel compiler setup +        # script still requires these as of 2013/2014. +        'VS140COMNTOOLS', +        'VS120COMNTOOLS',          'VS110COMNTOOLS',          'VS100COMNTOOLS',          'VS90COMNTOOLS', @@ -157,22 +168,22 @@ def get_output(vcbat, args = None, env = None):          'VS70COMNTOOLS',          'VS60COMNTOOLS',      ] -    env['ENV'] = normalize_env(env['ENV'], vars, force=False) +    env['ENV'] = normalize_env(env['ENV'], vs_vc_vars, force=False)      if args:          debug("Calling '%s %s'" % (vcbat, args))          popen = SCons.Action._subproc(env, -                                     '"%s" %s & set' % (vcbat, args), -                                     stdin = 'devnull', -                                     stdout=subprocess.PIPE, -                                     stderr=subprocess.PIPE) +                                      '"%s" %s & set' % (vcbat, args), +                                      stdin='devnull', +                                      stdout=subprocess.PIPE, +                                      stderr=subprocess.PIPE)      else:          debug("Calling '%s'" % vcbat)          popen = SCons.Action._subproc(env, -                                     '"%s" & set' % vcbat, -                                     stdin = 'devnull', -                                     stdout=subprocess.PIPE, -                                     stderr=subprocess.PIPE) +                                      '"%s" & set' % vcbat, +                                      stdin='devnull', +                                      stdout=subprocess.PIPE, +                                      stderr=subprocess.PIPE)      # Use the .stdout and .stderr attributes directly because the      # .communicate() method uses the threading module on Windows @@ -195,10 +206,14 @@ def get_output(vcbat, args = None, env = None):      output = stdout.decode("mbcs")      return output -def parse_output(output, keep = ("INCLUDE", "LIB", "LIBPATH", "PATH")): +def parse_output(output, keep=("INCLUDE", "LIB", "LIBPATH", "PATH")): +    """ +    Parse output from running visual c++/studios vcvarsall.bat and running set +    To capture the values listed in keep +    """ +      # dkeep is a dict associating key: path_list, where key is one item from      # keep, and pat_list the associated list of paths -      dkeep = dict([(i, []) for i in keep])      # rdk will  keep the regex to match the .bat file output line starts @@ -207,22 +222,21 @@ def parse_output(output, keep = ("INCLUDE", "LIB", "LIBPATH", "PATH")):          rdk[i] = re.compile('%s=(.*)' % i, re.I)      def add_env(rmatch, key, dkeep=dkeep): -        plist = rmatch.group(1).split(os.pathsep) -        for p in plist: +        path_list = rmatch.group(1).split(os.pathsep) +        for path in path_list:              # Do not add empty paths (when a var ends with ;) -            if p: -                p = p.encode('mbcs') +            if path:                  # XXX: For some reason, VC98 .bat file adds "" around the PATH                  # values, and it screws up the environment later, so we strip                  # it. -                p = p.strip('"') -                dkeep[key].append(p) +                path = path.strip('"') +                dkeep[key].append(str(path))      for line in output.splitlines(): -        for k,v in rdk.items(): -            m = v.match(line) -            if m: -                add_env(m, k) +        for k, value in rdk.items(): +            match = value.match(line) +            if match: +                add_env(match, k)      return dkeep diff --git a/src/engine/SCons/Tool/MSCommon/netframework.py b/src/engine/SCons/Tool/MSCommon/netframework.py index 8d39cf6..b769c44 100644 --- a/src/engine/SCons/Tool/MSCommon/netframework.py +++ b/src/engine/SCons/Tool/MSCommon/netframework.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 @@ -20,7 +20,7 @@  # 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/Tool/MSCommon/netframework.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/MSCommon/netframework.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  __doc__ = """  """ @@ -29,7 +29,7 @@ import os  import re  import SCons.Util -from common import read_reg, debug +from .common import read_reg, debug  # Original value recorded by dcournapeau  _FRAMEWORKDIR_HKEY_ROOT = r'Software\Microsoft\.NETFramework\InstallRoot' @@ -40,13 +40,13 @@ def find_framework_root():      # XXX: find it from environment (FrameworkDir)      try:          froot = read_reg(_FRAMEWORKDIR_HKEY_ROOT) -        debug("Found framework install root in registry: %s" % froot) -    except SCons.Util.WinError, e: -        debug("Could not read reg key %s" % _FRAMEWORKDIR_HKEY_ROOT) +        debug("Found framework install root in registry: {}".format(froot)) +    except SCons.Util.WinError as e: +        debug("Could not read reg key {}".format(_FRAMEWORKDIR_HKEY_ROOT))          return None      if not os.path.exists(froot): -        debug("%s not found on fs" % froot) +        debug("{} not found on fs".format(froot))          return None      return froot diff --git a/src/engine/SCons/Tool/MSCommon/sdk.py b/src/engine/SCons/Tool/MSCommon/sdk.py index 53bb8aa..8bc9830 100644 --- a/src/engine/SCons/Tool/MSCommon/sdk.py +++ b/src/engine/SCons/Tool/MSCommon/sdk.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/Tool/MSCommon/sdk.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/MSCommon/sdk.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  __doc__ = """Module to detect the Platform/Windows SDK @@ -33,7 +33,7 @@ import os  import SCons.Errors  import SCons.Util -import common +from . import common  debug = common.debug @@ -76,23 +76,23 @@ class SDKDefinition(object):              return None          hkey = self.HKEY_FMT % self.hkey_data -        debug('find_sdk_dir(): checking registry:%s'%hkey) +        debug('find_sdk_dir(): checking registry:{}'.format(hkey))          try:              sdk_dir = common.read_reg(hkey) -        except SCons.Util.WinError, e: -            debug('find_sdk_dir(): no SDK registry key %s' % repr(hkey)) +        except SCons.Util.WinError as e: +            debug('find_sdk_dir(): no SDK registry key {}'.format(repr(hkey)))              return None -        debug('find_sdk_dir(): Trying SDK Dir: %s'%sdk_dir) +        debug('find_sdk_dir(): Trying SDK Dir: {}'.format(sdk_dir))          if not os.path.exists(sdk_dir): -            debug('find_sdk_dir():  %s not on file system' % sdk_dir) +            debug('find_sdk_dir():  {} not on file system'.format(sdk_dir))              return None          ftc = os.path.join(sdk_dir, self.sanity_check_file)          if not os.path.exists(ftc): -            debug("find_sdk_dir(): sanity check %s not found" % ftc) +            debug("find_sdk_dir(): sanity check {} not found".format(ftc))              return None          return sdk_dir @@ -105,7 +105,7 @@ class SDKDefinition(object):              sdk_dir = self.find_sdk_dir()              self._sdk_dir = sdk_dir              return sdk_dir -         +      def get_sdk_vc_script(self,host_arch, target_arch):          """ Return the script to initialize the VC compiler installed by SDK          """ @@ -113,11 +113,11 @@ class SDKDefinition(object):          if (host_arch == 'amd64' and target_arch == 'x86'):              # No cross tools needed compiling 32 bits on 64 bit machine              host_arch=target_arch -         +          arch_string=target_arch          if (host_arch != target_arch):              arch_string='%s_%s'%(host_arch,target_arch) -             +          debug("sdk.py: get_sdk_vc_script():arch_string:%s host_arch:%s target_arch:%s"%(arch_string,                                                             host_arch,                                                             target_arch)) @@ -164,6 +164,12 @@ SDK70VCSetupScripts =    { 'x86'      : r'bin\vcvars32.bat',                             'x86_ia64' : r'bin\vcvarsx86_ia64.bat',                             'ia64'     : r'bin\vcvarsia64.bat'} +SDK100VCSetupScripts =    {'x86'      : r'bin\vcvars32.bat', +                           'amd64'    : r'bin\vcvars64.bat', +                           'x86_amd64': r'bin\x86_amd64\vcvarsx86_amd64.bat', +                           'x86_arm'  : r'bin\x86_arm\vcvarsx86_arm.bat'} + +  # The list of support SDKs which we know how to detect.  #  # The first SDK found in the list is the one used by default if there @@ -172,6 +178,16 @@ SDK70VCSetupScripts =    { 'x86'      : r'bin\vcvars32.bat',  #  # If you update this list, update the documentation in Tool/mssdk.xml.  SupportedSDKList = [ +    WindowsSDK('10.0', +               sanity_check_file=r'bin\SetEnv.Cmd', +               include_subdir='include', +               lib_subdir={ +                   'x86'       : ['lib'], +                   'x86_64'    : [r'lib\x64'], +                   'ia64'      : [r'lib\ia64'], +               }, +               vc_setup_scripts = SDK70VCSetupScripts, +              ),      WindowsSDK('7.1',                 sanity_check_file=r'bin\SetEnv.Cmd',                 include_subdir='include', @@ -308,8 +324,7 @@ def set_sdk_by_directory(env, sdk_dir):  def get_sdk_by_version(mssdk):      if mssdk not in SupportedSDKMap: -        msg = "SDK version %s is not supported" % repr(mssdk) -        raise SCons.Errors.UserError(msg) +        raise SCons.Errors.UserError("SDK version {} is not supported".format(repr(mssdk)))      get_installed_sdks()      return InstalledSDKMap.get(mssdk) @@ -327,16 +342,16 @@ def mssdk_setup_env(env):          if sdk_dir is None:              return          sdk_dir = env.subst(sdk_dir) -        debug('sdk.py:mssdk_setup_env: Using MSSDK_DIR:%s'%sdk_dir) +        debug('sdk.py:mssdk_setup_env: Using MSSDK_DIR:{}'.format(sdk_dir))      elif 'MSSDK_VERSION' in env:          sdk_version = env['MSSDK_VERSION']          if sdk_version is None: -            msg = "SDK version is specified as None"   +            msg = "SDK version is specified as None"              raise SCons.Errors.UserError(msg)          sdk_version = env.subst(sdk_version)          mssdk = get_sdk_by_version(sdk_version)          if mssdk is None: -            msg = "SDK version %s is not installed" % sdk_version  +            msg = "SDK version %s is not installed" % sdk_version              raise SCons.Errors.UserError(msg)          sdk_dir = mssdk.get_sdk_dir()          debug('sdk.py:mssdk_setup_env: Using MSSDK_VERSION:%s'%sdk_dir) @@ -347,7 +362,7 @@ def mssdk_setup_env(env):              debug('sdk.py:mssdk_setup_env thinks msvs_version is None')              return          msvs_version = env.subst(msvs_version) -        import vs +        from . import vs          msvs = vs.get_vs_by_version(msvs_version)          debug('sdk.py:mssdk_setup_env:msvs is :%s'%msvs)          if not msvs: diff --git a/src/engine/SCons/Tool/MSCommon/vc.py b/src/engine/SCons/Tool/MSCommon/vc.py index ca8a2da..fba86af 100644 --- a/src/engine/SCons/Tool/MSCommon/vc.py +++ b/src/engine/SCons/Tool/MSCommon/vc.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 @@ -30,24 +30,25 @@  #   * test on 64 bits XP +  VS 2005 (and VS 6 if possible)  #   * SDK  #   * Assembly -__revision__ = "src/engine/SCons/Tool/MSCommon/vc.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/MSCommon/vc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  __doc__ = """Module for Visual C/C++ detection and configuration.  """  import SCons.compat  import SCons.Util +import subprocess  import os  import platform  from string import digits as string_digits  import SCons.Warnings -import common +from . import common  debug = common.debug -import sdk +from . import sdk  get_installed_sdks = sdk.get_installed_sdks @@ -108,7 +109,7 @@ def get_host_target(env):          # PROCESSOR_ARCHITECTURE.          if not host_platform:              host_platform = os.environ.get('PROCESSOR_ARCHITECTURE', '') -             +      # Retain user requested TARGET_ARCH      req_target_platform = env.get('TARGET_ARCH')      debug('vc.py:get_host_target() req_target_platform:%s'%req_target_platform) @@ -118,26 +119,28 @@ def get_host_target(env):          target_platform = req_target_platform      else:          target_platform = host_platform -         +      try:          host = _ARCH_TO_CANONICAL[host_platform.lower()] -    except KeyError, e: +    except KeyError as e:          msg = "Unrecognized host architecture %s"          raise ValueError(msg % repr(host_platform))      try:          target = _ARCH_TO_CANONICAL[target_platform.lower()] -    except KeyError, e: -        all_archs = str(_ARCH_TO_CANONICAL.keys()) +    except KeyError as e: +        all_archs = str(list(_ARCH_TO_CANONICAL.keys()))          raise ValueError("Unrecognized target architecture %s\n\tValid architectures: %s" % (target_platform, all_archs))      return (host, target,req_target_platform)  # If you update this, update SupportedVSList in Tool/MSCommon/vs.py, and the  # MSVC_VERSION documentation in Tool/msvc.xml. -_VCVER = ["14.0", "14.0Exp", "12.0", "12.0Exp", "11.0", "11.0Exp", "10.0", "10.0Exp", "9.0", "9.0Exp","8.0", "8.0Exp","7.1", "7.0", "6.0"] +_VCVER = ["14.1", "14.0", "14.0Exp", "12.0", "12.0Exp", "11.0", "11.0Exp", "10.0", "10.0Exp", "9.0", "9.0Exp","8.0", "8.0Exp","7.1", "7.0", "6.0"]  _VCVER_TO_PRODUCT_DIR = { +    '14.1' : [ +        (SCons.Util.HKEY_LOCAL_MACHINE, r'')], # Visual Studio 2017 doesn't set this registry key anymore      '14.0' : [          (SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VisualStudio\14.0\Setup\VC\ProductDir')],      '14.0Exp' : [ @@ -183,19 +186,19 @@ _VCVER_TO_PRODUCT_DIR = {          (SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VisualStudio\6.0\Setup\Microsoft Visual C++\ProductDir'),          ]  } -         +  def msvc_version_to_maj_min(msvc_version): -   msvc_version_numeric = ''.join([x for  x in msvc_version if x in string_digits + '.']) - -   t = msvc_version_numeric.split(".") -   if not len(t) == 2: -       raise ValueError("Unrecognized version %s (%s)" % (msvc_version,msvc_version_numeric)) -   try: -       maj = int(t[0]) -       min = int(t[1]) -       return maj, min -   except ValueError, e: -       raise ValueError("Unrecognized version %s (%s)" % (msvc_version,msvc_version_numeric)) +    msvc_version_numeric = ''.join([x for  x in msvc_version if x in string_digits + '.']) + +    t = msvc_version_numeric.split(".") +    if not len(t) == 2: +        raise ValueError("Unrecognized version %s (%s)" % (msvc_version,msvc_version_numeric)) +    try: +        maj = int(t[0]) +        min = int(t[1]) +        return maj, min +    except ValueError as e: +        raise ValueError("Unrecognized version %s (%s)" % (msvc_version,msvc_version_numeric))  def is_host_target_supported(host_target, msvc_version):      """Return True if the given (host, target) tuple is supported given the @@ -222,6 +225,35 @@ def is_host_target_supported(host_target, msvc_version):      return True + +def find_vc_pdir_vswhere(msvc_version): +    """ +    Find the MSVC product directory using vswhere.exe . +    Run it asking for specified version and get MSVS  install location +    :param msvc_version: +    :return: MSVC install dir +    """ +    vswhere_path = os.path.join( +        'C:\\', +        'Program Files (x86)', +        'Microsoft Visual Studio', +        'Installer', +        'vswhere.exe' +    ) +    vswhere_cmd = [vswhere_path, '-version', msvc_version, '-property', 'installationPath'] + +    if os.path.exists(vswhere_path): +        sp = subprocess.Popen(vswhere_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) +        vsdir, err = sp.communicate() +        vsdir = vsdir.decode("mbcs") +        vsdir = vsdir.rstrip() +        vc_pdir = os.path.join(vsdir, 'VC') +        return vc_pdir +    else: +        # No vswhere on system, no install info available +        return None + +  def find_vc_pdir(msvc_version):      """Try to find the product directory for the given      version. @@ -240,26 +272,31 @@ def find_vc_pdir(msvc_version):      for hkroot, key in hkeys:          try:              comps = None -            if common.is_win64(): -                try: -                    # ordinally at win64, try Wow6432Node first. -                    comps = common.read_reg(root + 'Wow6432Node\\' + key, hkroot) -                except SCons.Util.WinError, e: -                    # at Microsoft Visual Studio for Python 2.7, value is not in Wow6432Node -                    pass -            if not comps: -                # not Win64, or Microsoft Visual Studio for Python 2.7 -                comps = common.read_reg(root + key, hkroot) -        except SCons.Util.WinError, e: -            debug('find_vc_dir(): no VC registry key %s' % repr(key)) +            if not key: +                comps = find_vc_pdir_vswhere(msvc_version) +                if not comps: +                    debug('find_vc_dir(): no VC found via vswhere for version {}'.format(repr(key))) +                    raise SCons.Util.WinError +            else: +                if common.is_win64(): +                    try: +                        # ordinally at win64, try Wow6432Node first. +                        comps = common.read_reg(root + 'Wow6432Node\\' + key, hkroot) +                    except SCons.Util.WinError as e: +                        # at Microsoft Visual Studio for Python 2.7, value is not in Wow6432Node +                        pass +                if not comps: +                    # not Win64, or Microsoft Visual Studio for Python 2.7 +                    comps = common.read_reg(root + key, hkroot) +        except SCons.Util.WinError as e: +            debug('find_vc_dir(): no VC registry key {}'.format(repr(key)))          else: -            debug('find_vc_dir(): found VC in registry: %s' % comps) +            debug('find_vc_dir(): found VC in registry: {}'.format(comps))              if os.path.exists(comps):                  return comps              else: -                debug('find_vc_dir(): reg says dir is %s, but it does not exist. (ignoring)'\ -                          % comps) -                raise MissingConfiguration("registry dir %s not found on the filesystem" % comps) +                debug('find_vc_dir(): reg says dir is {}, but it does not exist. (ignoring)'.format(comps)) +                raise MissingConfiguration("registry dir {} not found on the filesystem".format(comps))      return None  def find_batch_file(env,msvc_version,host_arch,target_arch): @@ -270,8 +307,8 @@ def find_batch_file(env,msvc_version,host_arch,target_arch):      pdir = find_vc_pdir(msvc_version)      if pdir is None:          raise NoVersionFound("No version of Visual Studio found") -         -    debug('vc.py: find_batch_file() pdir:%s'%pdir) + +    debug('vc.py: find_batch_file() pdir:{}'.format(pdir))      # filter out e.g. "Exp" from the version name      msvc_ver_numeric = ''.join([x for x in msvc_version if x in string_digits + "."]) @@ -282,13 +319,15 @@ def find_batch_file(env,msvc_version,host_arch,target_arch):      elif vernum < 7:          pdir = os.path.join(pdir, "Bin")          batfilename = os.path.join(pdir, "vcvars32.bat") -    else: # >= 8 +    elif 8 <= vernum <= 14:          batfilename = os.path.join(pdir, "vcvarsall.bat") +    else:  # vernum >= 14.1  VS2017 and above +        batfilename = os.path.join(pdir, "Auxiliary", "Build", "vcvarsall.bat")      if not os.path.exists(batfilename):          debug("Not found: %s" % batfilename)          batfilename = None -     +      installed_sdks=get_installed_sdks()      for _sdk in installed_sdks:          sdk_bat_file = _sdk.get_sdk_vc_script(host_arch,target_arch) @@ -296,7 +335,7 @@ def find_batch_file(env,msvc_version,host_arch,target_arch):              debug("vc.py:find_batch_file() not found:%s"%_sdk)          else:              sdk_bat_file_path = os.path.join(pdir,sdk_bat_file) -            if os.path.exists(sdk_bat_file_path):  +            if os.path.exists(sdk_bat_file_path):                  debug('vc.py:find_batch_file() sdk_bat_file_path:%s'%sdk_bat_file_path)                  return (batfilename,sdk_bat_file_path)      return (batfilename,None) @@ -323,7 +362,7 @@ def get_installed_vcs():                  installed_versions.append(ver)              else:                  debug('find_vc_pdir return None for ver %s' % ver) -        except VisualCException, e: +        except VisualCException as e:              debug('did not find VC %s: caught exception %s' % (ver, str(e)))      return installed_versions @@ -359,7 +398,7 @@ def get_default_version(env):      msvc_version = env.get('MSVC_VERSION')      msvs_version = env.get('MSVS_VERSION') -     +      debug('get_default_version(): msvc_version:%s msvs_version:%s'%(msvc_version,msvs_version))      if msvs_version and not msvc_version: @@ -409,7 +448,7 @@ def msvc_find_valid_batch_script(env,version):      try_target_archs = [target_platform]      debug("msvs_find_valid_batch_script(): req_target_platform %s target_platform:%s"%(req_target_platform,target_platform)) -    # VS2012 has a "cross compile" environment to build 64 bit  +    # VS2012 has a "cross compile" environment to build 64 bit      # with x86_amd64 as the argument to the batch setup script      if req_target_platform in ('amd64','x86_64'):          try_target_archs.append('x86_amd64') @@ -427,7 +466,7 @@ def msvc_find_valid_batch_script(env,version):      for tp in try_target_archs:          # Set to current arch.          env['TARGET_ARCH']=tp -         +          debug("vc.py:msvc_find_valid_batch_script() trying target_platform:%s"%tp)          host_target = (host_platform, tp)          if not is_host_target_supported(host_target, version): @@ -436,11 +475,19 @@ def msvc_find_valid_batch_script(env,version):              SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg)          arg = _HOST_TARGET_ARCH_TO_BAT_ARCH[host_target] +        # Get just version numbers +        maj, min = msvc_version_to_maj_min(version) +        # VS2015+ +        if maj >= 14: +            if env.get('MSVC_UWP_APP') == '1': +                # Initialize environment variables with store/universal paths +                arg += ' store' +          # Try to locate a batch file for this host/target platform combo          try:              (vc_script,sdk_script) = find_batch_file(env,version,host_platform,tp)              debug('vc.py:msvc_find_valid_batch_script() vc_script:%s sdk_script:%s'%(vc_script,sdk_script)) -        except VisualCException, e: +        except VisualCException as e:              msg = str(e)              debug('Caught exception while looking for batch file (%s)' % msg)              warn_msg = "VC version %s not installed.  " + \ @@ -449,13 +496,13 @@ def msvc_find_valid_batch_script(env,version):              warn_msg = warn_msg % (version, cached_get_installed_vcs())              SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg)              continue -         +          # Try to use the located batch file for this host/target platform combo          debug('vc.py:msvc_find_valid_batch_script() use_script 2 %s, args:%s\n' % (repr(vc_script), arg))          if vc_script:              try:                  d = script_env(vc_script, args=arg) -            except BatchFileExecutionError, e: +            except BatchFileExecutionError as e:                  debug('vc.py:msvc_find_valid_batch_script() use_script 3: failed running VC script %s: %s: Error:%s'%(repr(vc_script),arg,e))                  vc_script=None                  continue @@ -463,23 +510,23 @@ def msvc_find_valid_batch_script(env,version):              debug('vc.py:msvc_find_valid_batch_script() use_script 4: trying sdk script: %s'%(sdk_script))              try:                  d = script_env(sdk_script) -            except BatchFileExecutionError,e: +            except BatchFileExecutionError as e:                  debug('vc.py:msvc_find_valid_batch_script() use_script 5: failed running SDK script %s: Error:%s'%(repr(sdk_script),e))                  continue          elif not vc_script and not sdk_script:              debug('vc.py:msvc_find_valid_batch_script() use_script 6: Neither VC script nor SDK script found')              continue -         +          debug("vc.py:msvc_find_valid_batch_script() Found a working script/target: %s %s"%(repr(sdk_script),arg))          break # We've found a working target_platform, so stop looking -     +      # If we cannot find a viable installed compiler, reset the TARGET_ARCH      # To it's initial value      if not d:          env['TARGET_ARCH']=req_target_platform -     +      return d -     +  def msvc_setup_env(env):      debug('msvc_setup_env()') @@ -498,12 +545,12 @@ def msvc_setup_env(env):      env['MSVS_VERSION'] = version      env['MSVS'] = {} -     +      use_script = env.get('MSVC_USE_SCRIPT', True)      if SCons.Util.is_String(use_script):          debug('vc.py:msvc_setup_env() use_script 1 %s\n' % repr(use_script))          d = script_env(use_script) -    elif use_script:       +    elif use_script:          d = msvc_find_valid_batch_script(env,version)          debug('vc.py:msvc_setup_env() use_script 2 %s\n' % d)          if not d: @@ -524,4 +571,3 @@ def msvc_exists(version=None):      if version is None:          return len(vcs) > 0      return version in vcs -     diff --git a/src/engine/SCons/Tool/MSCommon/vs.py b/src/engine/SCons/Tool/MSCommon/vs.py index 1f04cbe..dafdbaf 100644 --- a/src/engine/SCons/Tool/MSCommon/vs.py +++ b/src/engine/SCons/Tool/MSCommon/vs.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/Tool/MSCommon/vs.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/MSCommon/vs.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  __doc__ = """Module to detect Visual Studio and/or Visual C/C++  """ @@ -31,7 +31,7 @@ import os  import SCons.Errors  import SCons.Util -from common import debug, \ +from .common import debug, \                     get_output, \                     is_win64, \                     normalize_env, \ @@ -83,10 +83,10 @@ class VisualStudio(object):              key = root + key              try:                  comps = read_reg(key) -            except SCons.Util.WinError, e: -                debug('find_vs_dir_by_reg(): no VS registry key %s' % repr(key)) +            except SCons.Util.WinError as e: +                debug('find_vs_dir_by_reg(): no VS registry key {}'.format(repr(key)))              else: -                debug('find_vs_dir_by_reg(): found VS in registry: %s' % comps) +                debug('find_vs_dir_by_reg(): found VS in registry: {}'.format(comps))                  return comps          return None @@ -105,12 +105,12 @@ class VisualStudio(object):      def find_executable(self):          vs_dir = self.get_vs_dir()          if not vs_dir: -            debug('find_executable():  no vs_dir (%s)'%vs_dir) +            debug('find_executable():  no vs_dir ({})'.format(vs_dir))              return None          executable = os.path.join(vs_dir, self.executable_path)          executable = os.path.normpath(executable)          if not os.path.isfile(executable): -            debug('find_executable():  %s not on file system' % executable) +            debug('find_executable():  {} not on file system'.format(executable))              return None          return executable @@ -199,17 +199,28 @@ class VisualStudio(object):  # Tool/MSCommon/vc.py, and the MSVC_VERSION documentation in Tool/msvc.xml.  SupportedVSList = [ +    # Visual Studio 2017 +    VisualStudio('14.1', +                 vc_version='14.1', +                 sdk_version='10.0A', +                 hkeys=[], +                 common_tools_var='VS150COMNTOOLS', +                 executable_path=r'Common7\IDE\devenv.com', +                 batch_file_path=r'VC\Auxiliary\Build\vsvars32.bat', +                 supported_arch=['x86', 'amd64', "arm"], +                 ), +      # Visual Studio 2015      VisualStudio('14.0',                   vc_version='14.0', -                 sdk_version='10.0A', +                 sdk_version='10.0',                   hkeys=[r'Microsoft\VisualStudio\14.0\Setup\VS\ProductDir'],                   common_tools_var='VS140COMNTOOLS',                   executable_path=r'Common7\IDE\devenv.com',                   batch_file_path=r'Common7\Tools\vsvars32.bat',                   supported_arch=['x86', 'amd64', "arm"],      ), -  +      # Visual C++ 2015 Express Edition (for Desktop)      VisualStudio('14.0Exp',                   vc_version='14.0', diff --git a/src/engine/SCons/Tool/Perforce.py b/src/engine/SCons/Tool/Perforce.py deleted file mode 100644 index 212150a..0000000 --- a/src/engine/SCons/Tool/Perforce.py +++ /dev/null @@ -1,99 +0,0 @@ -"""SCons.Tool.Perforce.py - -Tool-specific initialization for Perforce Source Code Management system. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# Copyright (c) 2001 - 2016 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/Tool/Perforce.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" - -import os - -import SCons.Action -import SCons.Builder -import SCons.Node.FS -import SCons.Util - - -# Variables that we want to import from the base OS environment. -_import_env = [ 'P4PORT', 'P4CLIENT', 'P4USER', 'USER', 'USERNAME', 'P4PASSWD', -                'P4CHARSET', 'P4LANGUAGE', 'SystemRoot' ] - -PerforceAction = SCons.Action.Action('$P4COM', '$P4COMSTR') - -def generate(env): -    """Add a Builder factory function and construction variables for -    Perforce to an Environment.""" - -    def PerforceFactory(env=env): -        """ """ -        import SCons.Warnings as W -        W.warn(W.DeprecatedSourceCodeWarning, """The Perforce() factory is deprecated and there is no replacement.""") -        return SCons.Builder.Builder(action = PerforceAction, env = env) - -    env.Perforce = PerforceFactory - -    env['P4']      = 'p4' -    env['P4FLAGS'] = SCons.Util.CLVar('') -    env['P4COM']   = '$P4 $P4FLAGS sync $TARGET' -    try: -        environ = env['ENV'] -    except KeyError: -        environ = {} -        env['ENV'] = environ - -    # Perforce seems to use the PWD environment variable rather than -    # calling getcwd() for itself, which is odd.  If no PWD variable -    # is present, p4 WILL call getcwd, but this seems to cause problems -    # with good ol' Windows's tilde-mangling for long file names. -    environ['PWD'] = env.Dir('#').get_abspath() - -    for var in _import_env: -        v = os.environ.get(var) -        if v: -            environ[var] = v - -    if SCons.Util.can_read_reg: -        # If we can read the registry, add the path to Perforce to our environment. -        try: -            k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, -                                      'Software\\Perforce\\environment') -            val, tok = SCons.Util.RegQueryValueEx(k, 'P4INSTROOT') -            SCons.Util.AddPathIfNotExists(environ, 'PATH', val) -        except SCons.Util.RegError: -            # Can't detect where Perforce is, hope the user has it set in the -            # PATH. -            pass - -def exists(env): -    return env.Detect('p4') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/src/engine/SCons/Tool/Perforce.xml b/src/engine/SCons/Tool/Perforce.xml deleted file mode 100644 index 2431c72..0000000 --- a/src/engine/SCons/Tool/Perforce.xml +++ /dev/null @@ -1,129 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -Copyright (c) 2001 - 2016 The SCons Foundation - -This file is processed by the bin/SConsDoc.py module. -See its __doc__ string for a discussion of the format. ---> - -<!DOCTYPE sconsdoc [ -<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'> -%scons; -<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'> -%builders-mod; -<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'> -%functions-mod; -<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'> -%tools-mod; -<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'> -%variables-mod; -]> - -<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0" -          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -          xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd"> - -<tool name="Perforce"> -<summary> -<para> -Sets construction variables for interacting with the -Perforce source code management system. -</para> -</summary> -<sets> -<item>P4</item> -<item>P4FLAGS</item> -<item>P4COM</item> -</sets> -<uses> -<item>P4COMSTR</item> -</uses> -</tool> - -<cvar name="P4"> -<summary> -<para> -The Perforce executable. -</para> -</summary> -</cvar> - -<cvar name="P4COM"> -<summary> -<para> -The command line used to -fetch source files from Perforce. -</para> -</summary> -</cvar> - -<cvar name="P4COMSTR"> -<summary> -<para> -The string displayed when -fetching a source file from Perforce. -If this is not set, then &cv-link-P4COM; (the command line) is displayed. -</para> -</summary> -</cvar> - -<cvar name="P4FLAGS"> -<summary> -<para> -General options that are passed to Perforce. -</para> -</summary> -</cvar> - -<scons_function name="Perforce"> -<arguments signature="env"> -() -</arguments> -<summary> -<para> -A factory function that -returns a Builder object -to be used to fetch source files -from the Perforce source code management system. -The returned Builder -is intended to be passed to the -&f-SourceCode; -function. -</para> - -<para> -This function is deprecated.  For details, see the entry for the -&f-SourceCode; -function. -</para> - -<para> -Example: -</para> - -<example_commands> -env.SourceCode('.', env.Perforce()) -</example_commands> - -<para> -Perforce uses a number of external -environment variables for its operation. -Consequently, this function adds the -following variables from the user's external environment -to the construction environment's -ENV dictionary: -P4CHARSET, -P4CLIENT, -P4LANGUAGE, -P4PASSWD, -P4PORT, -P4USER, -SystemRoot, -USER, -and -USERNAME. -</para> -</summary> -</scons_function> - -</sconsdoc> diff --git a/src/engine/SCons/Tool/PharLapCommon.py b/src/engine/SCons/Tool/PharLapCommon.py index ccc2004..c45c6d3 100644 --- a/src/engine/SCons/Tool/PharLapCommon.py +++ b/src/engine/SCons/Tool/PharLapCommon.py @@ -7,7 +7,7 @@ Phar Lap ETS tool chain.  Right now, this is linkloc and  """  # -# 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 @@ -29,7 +29,7 @@ Phar Lap ETS tool chain.  Right now, this is linkloc and  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/PharLapCommon.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/PharLapCommon.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os  import os.path diff --git a/src/engine/SCons/Tool/RCS.xml b/src/engine/SCons/Tool/RCS.xml deleted file mode 100644 index 3c034e4..0000000 --- a/src/engine/SCons/Tool/RCS.xml +++ /dev/null @@ -1,142 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -Copyright (c) 2001 - 2016 The SCons Foundation - -This file is processed by the bin/SConsDoc.py module. -See its __doc__ string for a discussion of the format. ---> - -<!DOCTYPE sconsdoc [ -<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'> -%scons; -<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'> -%builders-mod; -<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'> -%functions-mod; -<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'> -%tools-mod; -<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'> -%variables-mod; -]> - -<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0" -          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -          xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd"> - -<tool name="RCS"> -<summary> -<para> -Sets construction variables for the interaction -with the Revision Control System. -</para> -</summary> -<sets> -<item>RCS</item> -<item>RCS_CO</item> -<item>RCS_COFLAGS</item> -<item>RCS_COCOM</item> -</sets> -<uses> -<item>RCS_COCOMSTR</item> -</uses> -</tool> - -<cvar name="RCS"> -<summary> -<para> -The RCS executable. -Note that this variable is not actually used -for the command to fetch source files from RCS; -see the -&cv-link-RCS_CO; -construction variable, below. -</para> -</summary> -</cvar> - -<cvar name="RCS_CO"> -<summary> -<para> -The RCS "checkout" executable, -used to fetch source files from RCS. -</para> -</summary> -</cvar> - -<cvar name="RCS_COCOM"> -<summary> -<para> -The command line used to -fetch (checkout) source files from RCS. -</para> -</summary> -</cvar> - -<cvar name="RCS_COCOMSTR"> -<summary> -<para> -The string displayed when fetching -a source file from RCS. -If this is not set, then &cv-link-RCS_COCOM; -(the command line) is displayed. -</para> -</summary> -</cvar> - -<cvar name="RCS_COFLAGS"> -<summary> -<para> -Options that are passed to the &cv-link-RCS_CO; command. -</para> -</summary> -</cvar> - -<scons_function name="RCS"> -<arguments signature="env"> -() -</arguments> -<summary> -<para> -A factory function that -returns a Builder object -to be used to fetch source files -from RCS. -The returned Builder -is intended to be passed to the -&f-SourceCode; -function: -</para> - -<para> -This function is deprecated.  For details, see the entry for the -&f-SourceCode; -function. -</para> - -<para> -Examples: -</para> - -<example_commands> -env.SourceCode('.', env.RCS()) -</example_commands> - -<para> -Note that -&scons; -will fetch source files -from RCS subdirectories automatically, -so configuring RCS -as demonstrated in the above example -should only be necessary if -you are fetching from -RCS,v -files in the same -directory as the source files, -or if you need to explicitly specify RCS -for a specific subdirectory. -</para> -</summary> -</scons_function> - -</sconsdoc> diff --git a/src/engine/SCons/Tool/SCCS.xml b/src/engine/SCons/Tool/SCCS.xml deleted file mode 100644 index 97c72a9..0000000 --- a/src/engine/SCons/Tool/SCCS.xml +++ /dev/null @@ -1,133 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -Copyright (c) 2001 - 2016 The SCons Foundation - -This file is processed by the bin/SConsDoc.py module. -See its __doc__ string for a discussion of the format. ---> - -<!DOCTYPE sconsdoc [ -<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'> -%scons; -<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'> -%builders-mod; -<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'> -%functions-mod; -<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'> -%tools-mod; -<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'> -%variables-mod; -]> - -<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0" -          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -          xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd"> - -<tool name="SCCS"> -<summary> -<para> -Sets construction variables for interacting with the -Source Code Control System. -</para> -</summary> -<sets> -<item>SCCS</item> -<item>SCCSFLAGS</item> -<item>SCCSGETFLAGS</item> -<item>SCCSCOM</item> -</sets> -<uses> -<item>SCCSCOMSTR</item> -</uses> -</tool> - -<cvar name="SCCS"> -<summary> -<para> -The SCCS executable. -</para> -</summary> -</cvar> - -<cvar name="SCCSCOM"> -<summary> -<para> -The command line used to -fetch source files from SCCS. -</para> -</summary> -</cvar> - -<cvar name="SCCSCOMSTR"> -<summary> -<para> -The string displayed when fetching -a source file from a CVS repository. -If this is not set, then &cv-link-SCCSCOM; -(the command line) is displayed. -</para> -</summary> -</cvar> - -<cvar name="SCCSFLAGS"> -<summary> -<para> -General options that are passed to SCCS. -</para> -</summary> -</cvar> - -<cvar name="SCCSGETFLAGS"> -<summary> -<para> -Options that are passed specifically to the SCCS "get" subcommand. -This can be set, for example, to -<option>-e</option> -to check out editable files from SCCS. -</para> -</summary> -</cvar> - -<scons_function name="SCCS"> -<arguments signature="env"> -() -</arguments> -<summary> -<para> -A factory function that -returns a Builder object -to be used to fetch source files -from SCCS. -The returned Builder -is intended to be passed to the -&f-link-SourceCode; -function. -</para> - -<para> -Example: -</para> - -<example_commands> -env.SourceCode('.', env.SCCS()) -</example_commands> - -<para> -Note that -&scons; -will fetch source files -from SCCS subdirectories automatically, -so configuring SCCS -as demonstrated in the above example -should only be necessary if -you are fetching from -<filename>s.SCCS</filename> -files in the same -directory as the source files, -or if you need to explicitly specify SCCS -for a specific subdirectory. -</para> -</summary> -</scons_function> - -</sconsdoc> diff --git a/src/engine/SCons/Tool/Subversion.xml b/src/engine/SCons/Tool/Subversion.xml deleted file mode 100644 index 2d8fd26..0000000 --- a/src/engine/SCons/Tool/Subversion.xml +++ /dev/null @@ -1,135 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -Copyright (c) 2001 - 2016 The SCons Foundation - -This file is processed by the bin/SConsDoc.py module. -See its __doc__ string for a discussion of the format. ---> - -<!DOCTYPE sconsdoc [ -<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'> -%scons; -<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'> -%builders-mod; -<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'> -%functions-mod; -<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'> -%tools-mod; -<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'> -%variables-mod; -]> - -<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0" -          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -          xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd"> - -<!-- -<tool name="Subversion"> -<summary> -<para> -Sets construction variables for interacting with Subversion. -</para> -</summary> -<sets> -<item>SVN</item> -<item>SVNFLAGS</item> -<item>SVNCOM</item> -</sets> -<uses> -<item>SVNCOMSTR</item> -</uses> -</tool> ---> - -<!-- -<cvar name="SVN"> -<summary> -<para> -The Subversion executable (usually named -<command>svn</command>). -</para> -</summary> -</cvar> ---> - -<!-- -<cvar name="SVNCOM"> -<summary> -<para> -The command line used to -fetch source files from a Subversion repository. -</para> -</summary> -</cvar> ---> - -<!-- -<cvar name="SVNFLAGS"> -<summary> -<para> -General options that are passed to Subversion. -</para> -</summary> -</cvar> ---> - -<!-- -<scons_function name="Subversion"> -<arguments signature="global"> -(repository, module) -</arguments> -<summary> -<para> -A factory function that -returns a Builder object -to be used to fetch source files -from the specified Subversion -<varname>repository</varname>. -The returned Builder -is intended to be passed to the -&f-link-SourceCode; -function. -</para> - -<para> -The optional specified -<varname>module</varname> -will be added to the beginning -of all repository path names; -this can be used, in essence, -to strip initial directory names -from the repository path names, -so that you only have to -replicate part of the repository -directory hierarchy in your -local build directory. -</para> - -<para> -This function is deprecated, see the entry for the -&f-SourceCode; -function. -</para> - -<para> -Example: -</para> - -<example_commands> -# Will fetch foo/bar/src.c -# from /usr/local/Subversion/foo/bar/src.c. -env.SourceCode('.', env.Subversion('file:///usr/local/Subversion')) - -# Will fetch bar/src.c -# from /usr/local/Subversion/foo/bar/src.c. -env.SourceCode('.', env.Subversion('file:///usr/local/Subversion', 'foo')) - -# Will fetch src.c -# from /usr/local/Subversion/foo/bar/src.c. -env.SourceCode('.', env.Subversion('file:///usr/local/Subversion', 'foo/bar')) -</example_commands> -</summary> -</scons_function> ---> - -</sconsdoc> diff --git a/src/engine/SCons/Tool/ToolTests.py b/src/engine/SCons/Tool/ToolTests.py index 0739063..f5678c1 100644 --- a/src/engine/SCons/Tool/ToolTests.py +++ b/src/engine/SCons/Tool/ToolTests.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/Tool/ToolTests.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/ToolTests.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import sys  import unittest diff --git a/src/engine/SCons/Tool/__init__.py b/src/engine/SCons/Tool/__init__.py index 274b563..9265b81 100644 --- a/src/engine/SCons/Tool/__init__.py +++ b/src/engine/SCons/Tool/__init__.py @@ -14,7 +14,7 @@ tool definition.  """  # -# 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 @@ -35,14 +35,16 @@ tool definition.  # 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/Tool/__init__.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/__init__.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import imp +import importlib  import sys  import re  import os  import shutil +  import SCons.Builder  import SCons.Errors  import SCons.Node.FS @@ -52,6 +54,7 @@ import SCons.Scanner.D  import SCons.Scanner.LaTeX  import SCons.Scanner.Prog  import SCons.Scanner.SWIG +import collections  DefaultToolpath=[] @@ -94,9 +97,20 @@ for suffix in LaTeXSuffixes:      SourceFileScanner.add_scanner(suffix, LaTeXScanner)      SourceFileScanner.add_scanner(suffix, PDFLaTeXScanner) + +# Tool aliases are needed for those tools whos module names also +# occur in the python standard library. This causes module shadowing and +# can break using python library functions under python3 +TOOL_ALIASES = { +    'gettext':'gettext_tool', +    'clang++': 'clangxx', +} +  class Tool(object):      def __init__(self, name, toolpath=[], **kw): -        self.name = name + +        # Rename if there's a TOOL_ALIAS for this tool +        self.name = TOOL_ALIASES.get(name,name)          self.toolpath = toolpath + DefaultToolpath          # remember these so we can merge them into the call          self.init_kw = kw @@ -107,35 +121,124 @@ class Tool(object):          if hasattr(module, 'options'):              self.options = module.options +    def _load_dotted_module_py2(self, short_name, full_name, searchpaths=None): +        splitname = short_name.split('.') +        index = 0 +        srchpths = searchpaths +        for item in splitname: +            file, path, desc = imp.find_module(item, srchpths) +            mod = imp.load_module(full_name, file, path, desc) +            srchpths = [path] +        return mod, file +      def _tool_module(self): -        # TODO: Interchange zipimport with normal initialization for better error reporting          oldpythonpath = sys.path          sys.path = self.toolpath + sys.path +        # sys.stderr.write("Tool:%s\nPATH:%s\n"%(self.name,sys.path)) -        try: +        if sys.version_info[0] < 3 or (sys.version_info[0] == 3 and sys.version_info[1] in (0,1,2,3,4)): +            # Py 2 code              try: -                file, path, desc = imp.find_module(self.name, self.toolpath)                  try: -                    return imp.load_module(self.name, file, path, desc) -                finally: -                    if file: -                        file.close() -            except ImportError, e: -                if str(e)!="No module named %s"%self.name: -                    raise SCons.Errors.EnvironmentError(e) -                try: -                    import zipimport -                except ImportError: -                    pass +                    file = None +                    try: +                        mod, file = self._load_dotted_module_py2(self.name, self.name, self.toolpath) +                        return mod +                    finally: +                        if file: +                            file.close() +                except ImportError as e: +                    splitname = self.name.split('.') +                    if str(e)!="No module named %s"%splitname[0]: +                        raise SCons.Errors.EnvironmentError(e) +                    try: +                        import zipimport +                    except ImportError: +                        pass +                    else: +                        for aPath in self.toolpath: +                            try: +                                importer = zipimport.zipimporter(aPath) +                                return importer.load_module(self.name) +                            except ImportError as e: +                                pass +            finally: +                sys.path = oldpythonpath +        elif sys.version_info[1] > 4: +            # From: http://stackoverflow.com/questions/67631/how-to-import-a-module-given-the-full-path/67692#67692 +            # import importlib.util +            # spec = importlib.util.spec_from_file_location("module.name", "/path/to/file.py") +            # foo = importlib.util.module_from_spec(spec) +            # spec.loader.exec_module(foo) +            # foo.MyClass() +            # Py 3 code + +            # import pdb; pdb.set_trace() +            import importlib.util + +            # sys.stderr.write("toolpath:%s\n" % self.toolpath) +            # sys.stderr.write("SCONS.TOOL path:%s\n" % sys.modules['SCons.Tool'].__path__) +            debug = False +            spec = None +            found_name = self.name +            add_to_scons_tools_namespace = False +            for path in self.toolpath: +                sepname = self.name.replace('.', os.path.sep) +                file_path = os.path.join(path, "%s.py"%sepname) +                file_package = os.path.join(path, sepname) + +                if debug: sys.stderr.write("Trying:%s %s\n"%(file_path, file_package)) + +                if os.path.isfile(file_path): +                    spec = importlib.util.spec_from_file_location(self.name, file_path) +                    if debug: print("file_Path:%s FOUND"%file_path) +                    break +                elif os.path.isdir(file_package): +                    file_package = os.path.join(file_package, '__init__.py') +                    spec = importlib.util.spec_from_file_location(self.name, file_package) +                    if debug: print("PACKAGE:%s Found"%file_package) +                    break +                  else: -                    for aPath in self.toolpath: -                        try: -                            importer = zipimport.zipimporter(aPath) -                            return importer.load_module(self.name) -                        except ImportError, e: -                            pass -        finally: -            sys.path = oldpythonpath +                    continue + +            if spec is None: +                if debug: sys.stderr.write("NO SPEC :%s\n"%self.name) +                spec = importlib.util.find_spec("."+self.name, package='SCons.Tool') +                if spec: +                    found_name = 'SCons.Tool.'+self.name +                    add_to_scons_tools_namespace = True +                if debug: sys.stderr.write("Spec Found? .%s :%s\n"%(self.name, spec)) + +            if spec is None: +                error_string = "No module named %s"%self.name +                raise SCons.Errors.EnvironmentError(error_string) + +            module = importlib.util.module_from_spec(spec) +            if module is None: +                if debug: print("MODULE IS NONE:%s"%self.name) +                error_string = "No module named %s"%self.name +                raise SCons.Errors.EnvironmentError(error_string) + +            # Don't reload a tool we already loaded. +            sys_modules_value = sys.modules.get(found_name,False) +            if sys_modules_value and sys_modules_value.__file__ == spec.origin: +                return sys.modules[found_name] +            else: +                # Not sure what to do in the case that there already +                # exists sys.modules[self.name] but the source file is +                # different.. ? +                module = spec.loader.load_module(spec.name) + +                sys.modules[found_name] = module +                if add_to_scons_tools_namespace: +                    # If we found it in SCons.Tool, then add it to the module +                    setattr(SCons.Tool, self.name, module) + +                return module + + +        sys.path = oldpythonpath          full_name = 'SCons.Tool.' + self.name          try: @@ -144,13 +247,12 @@ class Tool(object):              try:                  smpath = sys.modules['SCons.Tool'].__path__                  try: -                    file, path, desc = imp.find_module(self.name, smpath) -                    module = imp.load_module(full_name, file, path, desc) +                    module, file = self._load_dotted_module_py2(self.name, full_name, smpath)                      setattr(SCons.Tool, self.name, module)                      if file:                          file.close()                      return module -                except ImportError, e: +                except ImportError as e:                      if str(e)!="No module named %s"%self.name:                          raise SCons.Errors.EnvironmentError(e)                      try: @@ -159,10 +261,10 @@ class Tool(object):                          module = importer.load_module(full_name)                          setattr(SCons.Tool, self.name, module)                          return module -                    except ImportError, e: +                    except ImportError as e:                          m = "No tool named '%s': %s" % (self.name, e)                          raise SCons.Errors.EnvironmentError(m) -            except ImportError, e: +            except ImportError as e:                  m = "No tool named '%s': %s" % (self.name, e)                  raise SCons.Errors.EnvironmentError(m) @@ -217,6 +319,7 @@ def createProgBuilder(env):      return program +  def createStaticLibBuilder(env):      """This is a utility function that creates the StaticLibrary      Builder in an Environment if it is not there already. @@ -228,7 +331,7 @@ def createStaticLibBuilder(env):          static_lib = env['BUILDERS']['StaticLibrary']      except KeyError:          action_list = [ SCons.Action.Action("$ARCOM", "$ARCOMSTR") ] -        if env.Detect('ranlib'): +        if env.get('RANLIB',False) or env.Detect('ranlib'):              ranlib_action = SCons.Action.Action("$RANLIBCOM", "$RANLIBCOMSTR")              action_list.append(ranlib_action) @@ -254,22 +357,22 @@ def _call_linker_cb(env, callback, args, result = None):      Verbose = False      if Verbose: -        print '_call_linker_cb: args=%r' % args -        print '_call_linker_cb: callback=%r' % callback -     +        print('_call_linker_cb: args=%r' % args) +        print('_call_linker_cb: callback=%r' % callback) +      try:          cbfun = env['LINKCALLBACKS'][callback]      except (KeyError, TypeError):          if Verbose: -            print '_call_linker_cb: env["LINKCALLBACKS"][%r] not found or can not be used' % callback +            print('_call_linker_cb: env["LINKCALLBACKS"][%r] not found or can not be used' % callback)          pass      else:          if Verbose: -            print '_call_linker_cb: env["LINKCALLBACKS"][%r] found' % callback -            print '_call_linker_cb: env["LINKCALLBACKS"][%r]=%r' % (callback, cbfun) -        if(callable(cbfun)): +            print('_call_linker_cb: env["LINKCALLBACKS"][%r] found' % callback) +            print('_call_linker_cb: env["LINKCALLBACKS"][%r]=%r' % (callback, cbfun)) +        if(isinstance(cbfun, collections.Callable)):              if Verbose: -                print '_call_linker_cb: env["LINKCALLBACKS"][%r] is callable' % callback +                print('_call_linker_cb: env["LINKCALLBACKS"][%r] is callable' % callback)              result = cbfun(env, *args)      return result @@ -388,7 +491,7 @@ class _LibInfoGeneratorBase(object):      def generate_versioned_lib_info(self, env, args, result = None, **kw):          callback = self.get_versioned_lib_info_generator(**kw) -        return _call_linker_cb(env, callback, args, result)  +        return _call_linker_cb(env, callback, args, result)  class _LibPrefixGenerator(_LibInfoGeneratorBase):      """Library prefix generator, used as target_prefix in SharedLibrary and @@ -407,17 +510,17 @@ class _LibPrefixGenerator(_LibInfoGeneratorBase):          prefix = self.get_lib_prefix(env,**kw2)          if Verbose: -            print "_LibPrefixGenerator: input prefix=%r" % prefix +            print("_LibPrefixGenerator: input prefix=%r" % prefix)          version = self.get_lib_version(env, **kw2)          if Verbose: -            print "_LibPrefixGenerator: version=%r" % version +            print("_LibPrefixGenerator: version=%r" % version)          if version:              prefix = self.generate_versioned_lib_info(env, [prefix, version], prefix, **kw2)          if Verbose: -            print "_LibPrefixGenerator: return prefix=%r" % prefix +            print("_LibPrefixGenerator: return prefix=%r" % prefix)          return prefix  ShLibPrefixGenerator  = _LibPrefixGenerator('ShLib') @@ -441,17 +544,17 @@ class _LibSuffixGenerator(_LibInfoGeneratorBase):          suffix = self.get_lib_suffix(env, **kw2)          if Verbose: -            print "_LibSuffixGenerator: input suffix=%r" % suffix +            print("_LibSuffixGenerator: input suffix=%r" % suffix)          version = self.get_lib_version(env, **kw2)          if Verbose: -            print "_LibSuffixGenerator: version=%r" % version +            print("_LibSuffixGenerator: version=%r" % version)          if version:              suffix = self.generate_versioned_lib_info(env, [suffix, version], suffix, **kw2)          if Verbose: -            print "_LibSuffixGenerator: return suffix=%r" % suffix +            print("_LibSuffixGenerator: return suffix=%r" % suffix)          return suffix  ShLibSuffixGenerator  = _LibSuffixGenerator('ShLib') @@ -474,15 +577,15 @@ class _LibSymlinkGenerator(_LibInfoGeneratorBase):              kw2 = kw          if Verbose: -            print "_LibSymLinkGenerator: libnode=%r" % libnode.get_path() +            print("_LibSymLinkGenerator: libnode=%r" % libnode.get_path())          symlinks = None          version = self.get_lib_version(env, **kw2)          disable = self.get_lib_noversionsymlinks(env, **kw2)          if Verbose: -            print '_LibSymlinkGenerator: version=%r' % version -            print '_LibSymlinkGenerator: disable=%r' % disable +            print('_LibSymlinkGenerator: version=%r' % version) +            print('_LibSymlinkGenerator: disable=%r' % disable)          if version and not disable:              prefix = self.get_lib_prefix(env,**kw2) @@ -490,7 +593,7 @@ class _LibSymlinkGenerator(_LibInfoGeneratorBase):              symlinks = self.generate_versioned_lib_info(env, [libnode, version, prefix, suffix], **kw2)          if Verbose: -            print '_LibSymlinkGenerator: return symlinks=%r' % StringizeLibSymlinks(symlinks) +            print('_LibSymlinkGenerator: return symlinks=%r' % StringizeLibSymlinks(symlinks))          return symlinks  ShLibSymlinkGenerator =  _LibSymlinkGenerator('ShLib') @@ -499,7 +602,7 @@ ImpLibSymlinkGenerator = _LibSymlinkGenerator('ImpLib')  class _LibNameGenerator(_LibInfoGeneratorBase):      """Generates "unmangled" library name from a library file node. -     +      Generally, it's thought to revert modifications done by prefix/suffix      generators (_LibPrefixGenerator/_LibSuffixGenerator) used by a library      builder. For example, on gnulink the suffix generator used by SharedLibrary @@ -509,7 +612,7 @@ class _LibNameGenerator(_LibInfoGeneratorBase):      "$SHLIBSUFFIX" in the node's basename. So that, if $SHLIBSUFFIX is ".so",      $SHLIBVERSION is "0.1.2" and the node path is "/foo/bar/libfoo.so.0.1.2",      the _LibNameGenerator shall return "libfoo.so". Other link tools may -    implement it's own way of library name unmangling.  +    implement it's own way of library name unmangling.      """      def __init__(self, libtype):          super(_LibNameGenerator, self).__init__(libtype, 'Name') @@ -525,11 +628,11 @@ class _LibNameGenerator(_LibInfoGeneratorBase):              kw2 = kw          if Verbose: -            print "_LibNameGenerator: libnode=%r" % libnode.get_path() +            print("_LibNameGenerator: libnode=%r" % libnode.get_path())          version = self.get_lib_version(env, **kw2)          if Verbose: -            print '_LibNameGenerator: version=%r' % version +            print('_LibNameGenerator: version=%r' % version)          name = None          if version: @@ -541,7 +644,7 @@ class _LibNameGenerator(_LibInfoGeneratorBase):              name = os.path.basename(libnode.get_path())          if Verbose: -            print '_LibNameGenerator: return name=%r' % name +            print('_LibNameGenerator: return name=%r' % name)          return name @@ -550,7 +653,7 @@ LdModNameGenerator =  _LibNameGenerator('LdMod')  ImpLibNameGenerator = _LibNameGenerator('ImpLib')  class _LibSonameGenerator(_LibInfoGeneratorBase): -    """Library soname generator. Returns library soname (e.g. libfoo.so.0) for  +    """Library soname generator. Returns library soname (e.g. libfoo.so.0) for      a given node (e.g. /foo/bar/libfoo.so.0.1.2)"""      def __init__(self, libtype):          super(_LibSonameGenerator, self).__init__(libtype, 'Soname') @@ -566,13 +669,13 @@ class _LibSonameGenerator(_LibInfoGeneratorBase):              kw2 = kw          if Verbose: -            print "_LibSonameGenerator: libnode=%r" % libnode.get_path() +            print("_LibSonameGenerator: libnode=%r" % libnode.get_path())          soname = _call_env_subst(env, '$SONAME', **kw2)          if not soname:              version = self.get_lib_version(env,**kw2)              if Verbose: -                print "_LibSonameGenerator: version=%r" % version +                print("_LibSonameGenerator: version=%r" % version)              if version:                  prefix = self.get_lib_prefix(env,**kw2)                  suffix = self.get_lib_suffix(env,**kw2) @@ -582,10 +685,10 @@ class _LibSonameGenerator(_LibInfoGeneratorBase):              # fallback to library name (as returned by appropriate _LibNameGenerator)              soname = _LibNameGenerator(self.get_libtype())(env, libnode)              if Verbose: -                print "_LibSonameGenerator: FALLBACK: soname=%r" % soname +                print("_LibSonameGenerator: FALLBACK: soname=%r" % soname)          if Verbose: -            print "_LibSonameGenerator: return soname=%r" % soname +            print("_LibSonameGenerator: return soname=%r" % soname)          return soname @@ -613,39 +716,39 @@ def EmitLibSymlinks(env, symlinks, libnode, **kw):      clean_targets = kw.get('clean_targets', [])      if not SCons.Util.is_List(clean_targets):          clean_targets = [ clean_targets ] -       +      for link, linktgt in symlinks:          env.SideEffect(link, linktgt)          if(Verbose): -            print "EmitLibSymlinks: SideEffect(%r,%r)" % (link.get_path(), linktgt.get_path()) -        clean_list = filter(lambda x : x != linktgt, nodes) +            print("EmitLibSymlinks: SideEffect(%r,%r)" % (link.get_path(), linktgt.get_path())) +        clean_list = [x for x in nodes if x != linktgt]          env.Clean(list(set([linktgt] + clean_targets)), clean_list)          if(Verbose): -            print "EmitLibSymlinks: Clean(%r,%r)" % (linktgt.get_path(), map(lambda x : x.get_path(), clean_list)) +            print("EmitLibSymlinks: Clean(%r,%r)" % (linktgt.get_path(), [x.get_path() for x in clean_list]))  def CreateLibSymlinks(env, symlinks):      """Physically creates symlinks. The symlinks argument must be a list in      form [ (link, linktarget), ... ], where link and linktarget are SCons      nodes.      """ -     +      Verbose = False      for link, linktgt in symlinks:          linktgt = link.get_dir().rel_path(linktgt)          link = link.get_path()          if(Verbose): -            print "CreateLibSymlinks: preparing to add symlink %r -> %r" % (link, linktgt) +            print("CreateLibSymlinks: preparing to add symlink %r -> %r" % (link, linktgt))          # Delete the (previously created) symlink if exists. Let only symlinks          # to be deleted to prevent accidental deletion of source files...          if env.fs.islink(link):              env.fs.unlink(link)              if(Verbose): -                print "CreateLibSymlinks: removed old symlink %r" % link +                print("CreateLibSymlinks: removed old symlink %r" % link)          # If a file or directory exists with the same name as link, an OSError          # will be thrown, which should be enough, I think.          env.fs.symlink(linktgt, link)          if(Verbose): -            print "CreateLibSymlinks: add symlink %r -> %r" % (link, linktgt) +            print("CreateLibSymlinks: add symlink %r -> %r" % (link, linktgt))      return 0  def LibSymlinksActionFunction(target, source, env): @@ -670,10 +773,11 @@ def LibSymlinksStrFun(target, source, env, *args):              else:                  cmd += ": %s" % linkstr      return cmd -     +  LibSymlinksAction = SCons.Action.Action(LibSymlinksActionFunction, LibSymlinksStrFun) +  def createSharedLibBuilder(env):      """This is a utility function that creates the SharedLibrary      Builder in an Environment if it is not there already. @@ -810,7 +914,7 @@ def CreateJarBuilder(env):          jar_com = SCons.Action.Action('$JARCOM', '$JARCOMSTR')          java_jar = SCons.Builder.Builder(action = jar_com,                                           suffix = '$JARSUFFIX', -                                         src_suffix = '$JAVACLASSSUFIX', +                                         src_suffix = '$JAVACLASSSUFFIX',                                           src_builder = 'JavaClassFile',                                           source_factory = fs.Entry)          env['BUILDERS']['Jar'] = java_jar @@ -890,9 +994,9 @@ class ToolInitializerMethod(object):      def get_builder(self, env):          """ -	Returns the appropriate real Builder for this method name -	after having the associated ToolInitializer object apply -	the appropriate Tool module. +        Returns the appropriate real Builder for this method name +        after having the associated ToolInitializer object apply +        the appropriate Tool module.          """          builder = getattr(env, self.__name__) @@ -949,13 +1053,13 @@ class ToolInitializer(object):          so we no longer copy and re-bind them when the construction          environment gets cloned.          """ -        for method in self.methods.values(): +        for method in list(self.methods.values()):              env.RemoveMethod(method)      def apply_tools(self, env):          """ -	Searches the list of associated Tool modules for one that -	exists, and applies that to the construction environment. +        Searches the list of associated Tool modules for one that +        exists, and applies that to the construction environment.          """          for t in self.tools:              tool = SCons.Tool.Tool(t) @@ -1005,7 +1109,7 @@ def tool_list(platform, env):          "prefer Microsoft tools on Windows"          linkers = ['mslink', 'gnulink', 'ilink', 'linkloc', 'ilink32' ]          c_compilers = ['msvc', 'mingw', 'gcc', 'intelc', 'icl', 'icc', 'cc', 'bcc32' ] -        cxx_compilers = ['msvc', 'intelc', 'icc', 'g++', 'c++', 'bcc32' ] +        cxx_compilers = ['msvc', 'intelc', 'icc', 'g++', 'cxx', 'bcc32' ]          assemblers = ['masm', 'nasm', 'gas', '386asm' ]          fortran_compilers = ['gfortran', 'g77', 'ifl', 'cvf', 'f95', 'f90', 'fortran']          ars = ['mslib', 'ar', 'tlib'] @@ -1014,7 +1118,7 @@ def tool_list(platform, env):          "prefer IBM tools on OS/2"          linkers = ['ilink', 'gnulink', ]#'mslink']          c_compilers = ['icc', 'gcc',]# 'msvc', 'cc'] -        cxx_compilers = ['icc', 'g++',]# 'msvc', 'c++'] +        cxx_compilers = ['icc', 'g++',]# 'msvc', 'cxx']          assemblers = ['nasm',]# 'masm', 'gas']          fortran_compilers = ['ifl', 'g77']          ars = ['ar',]# 'mslib'] @@ -1022,7 +1126,7 @@ def tool_list(platform, env):          "prefer MIPSPro on IRIX"          linkers = ['sgilink', 'gnulink']          c_compilers = ['sgicc', 'gcc', 'cc'] -        cxx_compilers = ['sgic++', 'g++', 'c++'] +        cxx_compilers = ['sgicxx', 'g++', 'cxx']          assemblers = ['as', 'gas']          fortran_compilers = ['f95', 'f90', 'f77', 'g77', 'fortran']          ars = ['sgiar'] @@ -1030,7 +1134,7 @@ def tool_list(platform, env):          "prefer Forte tools on SunOS"          linkers = ['sunlink', 'gnulink']          c_compilers = ['suncc', 'gcc', 'cc'] -        cxx_compilers = ['sunc++', 'g++', 'c++'] +        cxx_compilers = ['suncxx', 'g++', 'cxx']          assemblers = ['as', 'gas']          fortran_compilers = ['sunf95', 'sunf90', 'sunf77', 'f95', 'f90', 'f77',                               'gfortran', 'g77', 'fortran'] @@ -1039,7 +1143,7 @@ def tool_list(platform, env):          "prefer aCC tools on HP-UX"          linkers = ['hplink', 'gnulink']          c_compilers = ['hpcc', 'gcc', 'cc'] -        cxx_compilers = ['hpc++', 'g++', 'c++'] +        cxx_compilers = ['hpcxx', 'g++', 'cxx']          assemblers = ['as', 'gas']          fortran_compilers = ['f95', 'f90', 'f77', 'g77', 'fortran']          ars = ['ar'] @@ -1047,7 +1151,7 @@ def tool_list(platform, env):          "prefer AIX Visual Age tools on AIX"          linkers = ['aixlink', 'gnulink']          c_compilers = ['aixcc', 'gcc', 'cc'] -        cxx_compilers = ['aixc++', 'g++', 'c++'] +        cxx_compilers = ['aixcxx', 'g++', 'cxx']          assemblers = ['as', 'gas']          fortran_compilers = ['f95', 'f90', 'aixf77', 'g77', 'fortran']          ars = ['ar'] @@ -1055,7 +1159,7 @@ def tool_list(platform, env):          "prefer GNU tools on Mac OS X, except for some linkers and IBM tools"          linkers = ['applelink', 'gnulink']          c_compilers = ['gcc', 'cc'] -        cxx_compilers = ['g++', 'c++'] +        cxx_compilers = ['g++', 'cxx']          assemblers = ['as']          fortran_compilers = ['gfortran', 'f95', 'f90', 'g77']          ars = ['ar'] @@ -1063,18 +1167,18 @@ def tool_list(platform, env):          "prefer GNU tools on Cygwin, except for a platform-specific linker"          linkers = ['cyglink', 'mslink', 'ilink']          c_compilers = ['gcc', 'msvc', 'intelc', 'icc', 'cc'] -        cxx_compilers = ['g++', 'msvc', 'intelc', 'icc', 'c++'] +        cxx_compilers = ['g++', 'msvc', 'intelc', 'icc', 'cxx']          assemblers = ['gas', 'nasm', 'masm']          fortran_compilers = ['gfortran', 'g77', 'ifort', 'ifl', 'f95', 'f90', 'f77']          ars = ['ar', 'mslib']      else:          "prefer GNU tools on all other platforms" -        linkers = ['gnulink', 'mslink', 'ilink'] -        c_compilers = ['gcc', 'msvc', 'intelc', 'icc', 'cc'] -        cxx_compilers = ['g++', 'msvc', 'intelc', 'icc', 'c++'] +        linkers = ['gnulink', 'ilink'] +        c_compilers = ['gcc',  'intelc', 'icc', 'cc'] +        cxx_compilers = ['g++', 'intelc', 'icc', 'cxx']          assemblers = ['gas', 'nasm', 'masm']          fortran_compilers = ['gfortran', 'g77', 'ifort', 'ifl', 'f95', 'f90', 'f77'] -        ars = ['ar', 'mslib'] +        ars = ['ar',]      if not str(platform) == 'win32':          other_plat_tools += ['m4', 'rpm'] @@ -1102,7 +1206,7 @@ def tool_list(platform, env):          fortran_compiler = FindTool(fortran_compilers, env) or fortran_compilers[0]          ar = FindTool(ars, env) or ars[0] -    d_compilers = ['dmd', 'gdc', 'ldc'] +    d_compilers = ['dmd', 'ldc', 'gdc']      d_compiler = FindTool(d_compilers, env) or d_compilers[0]      other_tools = FindAllTools(other_plat_tools + [ @@ -1121,9 +1225,6 @@ def tool_list(platform, env):                                 'tex', 'latex', 'pdflatex', 'pdftex',                                 # Archivers                                 'tar', 'zip', -                               # SourceCode factories -                               'BitKeeper', 'CVS', 'Perforce', -                               'RCS', 'SCCS', # 'Subversion',                                 ], env)      tools = ([linker, c_compiler, cxx_compiler, @@ -1137,4 +1238,3 @@ def tool_list(platform, env):  # indent-tabs-mode:nil  # End:  # vim: set expandtab tabstop=4 shiftwidth=4: - diff --git a/src/engine/SCons/Tool/__init__.xml b/src/engine/SCons/Tool/__init__.xml index d66b04a..32b8ce6 100644 --- a/src/engine/SCons/Tool/__init__.xml +++ b/src/engine/SCons/Tool/__init__.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/Tool/aixc++.py b/src/engine/SCons/Tool/aixc++.py index 77d192a..0a2465d 100644 --- a/src/engine/SCons/Tool/aixc++.py +++ b/src/engine/SCons/Tool/aixc++.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,42 +31,10 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/aixc++.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/aixc++.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" -import os.path - -import SCons.Platform.aix - -cplusplus = __import__('c++', globals(), locals(), []) - -packages = ['vacpp.cmp.core', 'vacpp.cmp.batch', 'vacpp.cmp.C', 'ibmcxx.cmp'] - -def get_xlc(env): -    xlc = env.get('CXX', 'xlC') -    return SCons.Platform.aix.get_xlc(env, xlc, packages) - -def generate(env): -    """Add Builders and construction variables for xlC / Visual Age -    suite to an Environment.""" -    path, _cxx, version = get_xlc(env) -    if path and _cxx: -        _cxx = os.path.join(path, _cxx) - -    if 'CXX' not in env: -        env['CXX'] = _cxx - -    cplusplus.generate(env) - -    if version: -        env['CXXVERSION'] = version -     -def exists(env): -    path, _cxx, version = get_xlc(env) -    if path and _cxx: -        xlc = os.path.join(path, _cxx) -        if os.path.exists(xlc): -            return xlc -    return None +#forward proxy to the preffered cxx version +from SCons.Tool.aixcxx import *  # Local Variables:  # tab-width:4 diff --git a/src/engine/SCons/Tool/aixc++.xml b/src/engine/SCons/Tool/aixc++.xml index 5017357..04a27f6 100644 --- a/src/engine/SCons/Tool/aixc++.xml +++ b/src/engine/SCons/Tool/aixc++.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/Tool/aixcc.py b/src/engine/SCons/Tool/aixcc.py index bee2b99..aa351cd 100644 --- a/src/engine/SCons/Tool/aixcc.py +++ b/src/engine/SCons/Tool/aixcc.py @@ -8,7 +8,7 @@ selection method.  """  # -# 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 @@ -30,13 +30,13 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/aixcc.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/aixcc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os.path  import SCons.Platform.aix -import cc +from . import cc  packages = ['vac.C', 'ibmcxx.cmp'] diff --git a/src/engine/SCons/Tool/aixcc.xml b/src/engine/SCons/Tool/aixcc.xml index 9157151..44ee0bc 100644 --- a/src/engine/SCons/Tool/aixcc.xml +++ b/src/engine/SCons/Tool/aixcc.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/Tool/BitKeeper.py b/src/engine/SCons/Tool/aixcxx.py index 1a901bb..97bd8a6 100644 --- a/src/engine/SCons/Tool/BitKeeper.py +++ b/src/engine/SCons/Tool/aixcxx.py @@ -1,7 +1,6 @@ -"""SCons.Tool.BitKeeper.py +"""SCons.Tool.aixc++ -Tool-specific initialization for the BitKeeper source code control -system. +Tool-specific initialization for IBM xlC / Visual Age C++ compiler.  There normally shouldn't be any need to import this module directly.  It will usually be imported through the generic SCons.Tool.Tool() @@ -10,7 +9,7 @@ selection method.  """  # -# 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 @@ -32,32 +31,44 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/BitKeeper.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/aixcxx.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" -import SCons.Action -import SCons.Builder -import SCons.Util +import os.path -def generate(env): -    """Add a Builder factory function and construction variables for -    BitKeeper to an Environment.""" +import SCons.Platform.aix + +import SCons.Tool.cxx +cplusplus = SCons.Tool.cxx +#cplusplus = __import__('cxx', globals(), locals(), []) + +packages = ['vacpp.cmp.core', 'vacpp.cmp.batch', 'vacpp.cmp.C', 'ibmcxx.cmp'] -    def BitKeeperFactory(env=env): -        """ """ -        import SCons.Warnings as W -        W.warn(W.DeprecatedSourceCodeWarning, """The BitKeeper() factory is deprecated and there is no replacement.""") -        act = SCons.Action.Action("$BITKEEPERCOM", "$BITKEEPERCOMSTR") -        return SCons.Builder.Builder(action = act, env = env) +def get_xlc(env): +    xlc = env.get('CXX', 'xlC') +    return SCons.Platform.aix.get_xlc(env, xlc, packages) + +def generate(env): +    """Add Builders and construction variables for xlC / Visual Age +    suite to an Environment.""" +    path, _cxx, version = get_xlc(env) +    if path and _cxx: +        _cxx = os.path.join(path, _cxx) -    env.BitKeeper = BitKeeperFactory +    if 'CXX' not in env: +        env['CXX'] = _cxx -    env['BITKEEPER']         = 'bk' -    env['BITKEEPERGET']      = '$BITKEEPER get' -    env['BITKEEPERGETFLAGS'] = SCons.Util.CLVar('') -    env['BITKEEPERCOM']      = '$BITKEEPERGET $BITKEEPERGETFLAGS $TARGET' +    cplusplus.generate(env) +    if version: +        env['CXXVERSION'] = version +      def exists(env): -    return env.Detect('bk') +    path, _cxx, version = get_xlc(env) +    if path and _cxx: +        xlc = os.path.join(path, _cxx) +        if os.path.exists(xlc): +            return xlc +    return None  # Local Variables:  # tab-width:4 diff --git a/src/engine/SCons/Tool/aixf77.py b/src/engine/SCons/Tool/aixf77.py index 899bd4f..c72346c 100644 --- a/src/engine/SCons/Tool/aixf77.py +++ b/src/engine/SCons/Tool/aixf77.py @@ -8,7 +8,7 @@ selection method.  """  # -# 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 @@ -30,13 +30,13 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/aixf77.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/aixf77.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os.path  #import SCons.Platform.aix -import f77 +from . import f77  # It would be good to look for the AIX F77 package the same way we're now  # looking for the C and C++ packages.  This should be as easy as supplying diff --git a/src/engine/SCons/Tool/aixf77.xml b/src/engine/SCons/Tool/aixf77.xml index e9bcc74..69f4d92 100644 --- a/src/engine/SCons/Tool/aixf77.xml +++ b/src/engine/SCons/Tool/aixf77.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/Tool/aixlink.py b/src/engine/SCons/Tool/aixlink.py index 0c8e1cc..fd67d66 100644 --- a/src/engine/SCons/Tool/aixlink.py +++ b/src/engine/SCons/Tool/aixlink.py @@ -8,7 +8,7 @@ selection method.  """  # -# 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 @@ -30,16 +30,20 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/aixlink.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/aixlink.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os  import os.path  import SCons.Util -import link +from . import aixcc +from . import link + +import SCons.Tool.cxx +cplusplus = SCons.Tool.cxx +#cplusplus = __import__('cxx', globals(), locals(), []) -cplusplus = __import__('c++', globals(), locals(), [])  def smart_linkflags(source, target, env, for_signature):      if cplusplus.iscplusplus(source): diff --git a/src/engine/SCons/Tool/aixlink.xml b/src/engine/SCons/Tool/aixlink.xml index 52112da..d5438ef 100644 --- a/src/engine/SCons/Tool/aixlink.xml +++ b/src/engine/SCons/Tool/aixlink.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/Tool/applelink.py b/src/engine/SCons/Tool/applelink.py index f9995b3..45f524c 100644 --- a/src/engine/SCons/Tool/applelink.py +++ b/src/engine/SCons/Tool/applelink.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,13 +31,13 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/applelink.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/applelink.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Util  # Even though the Mac is based on the GNU toolchain, it doesn't understand  # the -rpath option, so we use the "link" tool instead of "gnulink". -import link +from . import link  def generate(env):      """Add Builders and construction variables for applelink to an @@ -51,6 +51,14 @@ def generate(env):      env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -dynamiclib')      env['SHLINKCOM'] = env['SHLINKCOM'] + ' $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS' + +    # TODO: Work needed to generate versioned shared libraries +    # Leaving this commented out, and also going to disable versioned library checking for now +    # see: http://docstore.mik.ua/orelly/unix3/mac/ch05_04.htm  for proper naming +    #link._setup_versioned_lib_variables(env, tool = 'applelink')#, use_soname = use_soname) +    #env['LINKCALLBACKS'] = link._versioned_lib_callbacks() + +      # override the default for loadable modules, which are different      # on OS X than dynamic shared libs.  echoing what XCode does for      # pre/suffixes: diff --git a/src/engine/SCons/Tool/applelink.xml b/src/engine/SCons/Tool/applelink.xml index d087361..699abf0 100644 --- a/src/engine/SCons/Tool/applelink.xml +++ b/src/engine/SCons/Tool/applelink.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/Tool/ar.py b/src/engine/SCons/Tool/ar.py index dcaafdc..4d2a005 100644 --- a/src/engine/SCons/Tool/ar.py +++ b/src/engine/SCons/Tool/ar.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/ar.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/ar.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Defaults  import SCons.Tool @@ -48,8 +48,8 @@ def generate(env):      env['LIBPREFIX']   = 'lib'      env['LIBSUFFIX']   = '.a' -    if env.Detect('ranlib'): -        env['RANLIB']      = 'ranlib' +    if env.get('RANLIB',env.Detect('ranlib')) : +        env['RANLIB']      = env.get('RANLIB','ranlib')          env['RANLIBFLAGS'] = SCons.Util.CLVar('')          env['RANLIBCOM']   = '$RANLIB $RANLIBFLAGS $TARGET' diff --git a/src/engine/SCons/Tool/ar.xml b/src/engine/SCons/Tool/ar.xml index e06dba2..9b9e0a0 100644 --- a/src/engine/SCons/Tool/ar.xml +++ b/src/engine/SCons/Tool/ar.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/Tool/as.py b/src/engine/SCons/Tool/as.py index 59c1e1a..ab81b89 100644 --- a/src/engine/SCons/Tool/as.py +++ b/src/engine/SCons/Tool/as.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/as.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/as.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Defaults  import SCons.Tool diff --git a/src/engine/SCons/Tool/as.xml b/src/engine/SCons/Tool/as.xml index 8b4c51e..f4d886d 100644 --- a/src/engine/SCons/Tool/as.xml +++ b/src/engine/SCons/Tool/as.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/Tool/bcc32.py b/src/engine/SCons/Tool/bcc32.py index 4b83d3a..bf0a5dd 100644 --- a/src/engine/SCons/Tool/bcc32.py +++ b/src/engine/SCons/Tool/bcc32.py @@ -5,7 +5,7 @@ XXX  """  # -# 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 @@ -27,7 +27,7 @@ XXX  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/bcc32.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/bcc32.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os  import os.path diff --git a/src/engine/SCons/Tool/bcc32.xml b/src/engine/SCons/Tool/bcc32.xml index 3cd4121..6163016 100644 --- a/src/engine/SCons/Tool/bcc32.xml +++ b/src/engine/SCons/Tool/bcc32.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/Tool/c++.py b/src/engine/SCons/Tool/c++.py index 3b2528a..ebfe0a4 100644 --- a/src/engine/SCons/Tool/c++.py +++ b/src/engine/SCons/Tool/c++.py @@ -8,7 +8,7 @@ selection method.  """  # -# 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 @@ -30,68 +30,12 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/c++.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/c++.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" -import os.path -import SCons.Tool -import SCons.Defaults -import SCons.Util +#forward proxy to the preffered cxx version +from SCons.Tool.cxx import * -compilers = ['CC', 'c++'] - -CXXSuffixes = ['.cpp', '.cc', '.cxx', '.c++', '.C++', '.mm'] -if SCons.Util.case_sensitive_suffixes('.c', '.C'): -    CXXSuffixes.append('.C') - -def iscplusplus(source): -    if not source: -        # Source might be None for unusual cases like SConf. -        return 0 -    for s in source: -        if s.sources: -            ext = os.path.splitext(str(s.sources[0]))[1] -            if ext in CXXSuffixes: -                return 1 -    return 0 - -def generate(env): -    """ -    Add Builders and construction variables for Visual Age C++ compilers -    to an Environment. -    """ -    import SCons.Tool -    import SCons.Tool.cc -    static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - -    for suffix in CXXSuffixes: -        static_obj.add_action(suffix, SCons.Defaults.CXXAction) -        shared_obj.add_action(suffix, SCons.Defaults.ShCXXAction) -        static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) -        shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) - -    SCons.Tool.cc.add_common_cc_variables(env) - -    if 'CXX' not in env: -        env['CXX']    = env.Detect(compilers) or compilers[0] -    env['CXXFLAGS']   = SCons.Util.CLVar('') -    env['CXXCOM']     = '$CXX -o $TARGET -c $CXXFLAGS $CCFLAGS $_CCCOMCOM $SOURCES' -    env['SHCXX']      = '$CXX' -    env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS') -    env['SHCXXCOM']   = '$SHCXX -o $TARGET -c $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM $SOURCES' - -    env['CPPDEFPREFIX']  = '-D' -    env['CPPDEFSUFFIX']  = '' -    env['INCPREFIX']  = '-I' -    env['INCSUFFIX']  = '' -    env['SHOBJSUFFIX'] = '.os' -    env['OBJSUFFIX'] = '.o' -    env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0 - -    env['CXXFILESUFFIX'] = '.cc' - -def exists(env): -    return env.Detect(env.get('CXX', compilers))  # Local Variables:  # tab-width:4 diff --git a/src/engine/SCons/Tool/c++.xml b/src/engine/SCons/Tool/c++.xml index 5a31ba0..e2021fc 100644 --- a/src/engine/SCons/Tool/c++.xml +++ b/src/engine/SCons/Tool/c++.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/Tool/cc.py b/src/engine/SCons/Tool/cc.py index ba82b5d..31e7b2b 100644 --- a/src/engine/SCons/Tool/cc.py +++ b/src/engine/SCons/Tool/cc.py @@ -8,7 +8,7 @@ selection method.  """  # -# 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 @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/cc.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/cc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Tool  import SCons.Defaults diff --git a/src/engine/SCons/Tool/cc.xml b/src/engine/SCons/Tool/cc.xml index 810124d..1ec3084 100644 --- a/src/engine/SCons/Tool/cc.xml +++ b/src/engine/SCons/Tool/cc.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/Tool/clang.py b/src/engine/SCons/Tool/clang.py new file mode 100644 index 0000000..1271378 --- /dev/null +++ b/src/engine/SCons/Tool/clang.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8; -*- + +"""SCons.Tool.clang + +Tool-specific initialization for clang. + +There normally shouldn't be any need to import this module directly. +It will usually be imported through the generic SCons.Tool.Tool() +selection method. + +""" + +# +# 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 +# "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/Tool/clang.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" + +# Based on SCons/Tool/gcc.py by Paweł Tomulik 2014 as a separate tool. +# Brought into the SCons mainline by Russel Winder 2017. + +import os +import re +import subprocess +import sys + +import SCons.Util +import SCons.Tool.cc + +compilers = ['clang'] + +def generate(env): +    """Add Builders and construction variables for clang to an Environment.""" +    SCons.Tool.cc.generate(env) + +    env['CC'] = env.Detect(compilers) or 'clang' +    if env['PLATFORM'] in ['cygwin', 'win32']: +        env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS') +    else: +        env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS -fPIC') +    # determine compiler version +    if env['CC']: +        #pipe = SCons.Action._subproc(env, [env['CC'], '-dumpversion'], +        pipe = SCons.Action._subproc(env, [env['CC'], '--version'], +                                     stdin='devnull', +                                     stderr='devnull', +                                     stdout=subprocess.PIPE) +        if pipe.wait() != 0: return +        # clang -dumpversion is of no use +        line = pipe.stdout.readline() +        if sys.version_info[0] > 2: +            line = line.decode() +        match = re.search(r'clang +version +([0-9]+(?:\.[0-9]+)+)', line) +        if match: +            env['CCVERSION'] = match.group(1) + +def exists(env): +    return env.Detect(compilers) + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/src/engine/SCons/Tool/clang.xml b/src/engine/SCons/Tool/clang.xml new file mode 100644 index 0000000..3086a51 --- /dev/null +++ b/src/engine/SCons/Tool/clang.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +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. +--> + +<!DOCTYPE sconsdoc [ +<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'> +%scons; +<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'> +%builders-mod; +<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'> +%functions-mod; +<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'> +%tools-mod; +<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'> +%variables-mod; +]> + +<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0" +          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +          xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd"> + +<tool name="clang"> +<summary> +<para> +Set construction variables for the Clang C compiler. +</para> +</summary> +<sets> +<item>CC</item> +<item>SHCCFLAGS</item> +<item>CCVERSION</item> +</sets> +</tool> + +</sconsdoc> diff --git a/src/engine/SCons/Tool/clangxx.py b/src/engine/SCons/Tool/clangxx.py new file mode 100644 index 0000000..f56c9e5 --- /dev/null +++ b/src/engine/SCons/Tool/clangxx.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8; -*- + +"""SCons.Tool.clang++ + +Tool-specific initialization for clang++. + +There normally shouldn't be any need to import this module directly. +It will usually be imported through the generic SCons.Tool.Tool() +selection method. + +""" + +# +# 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 +# "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/Tool/clangxx.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" + +# Based on SCons/Tool/g++.py by Paweł Tomulik 2014 as a separate tool. +# Brought into the SCons mainline by Russel Winder 2017. + +import os.path +import re +import subprocess +import sys + +import SCons.Tool +import SCons.Util +import SCons.Tool.cxx + +compilers = ['clang++'] + +def generate(env): +    """Add Builders and construction variables for clang++ to an Environment.""" +    static_obj, shared_obj = SCons.Tool.createObjBuilders(env) + +    SCons.Tool.cxx.generate(env) + +    env['CXX']        = env.Detect(compilers) or 'clang++' + +    # platform specific settings +    if env['PLATFORM'] == 'aix': +        env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS -mminimal-toc') +        env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 +        env['SHOBJSUFFIX'] = '$OBJSUFFIX' +    elif env['PLATFORM'] == 'hpux': +        env['SHOBJSUFFIX'] = '.pic.o' +    elif env['PLATFORM'] == 'sunos': +        env['SHOBJSUFFIX'] = '.pic.o' +    # determine compiler version +    if env['CXX']: +        pipe = SCons.Action._subproc(env, [env['CXX'], '--version'], +                                     stdin='devnull', +                                     stderr='devnull', +                                     stdout=subprocess.PIPE) +        if pipe.wait() != 0: return +        # clang -dumpversion is of no use +        line = pipe.stdout.readline() +        if sys.version_info[0] > 2: +            line = line.decode() +        match = re.search(r'clang +version +([0-9]+(?:\.[0-9]+)+)', line) +        if match: +            env['CXXVERSION'] = match.group(1) + +def exists(env): +    return env.Detect(compilers) + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/src/engine/SCons/Tool/clangxx.xml b/src/engine/SCons/Tool/clangxx.xml new file mode 100644 index 0000000..309bb63 --- /dev/null +++ b/src/engine/SCons/Tool/clangxx.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +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. +--> + +<!DOCTYPE sconsdoc [ +<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'> +%scons; +<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'> +%builders-mod; +<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'> +%functions-mod; +<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'> +%tools-mod; +<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'> +%variables-mod; +]> + +<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0" +          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +          xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd"> + +<tool name="clangxx"> +<summary> +<para> +Set construction variables for the Clang C++ compiler. +</para> +</summary> +<sets> +<item>CXX</item> +<item>SHCXXFLAGS</item> +<item>STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME</item> +<item>SHOBJSUFFIX</item> +<item>CXXVERSION</item> +</sets> +</tool> + +</sconsdoc> diff --git a/src/engine/SCons/Tool/cvf.py b/src/engine/SCons/Tool/cvf.py index 37b4a00..a785471 100644 --- a/src/engine/SCons/Tool/cvf.py +++ b/src/engine/SCons/Tool/cvf.py @@ -5,7 +5,7 @@ Tool-specific initialization for the Compaq Visual Fortran compiler.  """  # -# 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 @@ -27,9 +27,9 @@ Tool-specific initialization for the Compaq Visual Fortran compiler.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/cvf.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/cvf.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" -import fortran +from . import fortran  compilers = ['f90'] diff --git a/src/engine/SCons/Tool/cvf.xml b/src/engine/SCons/Tool/cvf.xml index 1227658..1b2c447 100644 --- a/src/engine/SCons/Tool/cvf.xml +++ b/src/engine/SCons/Tool/cvf.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/Tool/cxx.py b/src/engine/SCons/Tool/cxx.py new file mode 100644 index 0000000..236730f --- /dev/null +++ b/src/engine/SCons/Tool/cxx.py @@ -0,0 +1,100 @@ +"""SCons.Tool.c++ + +Tool-specific initialization for generic Posix C++ compilers. + +There normally shouldn't be any need to import this module directly. +It will usually be imported through the generic SCons.Tool.Tool() +selection method. +""" + +# +# 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 +# "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/Tool/cxx.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" + +import os.path + +import SCons.Tool +import SCons.Defaults +import SCons.Util + +compilers = ['CC', 'c++'] + +CXXSuffixes = ['.cpp', '.cc', '.cxx', '.c++', '.C++', '.mm'] +if SCons.Util.case_sensitive_suffixes('.c', '.C'): +    CXXSuffixes.append('.C') + +def iscplusplus(source): +    if not source: +        # Source might be None for unusual cases like SConf. +        return 0 +    for s in source: +        if s.sources: +            ext = os.path.splitext(str(s.sources[0]))[1] +            if ext in CXXSuffixes: +                return 1 +    return 0 + +def generate(env): +    """ +    Add Builders and construction variables for Visual Age C++ compilers +    to an Environment. +    """ +    import SCons.Tool +    import SCons.Tool.cc +    static_obj, shared_obj = SCons.Tool.createObjBuilders(env) + +    for suffix in CXXSuffixes: +        static_obj.add_action(suffix, SCons.Defaults.CXXAction) +        shared_obj.add_action(suffix, SCons.Defaults.ShCXXAction) +        static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) +        shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) + +    SCons.Tool.cc.add_common_cc_variables(env) + +    if 'CXX' not in env: +        env['CXX']    = env.Detect(compilers) or compilers[0] +    env['CXXFLAGS']   = SCons.Util.CLVar('') +    env['CXXCOM']     = '$CXX -o $TARGET -c $CXXFLAGS $CCFLAGS $_CCCOMCOM $SOURCES' +    env['SHCXX']      = '$CXX' +    env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS') +    env['SHCXXCOM']   = '$SHCXX -o $TARGET -c $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM $SOURCES' + +    env['CPPDEFPREFIX']  = '-D' +    env['CPPDEFSUFFIX']  = '' +    env['INCPREFIX']  = '-I' +    env['INCSUFFIX']  = '' +    env['SHOBJSUFFIX'] = '.os' +    env['OBJSUFFIX'] = '.o' +    env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0 + +    env['CXXFILESUFFIX'] = '.cc' + +def exists(env): +    return env.Detect(env.get('CXX', compilers)) + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/src/engine/SCons/Tool/cyglink.py b/src/engine/SCons/Tool/cyglink.py index 921f0eb..f69b886 100644 --- a/src/engine/SCons/Tool/cyglink.py +++ b/src/engine/SCons/Tool/cyglink.py @@ -7,6 +7,9 @@ It will usually be imported through the generic SCons.Tool.Tool()  selection method.  """ + +from __future__ import absolute_import, print_function +  import re  import os @@ -14,12 +17,13 @@ import SCons.Action  import SCons.Util  import SCons.Tool -import gnulink -import link +#MAYBE:  from . import gnulink +from . import gnulink +from . import link  def _lib_generator(target, source, env, for_signature, **kw):      try: cmd = kw['cmd'] -    except KeyError: cmd = SCons.Util.CLVar(['$SHLINK'])  +    except KeyError: cmd = SCons.Util.CLVar(['$SHLINK'])      try: vp = kw['varprefix']      except KeyError: vp = 'SHLIB' @@ -40,7 +44,7 @@ def _lib_generator(target, source, env, for_signature, **kw):              ])      else:          cmd.extend(['$SOURCES', '$_LIBDIRFLAGS', '$_LIBFLAGS']) -     +      return [cmd] @@ -58,37 +62,37 @@ def _lib_emitter(target, source, env, **kw):      Verbose = False      if Verbose: -        print "_lib_emitter: target[0]=%r" % target[0].get_path() +        print("_lib_emitter: target[0]=%r" % target[0].get_path())      try: vp = kw['varprefix']      except KeyError: vp = 'SHLIB'      try: libtype = kw['libtype']      except KeyError: libtype = 'ShLib' -         +      dll = env.FindIxes(target, '%sPREFIX' % vp, '%sSUFFIX' % vp)      no_import_lib = env.get('no_import_lib', 0)      if Verbose: -        print "_lib_emitter: dll=%r" % dll.get_path() +        print("_lib_emitter: dll=%r" % dll.get_path())      if not dll or len(target) > 1:          raise SCons.Errors.UserError("A shared library should have exactly one target with the suffix: %s" % env.subst("$%sSUFFIX" % vp)) -     +      # Remove any "lib" after the prefix      pre = env.subst('$%sPREFIX' % vp)      if dll.name[len(pre):len(pre)+3] == 'lib':          dll.name = pre + dll.name[len(pre)+3:]      if Verbose: -        print "_lib_emitter: dll.name=%r" % dll.name +        print("_lib_emitter: dll.name=%r" % dll.name)      orig_target = target      target = [env.fs.File(dll)]      target[0].attributes.shared = 1      if Verbose: -        print "_lib_emitter: after target=[env.fs.File(dll)]: target[0]=%r" % target[0].get_path() +        print("_lib_emitter: after target=[env.fs.File(dll)]: target[0]=%r" % target[0].get_path())      # Append an import lib target      if not no_import_lib: @@ -97,11 +101,11 @@ def _lib_emitter(target, source, env, **kw):                                           '%sPREFIX' % vp, '%sSUFFIX' % vp,                                           'IMPLIBPREFIX', 'IMPLIBSUFFIX')          if Verbose: -            print "_lib_emitter: target_strings=%r" % target_strings -         +            print("_lib_emitter: target_strings=%r" % target_strings) +          implib_target = env.fs.File(target_strings)          if Verbose: -            print "_lib_emitter: implib_target=%r" % implib_target.get_path() +            print("_lib_emitter: implib_target=%r" % implib_target.get_path())          implib_target.attributes.shared = 1          target.append(implib_target) @@ -109,7 +113,7 @@ def _lib_emitter(target, source, env, **kw):                                                   implib_libtype=libtype,                                                   generator_libtype=libtype+'ImpLib')      if Verbose: -        print "_lib_emitter: implib symlinks=%r" % SCons.Tool.StringizeLibSymlinks(symlinks) +        print("_lib_emitter: implib symlinks=%r" % SCons.Tool.StringizeLibSymlinks(symlinks))      if symlinks:          SCons.Tool.EmitLibSymlinks(env, symlinks, implib_target, clean_targets = target[0])          implib_target.attributes.shliblinks = symlinks @@ -121,19 +125,19 @@ def shlib_emitter(target, source, env):  def ldmod_emitter(target, source, env):      return _lib_emitter(target, source, env, varprefix='LDMODULE', libtype='LdMod') -                          +  def _versioned_lib_suffix(env, suffix, version):      """Generate versioned shared library suffix from a unversioned one.         If suffix='.dll', and version='0.1.2', then it returns '-0-1-2.dll'"""      Verbose = False      if Verbose: -        print "_versioned_lib_suffix: suffix= ", suffix -        print "_versioned_lib_suffix: version= ", version +        print("_versioned_lib_suffix: suffix= ", suffix) +        print("_versioned_lib_suffix: version= ", version)      cygversion = re.sub('\.', '-', version)      if not suffix.startswith('-' + cygversion):          suffix = '-' + cygversion + suffix      if Verbose: -        print "_versioned_lib_suffix: return suffix= ", suffix +        print("_versioned_lib_suffix: return suffix= ", suffix)      return suffix  def _versioned_implib_name(env, libnode, version, prefix, suffix, **kw): @@ -149,8 +153,8 @@ def _versioned_implib_symlinks(env, libnode, version, prefix, suffix, **kw):      Verbose = False      if Verbose: -        print "_versioned_implib_symlinks: libnode=%r" % libnode.get_path() -        print "_versioned_implib_symlinks: version=%r" % version +        print("_versioned_implib_symlinks: libnode=%r" % libnode.get_path()) +        print("_versioned_implib_symlinks: version=%r" % version)      try: libtype = kw['libtype']      except KeyError: libtype = 'ShLib' @@ -158,13 +162,13 @@ def _versioned_implib_symlinks(env, libnode, version, prefix, suffix, **kw):      linkdir = os.path.dirname(libnode.get_path())      if Verbose: -        print "_versioned_implib_symlinks: linkdir=%r" % linkdir +        print("_versioned_implib_symlinks: linkdir=%r" % linkdir)      name = SCons.Tool.ImpLibNameGenerator(env, libnode,                                            implib_libtype=libtype,                                            generator_libtype=libtype+'ImpLib')      if Verbose: -        print "_versioned_implib_symlinks: name=%r" % name +        print("_versioned_implib_symlinks: name=%r" % name)      major = version.split('.')[0] @@ -172,7 +176,7 @@ def _versioned_implib_symlinks(env, libnode, version, prefix, suffix, **kw):      symlinks = [(link0, libnode)]      if Verbose: -        print "_versioned_implib_symlinks: return symlinks=%r" % SCons.Tool.StringizeLibSymlinks(symlinks) +        print("_versioned_implib_symlinks: return symlinks=%r" % SCons.Tool.StringizeLibSymlinks(symlinks))      return symlinks diff --git a/src/engine/SCons/Tool/cyglink.xml b/src/engine/SCons/Tool/cyglink.xml index e0eac65..13556e8 100644 --- a/src/engine/SCons/Tool/cyglink.xml +++ b/src/engine/SCons/Tool/cyglink.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/Tool/default.py b/src/engine/SCons/Tool/default.py index 1c19b7e..72d3399 100644 --- a/src/engine/SCons/Tool/default.py +++ b/src/engine/SCons/Tool/default.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/default.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/default.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Tool diff --git a/src/engine/SCons/Tool/default.xml b/src/engine/SCons/Tool/default.xml index cbe561a..3683a10 100644 --- a/src/engine/SCons/Tool/default.xml +++ b/src/engine/SCons/Tool/default.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/Tool/dmd.py b/src/engine/SCons/Tool/dmd.py index aaacd47..1dfb5d7 100644 --- a/src/engine/SCons/Tool/dmd.py +++ b/src/engine/SCons/Tool/dmd.py @@ -1,3 +1,5 @@ +from __future__ import print_function +  """SCons.Tool.dmd  Tool-specific initialization for the Digital Mars D compiler. @@ -9,13 +11,6 @@ Originally coded by Andy Friesen (andy@ikagames.com)  Evolved by Russel Winder (russel@winder.org.uk)  2010-02-07 onwards -There are a number of problems with this script at this point in time. -The one that irritates the most is the Windows linker setup.  The D -linker doesn't have a way to add lib paths on the commandline, as far -as I can see.  You have to specify paths relative to the SConscript or -use absolute paths.  To hack around it, add '#/blah'.  This will link -blah.lib from the directory where SConstruct resides. -  Compiler variables:      DC - The name of the D compiler to use.  Defaults to dmd or gdmd,          whichever is found. @@ -36,7 +31,7 @@ Lib tool variables:  """  # -# 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 @@ -58,7 +53,7 @@ Lib tool variables:  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/dmd.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/dmd.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os  import subprocess @@ -69,7 +64,7 @@ import SCons.Defaults  import SCons.Scanner.D  import SCons.Tool -import SCons.Tool.DCommon +import SCons.Tool.DCommon as DCommon  def generate(env): @@ -80,7 +75,7 @@ def generate(env):      static_obj.add_emitter('.d', SCons.Defaults.StaticObjectEmitter)      shared_obj.add_emitter('.d', SCons.Defaults.SharedObjectEmitter) -    env['DC'] = env.Detect(['dmd', 'gdmd']) +    env['DC'] = env.Detect(['dmd', 'ldmd2', 'gdmd']) or 'dmd'      env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -of$TARGET $SOURCES'      env['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}'      env['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}' @@ -96,7 +91,7 @@ def generate(env):      env['DDEBUG'] = []      if env['DC']: -        SCons.Tool.DCommon.addDPATHToEnv(env, env['DC']) +        DCommon.addDPATHToEnv(env, env['DC'])      env['DINCPREFIX'] = '-I'      env['DINCSUFFIX'] = '' @@ -112,9 +107,9 @@ def generate(env):      env['DLINKFLAGS'] = SCons.Util.CLVar('')      env['DLINKCOM'] = '$DLINK -of$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS' -    env['DSHLINK'] = '$DC' -    env['DSHLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared -defaultlib=libphobos2.so') -    env['SHDLINKCOM'] = '$DLINK -of$TARGET $DSHLINKFLAGS $__DSHLIBVERSIONFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS' +    env['SHDLINK'] = '$DC' +    env['SHDLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared -defaultlib=libphobos2.so') +    env['SHDLINKCOM'] = '$DLINK -of$TARGET $SHDLINKFLAGS $__SHDLIBVERSIONFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS'      env['DLIBLINKPREFIX'] = '' if env['PLATFORM'] == 'win32' else '-L-l'      env['DLIBLINKSUFFIX'] = '.lib' if env['PLATFORM'] == 'win32' else '' @@ -124,37 +119,40 @@ def generate(env):      env['DLIBDIRSUFFIX'] = ''      env['_DLIBDIRFLAGS'] = '${_concat(DLIBDIRPREFIX, LIBPATH, DLIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)}' -      env['DLIB'] = 'lib' if env['PLATFORM'] == 'win32' else 'ar cr'      env['DLIBCOM'] = '$DLIB $_DLIBFLAGS {0}$TARGET $SOURCES $_DLIBFLAGS'.format('-c ' if env['PLATFORM'] == 'win32' else '') -    #env['_DLIBFLAGS'] = '${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)}' +    # env['_DLIBFLAGS'] = '${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)}'      env['DLIBFLAGPREFIX'] = '-'      env['DLIBFLAGSUFFIX'] = ''      # __RPATH is set to $_RPATH in the platform specification if that      # platform supports it. -    env['DRPATHPREFIX'] = '-L-rpath=' +    env['DRPATHPREFIX'] = '-L-rpath,' if env['PLATFORM'] == 'darwin' else '-L-rpath='      env['DRPATHSUFFIX'] = ''      env['_DRPATH'] = '${_concat(DRPATHPREFIX, RPATH, DRPATHSUFFIX, __env__)}'      # Support for versioned libraries -    env['_DSHLIBVERSIONFLAGS'] = '$DSHLIBVERSIONFLAGS -L-soname=$_DSHLIBSONAME' -    env['_DSHLIBSONAME'] = '${DShLibSonameGenerator(__env__,TARGET)}' +    env['_SHDLIBVERSIONFLAGS'] = '$SHDLIBVERSIONFLAGS -L-soname=$_SHDLIBSONAME' +    env['_SHDLIBSONAME'] = '${DShLibSonameGenerator(__env__,TARGET)}'      # NOTE: this is a quick hack, the soname will only work if there is      # c/c++ linker loaded which provides callback for the ShLibSonameGenerator      env['DShLibSonameGenerator'] = SCons.Tool.ShLibSonameGenerator -    # NOTE: this is only for further reference, currently $DSHLIBVERSION does +    # NOTE: this is only for further reference, currently $SHDLIBVERSION does      # not work, the user must use $SHLIBVERSION -    env['DSHLIBVERSION'] = '$SHLIBVERSION' -    env['DSHLIBVERSIONFLAGS'] = [] +    env['SHDLIBVERSION'] = '$SHLIBVERSION' +    env['SHDLIBVERSIONFLAGS'] = [] -    SCons.Tool.createStaticLibBuilder(env) +    env['BUILDERS']['ProgramAllAtOnce'] = SCons.Builder.Builder( +        action='$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -of$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS', +        emitter=DCommon.allAtOnceEmitter, +    )  def exists(env): -    return env.Detect(['dmd', 'gdmd']) +    return env.Detect(['dmd', 'ldmd2', 'gdmd']) +  # Local Variables:  # tab-width:4 diff --git a/src/engine/SCons/Tool/dmd.xml b/src/engine/SCons/Tool/dmd.xml index c7e9ecb..a06db10 100644 --- a/src/engine/SCons/Tool/dmd.xml +++ b/src/engine/SCons/Tool/dmd.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. @@ -32,10 +32,6 @@ Sets construction variables for D language compiler DMD.  <sets>  <item>DC</item>  <item>DCOM</item> -<item>_DINCFLAGS</item> -<item>_DVERFLAGS</item> -<item>_DDEBUGFLAGS</item> -<item>_DFLAGS</item>  <item>SHDC</item>  <item>SHDCOM</item>  <item>DPATH</item> @@ -59,21 +55,317 @@ Sets construction variables for D language compiler DMD.  <item>SHDLINKCOM</item>  <item>DLIBLINKPREFIX</item>  <item>DLIBLINKSUFFIX</item> -<item>_DLIBFLAGS</item>  <item>DLIBDIRPREFIX</item>  <item>DLIBDIRSUFFIX</item> -<item>_DLIBDIRFLAGS</item>  <item>DLIB</item>  <item>DLIBCOM</item> -<item>_DLIBFLAGS</item>  <item>DLIBFLAGPREFIX</item>  <item>DLIBFLAGSUFFIX</item> -<item>RPATHPREFIX</item> -<item>RPATHSUFFIX</item> -<item>_RPATH</item> +<item>DLINKFLAGPREFIX</item> +<item>DLINKFLAGSUFFIX</item> +<item>DRPATHPREFIX</item> +<item>DRPATHSUFFIX</item> +<item>DShLibSonameGenerator</item> +<item>SHDLIBVERSION</item> +<item>SHDLIBVERSIONFLAGS</item>  </sets>  <uses>  </uses>  </tool> +<cvar name="DC"> +<summary> +<para> +The D compiler to use. +</para> +</summary> +</cvar> + +<cvar name="DCOM"> +<summary> +<para> +  The command line used to compile a D file to an object file. +  Any options specified in the &cv-link-DFLAGS; construction variable +  is included on this command line. +</para> +</summary> +</cvar> + +<cvar name="DDEBUG"> +<summary> +<para> +  List of debug tags to enable when compiling. +</para> +</summary> +</cvar> + +<cvar name="DFLAGS"> +<summary> +<para> +  General options that are passed to the D compiler. +</para> +</summary> +</cvar> + +<cvar name="DLIB"> +<summary> +<para> +  Name of the lib tool to use for D codes. +</para> +</summary> +</cvar> + +<cvar name="DLIBCOM"> +<summary> +<para> +  The command line to use when creating libraries. +</para> +</summary> +</cvar> + +<cvar name="DLINK"> +<summary> +<para> +  Name of the linker to use for linking systems including D sources. +</para> +</summary> +</cvar> + +<cvar name="DLINKCOM"> +<summary> +<para> +  The command line to use when linking systems including D sources. +</para> +</summary> +</cvar> + +<cvar name="DLINKFLAGS"> +<summary> +<para> +List of linker flags. +</para> +</summary> +</cvar> + +<cvar name="DPATH"> +<summary> +<para> +  List of paths to search for import modules. +</para> +</summary> +</cvar> + +<cvar name="DVERSIONS"> +<summary> +<para> +  List of version tags to enable when compiling. +</para> +</summary> +</cvar> + +<cvar name="SHDC"> +<summary> +<para> +  The name of the compiler to use when compiling D source +  destined to be in a shared objects. +</para> +</summary> +</cvar> + +<cvar name="SHDCOM"> +<summary> +<para> +  The command line to use when compiling code to be part of shared objects. +</para> +</summary> +</cvar> + +<cvar name="SHDLINK"> +<summary> +<para> +  The linker to use when creating shared objects for code bases +  include D sources. +</para> +</summary> +</cvar> + +<cvar name="SHDLINKCOM"> +<summary> +<para> +  The command line to use when generating shared objects. +</para> +</summary> +</cvar> + +<cvar name="SHDLINKFLAGS"> +<summary> +<para> +  The list of flags to use when generating a shared object. +</para> +</summary> +</cvar> + +<cvar name="DVERSUFFIX"> +  <summary> +    <para> +      DVERSUFFIX. +    </para> + </summary> +</cvar> + +<cvar name="DVERPREFIX"> +  <summary> +    <para> +      DVERPREFIX. +    </para> + </summary> +</cvar> + +<cvar name="DLINKFLAGSUFFIX"> +  <summary> +    <para> +      DLINKFLAGSUFFIX. +    </para> + </summary> +</cvar> + +<cvar name="DLINKFLAGPREFIX"> +  <summary> +    <para> +      DLINKFLAGPREFIX. +    </para> + </summary> +</cvar> + +<cvar name="DLIBLINKSUFFIX"> +  <summary> +    <para> +      DLIBLINKSUFFIX. +    </para> + </summary> +</cvar> + +<cvar name="DLIBLINKPREFIX"> +  <summary> +    <para> +      DLIBLINKPREFIX. +    </para> + </summary> +</cvar> + +<cvar name="DLIBFLAGSUFFIX"> +  <summary> +    <para> +      DLIBFLAGSUFFIX. +    </para> + </summary> +</cvar> + +<cvar name="DLIBFLAGPREFIX"> +  <summary> +    <para> +      DLIBFLAGPREFIX. +    </para> + </summary> +</cvar> + +<cvar name="DLIBDIRSUFFIX"> +  <summary> +    <para> +      DLIBLINKSUFFIX. +    </para> + </summary> +</cvar> + +<cvar name="DLIBDIRPREFIX"> +  <summary> +    <para> +      DLIBLINKPREFIX. +    </para> + </summary> +</cvar> + +<cvar name="DINCSUFFIX"> +  <summary> +    <para> +      DLIBFLAGSUFFIX. +    </para> + </summary> +</cvar> + + +<cvar name="DINCPREFIX"> +  <summary> +    <para> +      DINCPREFIX. +    </para> + </summary> +</cvar> + +<cvar name="DFLAGSUFFIX"> +  <summary> +    <para> +      DFLAGSUFFIX. +    </para> + </summary> +</cvar> + +<cvar name="DFLAGPREFIX"> +  <summary> +    <para> +      DFLAGPREFIX. +    </para> + </summary> +</cvar> + +<cvar name="DFILESUFFIX"> +  <summary> +    <para> +      DFILESUFFIX. +    </para> + </summary> +</cvar> + +<cvar name="DDEBUGPREFIX"> +  <summary> +    <para> +      DDEBUGPREFIX. +    </para> + </summary> +</cvar> + +<cvar name="DDEBUGSUFFIX"> +  <summary> +    <para> +      DDEBUGSUFFIX. +    </para> + </summary> +</cvar> + +<builder name="ProgramAllAtOnce"> +  <summary> +    <para> +      Builds an executable from D sources without first creating individual +      objects for each file. +    </para> +    <para> +      D sources can be compiled file-by-file as C and C++ source are, and +      D is integrated into the &scons; Object and Program builders for +      this model of build. D codes can though do whole source +      meta-programming (some of the testing frameworks do this). For this +      it is imperative that all sources are compiled and linked in a single call of +      the D compiler. This builder serves that purpose. +    </para> +    <example_commands> +      env.ProgramAllAtOnce('executable', ['mod_a.d, mod_b.d', 'mod_c.d']) +    </example_commands> +    <para> +      This command will compile the modules mod_a, mod_b, and mod_c in a +      single compilation process without first creating object files for +      the modules. Some of the D compilers will create executable.o others +      will not. +    </para> +  </summary> +</builder> +  </sconsdoc> diff --git a/src/engine/SCons/Tool/docbook/__init__.py b/src/engine/SCons/Tool/docbook/__init__.py index 83b3ecd..ed63784 100644 --- a/src/engine/SCons/Tool/docbook/__init__.py +++ b/src/engine/SCons/Tool/docbook/__init__.py @@ -10,7 +10,7 @@ selection method.  """  # -# 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 @@ -43,6 +43,8 @@ import SCons.Script  import SCons.Tool  import SCons.Util + +__debug_tool_location = False  # Get full path to this script  scriptpath = os.path.dirname(os.path.realpath(__file__)) @@ -157,6 +159,11 @@ def __create_output_dir(base_dir):  #  # Supported command line tools and their call "signature"  # +xsltproc_com_priority = ['xsltproc', 'saxon', 'saxon-xslt', 'xalan'] + +# TODO: Set minimum version of saxon-xslt to be 8.x (lower than this only supports xslt 1.0. +#       see: http://saxon.sourceforge.net/saxon6.5.5/ +#       see: http://saxon.sourceforge.net/  xsltproc_com = {'xsltproc' : '$DOCBOOK_XSLTPROC $DOCBOOK_XSLTPROCFLAGS -o $TARGET $DOCBOOK_XSL $SOURCE',                  'saxon' : '$DOCBOOK_XSLTPROC $DOCBOOK_XSLTPROCFLAGS -o $TARGET $DOCBOOK_XSL $SOURCE $DOCBOOK_XSLTPROCPARAMS',                  'saxon-xslt' : '$DOCBOOK_XSLTPROC $DOCBOOK_XSLTPROCFLAGS -o $TARGET $DOCBOOK_XSL $SOURCE $DOCBOOK_XSLTPROCPARAMS', @@ -166,19 +173,27 @@ fop_com = {'fop' : '$DOCBOOK_FOP $DOCBOOK_FOPFLAGS -fo $SOURCE -pdf $TARGET',             'xep' : '$DOCBOOK_FOP $DOCBOOK_FOPFLAGS -valid -fo $SOURCE -pdf $TARGET',             'jw' : '$DOCBOOK_FOP $DOCBOOK_FOPFLAGS -f docbook -b pdf $SOURCE -o $TARGET'} -def __detect_cl_tool(env, chainkey, cdict): +def __detect_cl_tool(env, chainkey, cdict, cpriority=None):      """      Helper function, picks a command line tool from the list      and initializes its environment variables.      """      if env.get(chainkey,'') == '':          clpath = '' -        for cltool in cdict: + +        if cpriority is None: +            cpriority = cdict.keys() +        for cltool in cpriority: +            if __debug_tool_location: +                print("DocBook: Looking for %s"%cltool)              clpath = env.WhereIs(cltool)              if clpath: +                if __debug_tool_location: +                    print("DocBook: Found:%s"%cltool)                  env[chainkey] = clpath                  if not env[chainkey + 'COM']:                      env[chainkey + 'COM'] = cdict[cltool] +                break  def _detect(env):      """ @@ -192,10 +207,10 @@ def _detect(env):      if ((not has_libxml2 and not has_lxml) or (prefer_xsltproc)):          # Try to find the XSLT processors -        __detect_cl_tool(env, 'DOCBOOK_XSLTPROC', xsltproc_com) +        __detect_cl_tool(env, 'DOCBOOK_XSLTPROC', xsltproc_com, xsltproc_com_priority)          __detect_cl_tool(env, 'DOCBOOK_XMLLINT', xmllint_com) -    __detect_cl_tool(env, 'DOCBOOK_FOP', fop_com) +    __detect_cl_tool(env, 'DOCBOOK_FOP', fop_com, ['fop','xep','jw'])  #  # Scanners @@ -335,7 +350,7 @@ def __build_lxml(target, source, env):          result = transform(doc)      try: -        of = open(str(target[0]), "w") +        of = open(str(target[0]), "wb")          of.write(of.write(etree.tostring(result, pretty_print=True)))          of.close()      except: @@ -461,7 +476,7 @@ def DocbookEpub(env, target, source=None, *args, **kw):              # Create xpath context              xpath_context = doc.xpathNewContext()              # Register namespaces -            for key, val in nsmap.iteritems(): +            for key, val in nsmap.items():                  xpath_context.xpathRegisterNs(key, val)              if hasattr(opf, 'xpathEval') and xpath_context: diff --git a/src/engine/SCons/Tool/docbook/__init__.xml b/src/engine/SCons/Tool/docbook/__init__.xml index 11b189f..1994392 100644 --- a/src/engine/SCons/Tool/docbook/__init__.xml +++ b/src/engine/SCons/Tool/docbook/__init__.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/Tool/docbook/docbook-xsl-1.76.1/extensions/docbook.py b/src/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/docbook.py index c070602..e7b8cfa 100644 --- a/src/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/docbook.py +++ b/src/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/docbook.py @@ -1,5 +1,6 @@  # docbook.py: extension module  # $Id: docbook.py 8353 2009-03-17 16:57:50Z mzjn $ +from __future__ import print_function  import sys  import string @@ -82,7 +83,7 @@ def adjustColumnWidths(ctx, nodeset):          relParts.append(relPart)          absParts.append(pixels) -        col = col.next +        col = col.__next__      # Ok, now we have the relative widths and absolute widths in      # two parallel arrays. @@ -116,7 +117,7 @@ def adjustColumnWidths(ctx, nodeset):              pixelWidth = convertLength(tableWidth)          if pixelWidth <= absTotal: -            print "Table is wider than table width" +            print("Table is wider than table width")          else:              pixelWidth = pixelWidth - absTotal @@ -151,7 +152,7 @@ def adjustColumnWidths(ctx, nodeset):              col.setProp("width", widths[count])          count = count+1 -        col = col.next +        col = col.__next__      return nodeset @@ -163,10 +164,10 @@ def convertLength(length):      m = re.search('([+-]?[\d\.]+)(\S+)', length)      if m != None and m.lastindex > 1:          unit = pixelsPerInch -        if unitHash.has_key(m.group(2)): +        if m.group(2) in unitHash:              unit = unitHash[m.group(2)]          else: -            print "Unrecognized length: " + m.group(2) +            print("Unrecognized length: " + m.group(2))          pixels = unit * float(m.group(1))      else: diff --git a/src/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/xslt.py b/src/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/xslt.py index c712f65..77ca0de 100644 --- a/src/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/xslt.py +++ b/src/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/xslt.py @@ -1,5 +1,6 @@  #!/usr/bin/python -u  # $Id: xslt.py 8353 2009-03-17 16:57:50Z mzjn $ +from __future__ import print_function  import sys  import libxml2 @@ -18,7 +19,7 @@ try:      xmlfile = sys.argv[1]      xslfile = sys.argv[2]  except IndexError: -    print usage +    print(usage)      sys.exit(1)  def quote(astring): @@ -38,12 +39,12 @@ try:      while (sys.argv[count]):          try:              name, value = sys.argv[count].split("=", 2) -            if params.has_key(name): -                print "Warning: '%s' re-specified; replacing value" % name +            if name in params: +                print("Warning: '%s' re-specified; replacing value" % name)              params[name] = quote(value)          except ValueError: -            print "Invalid parameter specification: '" + sys.argv[count] + "'" -            print usage +            print("Invalid parameter specification: '" + sys.argv[count] + "'") +            print(usage)              sys.exit(1)          count = count+1  except IndexError: @@ -70,7 +71,7 @@ result = style.applyStylesheet(doc, params)  if outfile:      style.saveResultToFilename(outfile, result, 0)  else: -    print result +    print(result)  # Free things up  style.freeStylesheet() diff --git a/src/engine/SCons/Tool/dvi.py b/src/engine/SCons/Tool/dvi.py index cf5504e..9ec1563 100644 --- a/src/engine/SCons/Tool/dvi.py +++ b/src/engine/SCons/Tool/dvi.py @@ -5,7 +5,7 @@ Common DVI Builder definition for various other Tool modules that use it.  """  # -# 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 @@ -27,7 +27,7 @@ Common DVI Builder definition for various other Tool modules that use it.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/dvi.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/dvi.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Builder  import SCons.Tool diff --git a/src/engine/SCons/Tool/dvi.xml b/src/engine/SCons/Tool/dvi.xml index e1c4059..1ec2ef0 100644 --- a/src/engine/SCons/Tool/dvi.xml +++ b/src/engine/SCons/Tool/dvi.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/Tool/dvipdf.py b/src/engine/SCons/Tool/dvipdf.py index 1e7daac..339155d 100644 --- a/src/engine/SCons/Tool/dvipdf.py +++ b/src/engine/SCons/Tool/dvipdf.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -30,7 +30,7 @@ selection method.  # 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/Tool/dvipdf.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/dvipdf.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Action  import SCons.Defaults @@ -87,7 +87,7 @@ def PDFEmitter(target, source, env):      """      def strip_suffixes(n):          return not SCons.Util.splitext(str(n))[1] in ['.aux', '.log'] -    source = list(filter(strip_suffixes, source)) +    source = [src for src in source if strip_suffixes(src)]      return (target, source)  def generate(env): @@ -100,7 +100,7 @@ def generate(env):      if DVIPDFAction is None:          DVIPDFAction = SCons.Action.Action(DviPdfFunction, strfunction = DviPdfStrFunction) -    import pdf +    from . import pdf      pdf.generate(env)      bld = env['BUILDERS']['PDF'] diff --git a/src/engine/SCons/Tool/dvipdf.xml b/src/engine/SCons/Tool/dvipdf.xml index 1f028da..a5d2018 100644 --- a/src/engine/SCons/Tool/dvipdf.xml +++ b/src/engine/SCons/Tool/dvipdf.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/Tool/dvips.py b/src/engine/SCons/Tool/dvips.py index 5217a16..95641d6 100644 --- a/src/engine/SCons/Tool/dvips.py +++ b/src/engine/SCons/Tool/dvips.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/dvips.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/dvips.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Action  import SCons.Builder diff --git a/src/engine/SCons/Tool/dvips.xml b/src/engine/SCons/Tool/dvips.xml index 161b899..7f47592 100644 --- a/src/engine/SCons/Tool/dvips.xml +++ b/src/engine/SCons/Tool/dvips.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/Tool/f03.py b/src/engine/SCons/Tool/f03.py index c71c487..a9f91a8 100644 --- a/src/engine/SCons/Tool/f03.py +++ b/src/engine/SCons/Tool/f03.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,12 +31,12 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/f03.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/f03.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Defaults  import SCons.Tool  import SCons.Util -import fortran +from . import fortran  from SCons.Tool.FortranCommon import add_all_to_env, add_f03_to_env  compilers = ['f03'] diff --git a/src/engine/SCons/Tool/f03.xml b/src/engine/SCons/Tool/f03.xml index beb60ab..e486acf 100644 --- a/src/engine/SCons/Tool/f03.xml +++ b/src/engine/SCons/Tool/f03.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/Tool/f08.py b/src/engine/SCons/Tool/f08.py index 1d3afc6..eb44487 100644 --- a/src/engine/SCons/Tool/f08.py +++ b/src/engine/SCons/Tool/f08.py @@ -8,8 +8,10 @@ selection method.  """ +from __future__ import absolute_import +  # -# 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 @@ -31,12 +33,12 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/f08.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/f08.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Defaults  import SCons.Tool  import SCons.Util -import fortran +from . import fortran  from SCons.Tool.FortranCommon import add_all_to_env, add_f08_to_env  compilers = ['f08'] diff --git a/src/engine/SCons/Tool/f08.xml b/src/engine/SCons/Tool/f08.xml index 17eaaa9..aac7b66 100644 --- a/src/engine/SCons/Tool/f08.xml +++ b/src/engine/SCons/Tool/f08.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/Tool/f77.py b/src/engine/SCons/Tool/f77.py index 48c724c..afa9a7b 100644 --- a/src/engine/SCons/Tool/f77.py +++ b/src/engine/SCons/Tool/f77.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/f77.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/f77.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Defaults  import SCons.Scanner.Fortran diff --git a/src/engine/SCons/Tool/f77.xml b/src/engine/SCons/Tool/f77.xml index 6ce9226..210c646 100644 --- a/src/engine/SCons/Tool/f77.xml +++ b/src/engine/SCons/Tool/f77.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/Tool/f90.py b/src/engine/SCons/Tool/f90.py index 9272a63..f66ed47 100644 --- a/src/engine/SCons/Tool/f90.py +++ b/src/engine/SCons/Tool/f90.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/f90.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/f90.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Defaults  import SCons.Scanner.Fortran diff --git a/src/engine/SCons/Tool/f90.xml b/src/engine/SCons/Tool/f90.xml index ad09e6f..b5f7f13 100644 --- a/src/engine/SCons/Tool/f90.xml +++ b/src/engine/SCons/Tool/f90.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/Tool/f95.py b/src/engine/SCons/Tool/f95.py index abc9053..bc5439f 100644 --- a/src/engine/SCons/Tool/f95.py +++ b/src/engine/SCons/Tool/f95.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,12 +31,12 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/f95.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/f95.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Defaults  import SCons.Tool  import SCons.Util -import fortran +from . import fortran  from SCons.Tool.FortranCommon import add_all_to_env, add_f95_to_env  compilers = ['f95'] diff --git a/src/engine/SCons/Tool/f95.xml b/src/engine/SCons/Tool/f95.xml index 602ee58..f1cb7c2 100644 --- a/src/engine/SCons/Tool/f95.xml +++ b/src/engine/SCons/Tool/f95.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/Tool/filesystem.py b/src/engine/SCons/Tool/filesystem.py index 2981705..6615c31 100644 --- a/src/engine/SCons/Tool/filesystem.py +++ b/src/engine/SCons/Tool/filesystem.py @@ -8,7 +8,7 @@ selection method.  """  # -# 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 @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/filesystem.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/filesystem.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons  from SCons.Tool.install import copyFunc @@ -66,7 +66,7 @@ def generate(env):      try:          env['BUILDERS']['CopyTo']          env['BUILDERS']['CopyAs'] -    except KeyError, e: +    except KeyError as e:          global copyToBuilder          if copyToBuilder is None:              copyToBuilder = SCons.Builder.Builder( diff --git a/src/engine/SCons/Tool/fortran.py b/src/engine/SCons/Tool/fortran.py index 4cba6d5..b99b5e6 100644 --- a/src/engine/SCons/Tool/fortran.py +++ b/src/engine/SCons/Tool/fortran.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/fortran.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/fortran.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import re diff --git a/src/engine/SCons/Tool/fortran.xml b/src/engine/SCons/Tool/fortran.xml index 85140ef..3907ce2 100644 --- a/src/engine/SCons/Tool/fortran.xml +++ b/src/engine/SCons/Tool/fortran.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/Tool/g++.py b/src/engine/SCons/Tool/g++.py index 1d12962..468fa87 100644 --- a/src/engine/SCons/Tool/g++.py +++ b/src/engine/SCons/Tool/g++.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,47 +31,12 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/g++.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/g++.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" -import os.path -import re -import subprocess -import SCons.Tool -import SCons.Util +#forward proxy to the preffered cxx version +from SCons.Tool.gxx import * -import gcc - -cplusplus = __import__('c++', globals(), locals(), []) - -compilers = ['g++'] - -def generate(env): -    """Add Builders and construction variables for g++ to an Environment.""" -    static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - -    if 'CXX' not in env: -        env['CXX']    = env.Detect(compilers) or compilers[0] - -    cplusplus.generate(env) - -    # platform specific settings -    if env['PLATFORM'] == 'aix': -        env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS -mminimal-toc') -        env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 -        env['SHOBJSUFFIX'] = '$OBJSUFFIX' -    elif env['PLATFORM'] == 'hpux': -        env['SHOBJSUFFIX'] = '.pic.o' -    elif env['PLATFORM'] == 'sunos': -        env['SHOBJSUFFIX'] = '.pic.o' -    # determine compiler version -    version = gcc.detect_version(env, env['CXX']) -    if version: -        env['CXXVERSION'] = version - -def exists(env): -    # is executable, and is a GNU compiler (or accepts '--version' at least) -    return gcc.detect_version(env, env.Detect(env.get('CXX', compilers)))  # Local Variables:  # tab-width:4 diff --git a/src/engine/SCons/Tool/g++.xml b/src/engine/SCons/Tool/g++.xml index ff81c16..6698869 100644 --- a/src/engine/SCons/Tool/g++.xml +++ b/src/engine/SCons/Tool/g++.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/Tool/g77.py b/src/engine/SCons/Tool/g77.py index 24731f3..36b3c43 100644 --- a/src/engine/SCons/Tool/g77.py +++ b/src/engine/SCons/Tool/g77.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/g77.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/g77.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Util  from SCons.Tool.FortranCommon import add_all_to_env, add_f77_to_env diff --git a/src/engine/SCons/Tool/g77.xml b/src/engine/SCons/Tool/g77.xml index e82472c..ae57994 100644 --- a/src/engine/SCons/Tool/g77.xml +++ b/src/engine/SCons/Tool/g77.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/Tool/gas.py b/src/engine/SCons/Tool/gas.py index 0c09c7b..75e5456 100644 --- a/src/engine/SCons/Tool/gas.py +++ b/src/engine/SCons/Tool/gas.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,9 +31,12 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/gas.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/gas.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" -as_module = __import__('as', globals(), locals(), []) +try: +    as_module = __import__('as', globals(), locals(), []) +except: +    as_module = __import__(__package__+'.as', globals(), locals(), ['*'])  assemblers = ['as', 'gas'] diff --git a/src/engine/SCons/Tool/gas.xml b/src/engine/SCons/Tool/gas.xml index 5f2a7db..95ccf27 100644 --- a/src/engine/SCons/Tool/gas.xml +++ b/src/engine/SCons/Tool/gas.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/Tool/gcc.py b/src/engine/SCons/Tool/gcc.py index 427e80c..f241c7b 100644 --- a/src/engine/SCons/Tool/gcc.py +++ b/src/engine/SCons/Tool/gcc.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,9 +31,9 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/gcc.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/gcc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" -import cc +from . import cc  import os  import re  import subprocess @@ -80,13 +80,13 @@ def detect_version(env, cc):      #line = pipe.stdout.read().strip()      #if line:      #    version = line -    line = pipe.stdout.readline() +    line = SCons.Util.to_str(pipe.stdout.readline())      match = re.search(r'[0-9]+(\.[0-9]+)+', line)      if match:          version = match.group(0)      # Non-GNU compiler's output (like AIX xlc's) may exceed the stdout buffer:      # So continue with reading to let the child process actually terminate. -    while pipe.stdout.readline(): +    while SCons.Util.to_str(pipe.stdout.readline()):          pass      ret = pipe.wait()      if ret != 0: diff --git a/src/engine/SCons/Tool/gcc.xml b/src/engine/SCons/Tool/gcc.xml index 9cac12a..17fe2a1 100644 --- a/src/engine/SCons/Tool/gcc.xml +++ b/src/engine/SCons/Tool/gcc.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/Tool/gdc.py b/src/engine/SCons/Tool/gdc.py index c9ac972..f98fabc 100644 --- a/src/engine/SCons/Tool/gdc.py +++ b/src/engine/SCons/Tool/gdc.py @@ -1,3 +1,5 @@ +from __future__ import print_function +  """SCons.Tool.gdc  Tool-specific initialization for the GDC compiler. @@ -24,7 +26,7 @@ Lib tool variables:  """  # -# 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 @@ -46,13 +48,13 @@ Lib tool variables:  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/gdc.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/gdc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Action  import SCons.Defaults  import SCons.Tool -import SCons.Tool.DCommon +import SCons.Tool.DCommon as DCommon  def generate(env): @@ -63,7 +65,7 @@ def generate(env):      static_obj.add_emitter('.d', SCons.Defaults.StaticObjectEmitter)      shared_obj.add_emitter('.d', SCons.Defaults.SharedObjectEmitter) -    env['DC'] = env.Detect('gdc') +    env['DC'] = env.Detect('gdc') or 'gdc'      env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -o $TARGET $SOURCES'      env['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}'      env['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}' @@ -79,7 +81,7 @@ def generate(env):      env['DDEBUG'] = []      if env['DC']: -        SCons.Tool.DCommon.addDPATHToEnv(env, env['DC']) +        DCommon.addDPATHToEnv(env, env['DC'])      env['DINCPREFIX'] = '-I'      env['DINCSUFFIX'] = '' @@ -95,9 +97,9 @@ def generate(env):      env['DLINKFLAGS'] = SCons.Util.CLVar('')      env['DLINKCOM'] = '$DLINK -o $TARGET $DLINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS' -    env['DSHLINK'] = '$DC' -    env['DSHLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared') -    env['SHDLINKCOM'] = '$DLINK -o $TARGET $DSHLINKFLAGS $__DSHLIBVERSIONFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS' +    env['SHDLINK'] = '$DC' +    env['SHDLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared -shared-libphobos') +    env['SHDLINKCOM'] = '$DLINK -o $TARGET $SHDLINKFLAGS $__SHDLIBVERSIONFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'      env['DLIB'] = 'lib' if env['PLATFORM'] == 'win32' else 'ar cr'      env['DLIBCOM'] = '$DLIB $_DLIBFLAGS {0}$TARGET $SOURCES $_DLINKLIBFLAGS'.format('-c ' if env['PLATFORM'] == 'win32' else '') @@ -116,22 +118,26 @@ def generate(env):      env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'      # Support for versioned libraries -    env['_DSHLIBVERSIONFLAGS'] = '$DSHLIBVERSIONFLAGS -Wl,-soname=$_DSHLIBSONAME' -    env['_DSHLIBSONAME'] = '${DShLibSonameGenerator(__env__,TARGET)}' +    env['_SHDLIBVERSIONFLAGS'] = '$SHDLIBVERSIONFLAGS -Wl,-soname=$_SHDLIBSONAME' +    env['_SHDLIBSONAME'] = '${DShLibSonameGenerator(__env__,TARGET)}'      # NOTE: this is a quick hack, the soname will only work if there is      # c/c++ linker loaded which provides callback for the ShLibSonameGenerator      env['DShLibSonameGenerator'] = SCons.Tool.ShLibSonameGenerator -    # NOTE: this is only for further reference, currently $DSHLIBVERSION does +    # NOTE: this is only for further reference, currently $SHDLIBVERSION does      # not work, the user must use $SHLIBVERSION -    env['DSHLIBVERSION'] = '$SHLIBVERSION' -    env['DSHLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS' +    env['SHDLIBVERSION'] = '$SHLIBVERSION' +    env['SHDLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS' -    SCons.Tool.createStaticLibBuilder(env) +    env['BUILDERS']['ProgramAllAtOnce'] = SCons.Builder.Builder( +        action='$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -o $TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS', +        emitter=DCommon.allAtOnceEmitter, +    )  def exists(env):      return env.Detect('gdc') +  # Local Variables:  # tab-width:4  # indent-tabs-mode:nil diff --git a/src/engine/SCons/Tool/gdc.xml b/src/engine/SCons/Tool/gdc.xml index dc3d8bf..8f71b5d 100644 --- a/src/engine/SCons/Tool/gdc.xml +++ b/src/engine/SCons/Tool/gdc.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. @@ -32,10 +32,6 @@ Sets construction variables for the D language compiler GDC.  <sets>  <item>DC</item>  <item>DCOM</item> -<item>_DINCFLAGS</item> -<item>_DVERFLAGS</item> -<item>_DDEBUGFLAGS</item> -<item>_DFLAGS</item>  <item>SHDC</item>  <item>SHDCOM</item>  <item>DPATH</item> @@ -57,16 +53,21 @@ Sets construction variables for the D language compiler GDC.  <item>SHDLINK</item>  <item>SHDLINKFLAGS</item>  <item>SHDLINKCOM</item> +<item>DLIBLINKPREFIX</item> +<item>DLIBLINKSUFFIX</item> +<item>DLIBDIRPREFIX</item> +<item>DLIBDIRSUFFIX</item>  <item>DLIB</item>  <item>DLIBCOM</item> -<item>_DLIBFLAGS</item>  <item>DLIBFLAGPREFIX</item>  <item>DLIBFLAGSUFFIX</item>  <item>DLINKFLAGPREFIX</item>  <item>DLINKFLAGSUFFIX</item> -<item>RPATHPREFIX</item> -<item>RPATHSUFFIX</item> -<item>_RPATH</item> +<item>DRPATHPREFIX</item> +<item>DRPATHSUFFIX</item> +<item>DShLibSonameGenerator</item> +<item>SHDLIBVERSION</item> +<item>SHDLIBVERSIONFLAGS</item>  </sets>  <uses>  </uses> @@ -75,7 +76,7 @@ Sets construction variables for the D language compiler GDC.  <cvar name="DC">  <summary>  <para> -DC. +The D compiler to use.  </para>  </summary>  </cvar> @@ -83,7 +84,9 @@ DC.  <cvar name="DCOM">  <summary>  <para> -DCOM. +  The command line used to compile a D file to an object file. +  Any options specified in the &cv-link-DFLAGS; construction variable +  is included on this command line.  </para>  </summary>  </cvar> @@ -91,39 +94,7 @@ DCOM.  <cvar name="DDEBUG">  <summary>  <para> -DDEBUG. -</para> -</summary> -</cvar> - -<cvar name="DDEBUGPREFIX"> -<summary> -<para> -DDEBUGPREFIX. -</para> -</summary> -</cvar> - -<cvar name="DDEBUGSUFFIX"> -<summary> -<para> -DDEBUGSUFFIX. -</para> -</summary> -</cvar> - -<cvar name="DFILESUFFIX"> -<summary> -<para> -DFILESUFFIX. -</para> -</summary> -</cvar> - -<cvar name="DFLAGPREFIX"> -<summary> -<para> -DFLAGPREFIX. +  List of debug tags to enable when compiling.  </para>  </summary>  </cvar> @@ -131,257 +102,270 @@ DFLAGPREFIX.  <cvar name="DFLAGS">  <summary>  <para> -DFLAGS. -</para> -</summary> -</cvar> - -<cvar name="DFLAGSUFFIX"> -<summary> -<para> -DFLAGSUFFIX. +  General options that are passed to the D compiler.  </para>  </summary>  </cvar> -<cvar name="DINCPREFIX"> +<cvar name="DLIB">  <summary>  <para> -DINCPREFIX. +  Name of the lib tool to use for D codes.  </para>  </summary>  </cvar> -<cvar name="DINCSUFFIX"> +<cvar name="DLIBCOM">  <summary>  <para> -DINCSUFFIX. +  The command line to use when creating libraries.  </para>  </summary>  </cvar> -<cvar name="DLIB"> +<cvar name="DLINK">  <summary>  <para> -DLIB. +  Name of the linker to use for linking systems including D sources.  </para>  </summary>  </cvar> -<cvar name="DLIBCOM"> +<cvar name="DLINKCOM">  <summary>  <para> -DLIBCOM. +  The command line to use when linking systems including D sources.  </para>  </summary>  </cvar> -<cvar name="DLIBDIRPREFIX"> +<cvar name="DLINKFLAGS">  <summary>  <para> -DLIBDIRPREFIX. +List of linker flags.  </para>  </summary>  </cvar> -<cvar name="DLIBDIRSUFFIX"> +<cvar name="DPATH">  <summary>  <para> -DLIBDIRSUFFIX. +  List of paths to search for import modules.  </para>  </summary>  </cvar> -<cvar name="DLIBFLAGPREFIX"> +<cvar name="DVERSIONS">  <summary>  <para> -DLIBFLAGPREFIX. +  List of version tags to enable when compiling.  </para>  </summary>  </cvar> -<cvar name="DLIBFLAGSUFFIX"> +<cvar name="SHDC">  <summary>  <para> -DLIBFLAGSUFFIX. +  The name of the compiler to use when compiling D source +  destined to be in a shared objects.  </para>  </summary>  </cvar> -<cvar name="DLIBLINKPREFIX"> +<cvar name="SHDCOM">  <summary>  <para> -DLIBLINKPREFIX. +  The command line to use when compiling code to be part of shared objects.  </para>  </summary>  </cvar> -<cvar name="DLIBLINKSUFFIX"> +<cvar name="SHDLINK">  <summary>  <para> -DLIBLINKSUFFIX. +  The linker to use when creating shared objects for code bases +  include D sources.  </para>  </summary>  </cvar> -<cvar name="DLINK"> +<cvar name="SHDLINKCOM">  <summary>  <para> -DLINK. +  The command line to use when generating shared objects.  </para>  </summary>  </cvar> -<cvar name="DLINKCOM"> +<cvar name="SHDLINKFLAGS">  <summary>  <para> -DLINKCOM. +  The list of flags to use when generating a shared object.  </para>  </summary>  </cvar> -<cvar name="DLINKFLAGPREFIX"> -<summary> -<para> -DLINKFLAGPREFIX. -</para> -</summary> +<cvar name="DVERSUFFIX"> +  <summary> +    <para> +      DVERSUFFIX. +    </para> + </summary>  </cvar> -<cvar name="DLINKFLAGS"> -<summary> -<para> -DLINKFLAGS. -</para> -</summary> +<cvar name="DVERPREFIX"> +  <summary> +    <para> +      DVERPREFIX. +    </para> + </summary>  </cvar>  <cvar name="DLINKFLAGSUFFIX"> -<summary> -<para> -DLINKFLAGSUFFIX. -</para> -</summary> +  <summary> +    <para> +      DLINKFLAGSUFFIX. +    </para> + </summary>  </cvar> -<cvar name="DPATH"> -<summary> -<para> -DPATH. -</para> -</summary> +<cvar name="DLINKFLAGPREFIX"> +  <summary> +    <para> +      DLINKFLAGPREFIX. +    </para> + </summary>  </cvar> -<cvar name="DVERPREFIX"> -<summary> -<para> -DVERPREFIX. -</para> -</summary> +<cvar name="DLIBLINKSUFFIX"> +  <summary> +    <para> +      DLIBLINKSUFFIX. +    </para> + </summary>  </cvar> -<cvar name="DVERSIONS"> -<summary> -<para> -DVERSIONS. -</para> -</summary> +<cvar name="DLIBLINKPREFIX"> +  <summary> +    <para> +      DLIBLINKPREFIX. +    </para> + </summary>  </cvar> -<cvar name="DVERSUFFIX"> -<summary> -<para> -DVERSUFFIX. -</para> -</summary> +<cvar name="DLIBFLAGSUFFIX"> +  <summary> +    <para> +      DLIBFLAGSUFFIX. +    </para> + </summary>  </cvar> -<cvar name="SHDC"> -<summary> -<para> -SHDC. -</para> -</summary> +<cvar name="DLIBFLAGPREFIX"> +  <summary> +    <para> +      DLIBFLAGPREFIX. +    </para> + </summary>  </cvar> -<cvar name="SHDCOM"> -<summary> -<para> -SHDCOM. -</para> -</summary> +<cvar name="DLIBDIRSUFFIX"> +  <summary> +    <para> +      DLIBLINKSUFFIX. +    </para> + </summary>  </cvar> -<cvar name="SHDLINK"> -<summary> -<para> -SHDLINK. -</para> -</summary> +<cvar name="DLIBDIRPREFIX"> +  <summary> +    <para> +      DLIBLINKPREFIX. +    </para> + </summary>  </cvar> -<cvar name="SHDLINKCOM"> -<summary> -<para> -SHDLINKCOM. -</para> -</summary> +<cvar name="DINCSUFFIX"> +  <summary> +    <para> +      DLIBFLAGSUFFIX. +    </para> + </summary>  </cvar> -<cvar name="SHDLINKFLAGS"> -<summary> -<para> -SHDLINKFLAGS. -</para> -</summary> -</cvar> -<cvar name="_DDEBUGFLAGS"> -<summary> -<para> -_DDEBUGFLAGS. -</para> -</summary> +<cvar name="DINCPREFIX"> +  <summary> +    <para> +      DINCPREFIX. +    </para> + </summary>  </cvar> -<cvar name="_DFLAGS"> -<summary> -<para> -_DFLAGS. -</para> -</summary> +<cvar name="DFLAGSUFFIX"> +  <summary> +    <para> +      DFLAGSUFFIX. +    </para> + </summary>  </cvar> -<cvar name="_DINCFLAGS"> -<summary> -<para> -_DINCFLAGS. -</para> -</summary> +<cvar name="DFLAGPREFIX"> +  <summary> +    <para> +      DFLAGPREFIX. +    </para> + </summary>  </cvar> -<cvar name="_DLIBDIRFLAGS"> -<summary> -<para> -_DLIBDIRFLAGS. -</para> -</summary> +<cvar name="DFILESUFFIX"> +  <summary> +    <para> +      DFILESUFFIX. +    </para> + </summary>  </cvar> -<cvar name="_DLIBFLAGS"> -<summary> -<para> -_DLIBFLAGS. -</para> -</summary> +<cvar name="DDEBUGPREFIX"> +  <summary> +    <para> +      DDEBUGPREFIX. +    </para> + </summary>  </cvar> -<cvar name="_DVERFLAGS"> -<summary> -<para> -_DVERFLAGS. -</para> -</summary> -</cvar> +<cvar name="DDEBUGSUFFIX"> +  <summary> +    <para> +      DDEBUGSUFFIX. +    </para> + </summary> +</cvar> + +<builder name="ProgramAllAtOnce"> +  <summary> +    <para> +      Builds an executable from D sources without first creating individual +      objects for each file. +    </para> +    <para> +      D sources can be compiled file-by-file as C and C++ source are, and +      D is integrated into the &scons; Object and Program builders for +      this model of build. D codes can though do whole source +      meta-programming (some of the testing frameworks do this). For this +      it is imperative that all sources are compiled and linked in a single call of +      the D compiler. This builder serves that purpose. +    </para> +    <example_commands> +      env.ProgramAllAtOnce('executable', ['mod_a.d, mod_b.d', 'mod_c.d']) +    </example_commands> +    <para> +      This command will compile the modules mod_a, mod_b, and mod_c in a +      single compilation process without first creating object files for +      the modules. Some of the D compilers will create executable.o others +      will not. +    </para> +  </summary> +</builder>  </sconsdoc> diff --git a/src/engine/SCons/Tool/gettext.xml b/src/engine/SCons/Tool/gettext.xml index 5fe4a51..299184a 100644 --- a/src/engine/SCons/Tool/gettext.xml +++ b/src/engine/SCons/Tool/gettext.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/Tool/gettext.py b/src/engine/SCons/Tool/gettext_tool.py index 79c1dd2..e500a18 100644 --- a/src/engine/SCons/Tool/gettext.py +++ b/src/engine/SCons/Tool/gettext_tool.py @@ -2,7 +2,7 @@  """ -# 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 @@ -23,7 +23,7 @@  # 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/Tool/gettext.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/gettext_tool.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  #############################################################################  def generate(env,**kw): diff --git a/src/engine/SCons/Tool/gfortran.py b/src/engine/SCons/Tool/gfortran.py index d25073c..730ad55 100644 --- a/src/engine/SCons/Tool/gfortran.py +++ b/src/engine/SCons/Tool/gfortran.py @@ -10,7 +10,7 @@ selection method.  """  # -# 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 @@ -32,11 +32,11 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/gfortran.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/gfortran.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Util -import fortran +from . import fortran  def generate(env):      """Add Builders and construction variables for gfortran to an diff --git a/src/engine/SCons/Tool/gfortran.xml b/src/engine/SCons/Tool/gfortran.xml index e8ffdc1..926a2c8 100644 --- a/src/engine/SCons/Tool/gfortran.xml +++ b/src/engine/SCons/Tool/gfortran.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/Tool/gnulink.py b/src/engine/SCons/Tool/gnulink.py index 794bee6..56bae9a 100644 --- a/src/engine/SCons/Tool/gnulink.py +++ b/src/engine/SCons/Tool/gnulink.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/gnulink.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/gnulink.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Util  import SCons.Tool @@ -39,7 +39,7 @@ import os  import sys  import re -import link +from . import link  def generate(env): diff --git a/src/engine/SCons/Tool/gnulink.xml b/src/engine/SCons/Tool/gnulink.xml index 325d469..fce7a55 100644 --- a/src/engine/SCons/Tool/gnulink.xml +++ b/src/engine/SCons/Tool/gnulink.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/Tool/gs.py b/src/engine/SCons/Tool/gs.py index 77a49fc..ec5ab27 100644 --- a/src/engine/SCons/Tool/gs.py +++ b/src/engine/SCons/Tool/gs.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/gs.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/gs.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Action  import SCons.Builder @@ -62,12 +62,12 @@ def generate(env):          if GhostscriptAction is None:              GhostscriptAction = SCons.Action.Action('$GSCOM', '$GSCOMSTR') -        import pdf +        from SCons.Tool import pdf          pdf.generate(env)          bld = env['BUILDERS']['PDF']          bld.add_action('.ps', GhostscriptAction) -    except ImportError, e: +    except ImportError as e:          pass      gsbuilder = SCons.Builder.Builder(action = SCons.Action.Action('$GSCOM', '$GSCOMSTR')) diff --git a/src/engine/SCons/Tool/gs.xml b/src/engine/SCons/Tool/gs.xml index 180cc28..40e6f06 100644 --- a/src/engine/SCons/Tool/gs.xml +++ b/src/engine/SCons/Tool/gs.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/Tool/Subversion.py b/src/engine/SCons/Tool/gxx.py index cb34e07..709f72b 100644 --- a/src/engine/SCons/Tool/Subversion.py +++ b/src/engine/SCons/Tool/gxx.py @@ -1,6 +1,6 @@ -"""SCons.Tool.Subversion.py +"""SCons.Tool.g++ -Tool-specific initialization for Subversion. +Tool-specific initialization for g++.  There normally shouldn't be any need to import this module directly.  It will usually be imported through the generic SCons.Tool.Tool() @@ -8,7 +8,8 @@ selection method.  """ -# 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 @@ -28,40 +29,48 @@ selection method.  # 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/Tool/Subversion.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/gxx.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os.path +import re +import subprocess -import SCons.Action -import SCons.Builder +import SCons.Tool  import SCons.Util +from . import gcc +from . import cxx + +compilers = ['g++'] +  def generate(env): -    """Add a Builder factory function and construction variables for -    Subversion to an Environment.""" +    """Add Builders and construction variables for g++ to an Environment.""" +    static_obj, shared_obj = SCons.Tool.createObjBuilders(env) -    def SubversionFactory(repos, module='', env=env): -        """ """ -        # fail if repos is not an absolute path name? -        import SCons.Warnings as W -        W.warn(W.DeprecatedSourceCodeWarning, """The Subversion() factory is deprecated and there is no replacement.""") -        if module != '': -            module = os.path.join(module, '') -        act = SCons.Action.Action('$SVNCOM', '$SVNCOMSTR') -        return SCons.Builder.Builder(action = act, -                                     env = env, -                                     SVNREPOSITORY = repos, -                                     SVNMODULE = module) +    if 'CXX' not in env: +        env['CXX']    = env.Detect(compilers) or compilers[0] -    env.Subversion = SubversionFactory +    cxx.generate(env) -    env['SVN']      = 'svn' -    env['SVNFLAGS'] = SCons.Util.CLVar('') -    env['SVNCOM']   = '$SVN $SVNFLAGS cat $SVNREPOSITORY/$SVNMODULE$TARGET > $TARGET' +    # platform specific settings +    if env['PLATFORM'] == 'aix': +        env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS -mminimal-toc') +        env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 +        env['SHOBJSUFFIX'] = '$OBJSUFFIX' +    elif env['PLATFORM'] == 'hpux': +        env['SHOBJSUFFIX'] = '.pic.o' +    elif env['PLATFORM'] == 'sunos': +        env['SHOBJSUFFIX'] = '.pic.o' +    # determine compiler version +    version = gcc.detect_version(env, env['CXX']) +    if version: +        env['CXXVERSION'] = version  def exists(env): -    return env.Detect('svn') +    # is executable, and is a GNU compiler (or accepts '--version' at least) +    return gcc.detect_version(env, env.Detect(env.get('CXX', compilers)))  # Local Variables:  # tab-width:4 diff --git a/src/engine/SCons/Tool/hpc++.py b/src/engine/SCons/Tool/hpc++.py index d713825..9471ef5 100644 --- a/src/engine/SCons/Tool/hpc++.py +++ b/src/engine/SCons/Tool/hpc++.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,51 +31,12 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/hpc++.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/hpc++.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" -import os.path -import SCons.Util +#forward proxy to the preffered cxx version +from SCons.Tool.hpcxx import * -cplusplus = __import__('c++', globals(), locals(), []) - -acc = None - -# search for the acc compiler and linker front end - -try: -    dirs = os.listdir('/opt') -except (IOError, OSError): -    # Not being able to read the directory because it doesn't exist -    # (IOError) or isn't readable (OSError) is okay. -    dirs = [] - -for dir in dirs: -    cc = '/opt/' + dir + '/bin/aCC' -    if os.path.exists(cc): -        acc = cc -        break - -         -def generate(env): -    """Add Builders and construction variables for g++ to an Environment.""" -    cplusplus.generate(env) - -    if acc: -        env['CXX']        = acc or 'aCC' -        env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS +Z') -        # determine version of aCC -        line = os.popen(acc + ' -V 2>&1').readline().rstrip() -        if line.find('aCC: HP ANSI C++') == 0: -            env['CXXVERSION'] = line.split()[-1] - -        if env['PLATFORM'] == 'cygwin': -            env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS') -        else: -            env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS +Z') - -def exists(env): -    return acc  # Local Variables:  # tab-width:4 diff --git a/src/engine/SCons/Tool/hpc++.xml b/src/engine/SCons/Tool/hpc++.xml index b69f765..d3d11c4 100644 --- a/src/engine/SCons/Tool/hpc++.xml +++ b/src/engine/SCons/Tool/hpc++.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/Tool/hpcc.py b/src/engine/SCons/Tool/hpcc.py index 11aec7b..0f6a5b4 100644 --- a/src/engine/SCons/Tool/hpcc.py +++ b/src/engine/SCons/Tool/hpcc.py @@ -8,7 +8,7 @@ selection method.  """  # -# 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 @@ -30,11 +30,11 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/hpcc.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/hpcc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Util -import cc +from . import cc  def generate(env):      """Add Builders and construction variables for aCC & cc to an Environment.""" diff --git a/src/engine/SCons/Tool/hpcc.xml b/src/engine/SCons/Tool/hpcc.xml index a770dc9..765860f 100644 --- a/src/engine/SCons/Tool/hpcc.xml +++ b/src/engine/SCons/Tool/hpcc.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/Tool/SCCS.py b/src/engine/SCons/Tool/hpcxx.py index c4dbbf8..847eaca 100644 --- a/src/engine/SCons/Tool/SCCS.py +++ b/src/engine/SCons/Tool/hpcxx.py @@ -1,6 +1,6 @@ -"""SCons.Tool.SCCS.py +"""SCons.Tool.hpc++ -Tool-specific initialization for SCCS. +Tool-specific initialization for c++ on HP/UX.  There normally shouldn't be any need to import this module directly.  It will usually be imported through the generic SCons.Tool.Tool() @@ -8,7 +8,8 @@ selection method.  """ -# 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 @@ -28,33 +29,56 @@ selection method.  # 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/Tool/hpcxx.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" -__revision__ = "src/engine/SCons/Tool/SCCS.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +import os.path -import SCons.Action -import SCons.Builder  import SCons.Util -def generate(env): -    """Add a Builder factory function and construction variables for -    SCCS to an Environment.""" +import SCons.Tool.cxx +cplusplus = SCons.Tool.cxx +#cplusplus = __import__('cxx', globals(), locals(), []) + -    def SCCSFactory(env=env): -        """ """ -        import SCons.Warnings as W -        W.warn(W.DeprecatedSourceCodeWarning, """The SCCS() factory is deprecated and there is no replacement.""") -        act = SCons.Action.Action('$SCCSCOM', '$SCCSCOMSTR') -        return SCons.Builder.Builder(action = act, env = env) +acc = None + +# search for the acc compiler and linker front end + +try: +    dirs = os.listdir('/opt') +except (IOError, OSError): +    # Not being able to read the directory because it doesn't exist +    # (IOError) or isn't readable (OSError) is okay. +    dirs = [] + +for dir in dirs: +    cc = '/opt/' + dir + '/bin/aCC' +    if os.path.exists(cc): +        acc = cc +        break + +         +def generate(env): +    """Add Builders and construction variables for g++ to an Environment.""" +    cplusplus.generate(env) -    env.SCCS = SCCSFactory +    if acc: +        env['CXX']        = acc or 'aCC' +        env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS +Z') +        # determine version of aCC +        line = os.popen(acc + ' -V 2>&1').readline().rstrip() +        if line.find('aCC: HP ANSI C++') == 0: +            env['CXXVERSION'] = line.split()[-1] -    env['SCCS']         = 'sccs' -    env['SCCSFLAGS']    = SCons.Util.CLVar('') -    env['SCCSGETFLAGS'] = SCons.Util.CLVar('') -    env['SCCSCOM']      = '$SCCS $SCCSFLAGS get $SCCSGETFLAGS $TARGET' +        if env['PLATFORM'] == 'cygwin': +            env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS') +        else: +            env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS +Z')  def exists(env): -    return env.Detect('sccs') +    return acc  # Local Variables:  # tab-width:4 diff --git a/src/engine/SCons/Tool/hplink.py b/src/engine/SCons/Tool/hplink.py index d120827..2329282 100644 --- a/src/engine/SCons/Tool/hplink.py +++ b/src/engine/SCons/Tool/hplink.py @@ -8,7 +8,7 @@ selection method.  """  # -# 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 @@ -30,14 +30,14 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/hplink.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/hplink.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os  import os.path  import SCons.Util -import link +from . import link  ccLinker = None diff --git a/src/engine/SCons/Tool/hplink.xml b/src/engine/SCons/Tool/hplink.xml index 233d4d5..ffa6c0d 100644 --- a/src/engine/SCons/Tool/hplink.xml +++ b/src/engine/SCons/Tool/hplink.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/Tool/icc.py b/src/engine/SCons/Tool/icc.py index 4ae57e7..1f9e8cf 100644 --- a/src/engine/SCons/Tool/icc.py +++ b/src/engine/SCons/Tool/icc.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,9 +31,9 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/icc.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/icc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" -import cc +from . import cc  def generate(env):      """Add Builders and construction variables for the OS/2 to an Environment.""" diff --git a/src/engine/SCons/Tool/icc.xml b/src/engine/SCons/Tool/icc.xml index 1675e4d..b0af318 100644 --- a/src/engine/SCons/Tool/icc.xml +++ b/src/engine/SCons/Tool/icc.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/Tool/icl.py b/src/engine/SCons/Tool/icl.py index 846368e..99410cd 100644 --- a/src/engine/SCons/Tool/icl.py +++ b/src/engine/SCons/Tool/icl.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/icl.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/icl.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Tool.intelc diff --git a/src/engine/SCons/Tool/icl.xml b/src/engine/SCons/Tool/icl.xml index 6f55403..035a3a9 100644 --- a/src/engine/SCons/Tool/icl.xml +++ b/src/engine/SCons/Tool/icl.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/Tool/ifl.py b/src/engine/SCons/Tool/ifl.py index 61622bf..116c9ac 100644 --- a/src/engine/SCons/Tool/ifl.py +++ b/src/engine/SCons/Tool/ifl.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,11 +31,11 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/ifl.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/ifl.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Defaults  from SCons.Scanner.Fortran import FortranScan -from FortranCommon import add_all_to_env +from .FortranCommon import add_all_to_env  def generate(env):      """Add Builders and construction variables for ifl to an Environment.""" diff --git a/src/engine/SCons/Tool/ifl.xml b/src/engine/SCons/Tool/ifl.xml index 2d9a1f6..d693ef6 100644 --- a/src/engine/SCons/Tool/ifl.xml +++ b/src/engine/SCons/Tool/ifl.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/Tool/ifort.py b/src/engine/SCons/Tool/ifort.py index b44a6f7..8e88946 100644 --- a/src/engine/SCons/Tool/ifort.py +++ b/src/engine/SCons/Tool/ifort.py @@ -10,7 +10,7 @@ selection method.  """  # -# 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 @@ -32,11 +32,11 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/ifort.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/ifort.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Defaults  from SCons.Scanner.Fortran import FortranScan -from FortranCommon import add_all_to_env +from .FortranCommon import add_all_to_env  def generate(env):      """Add Builders and construction variables for ifort to an Environment.""" diff --git a/src/engine/SCons/Tool/ifort.xml b/src/engine/SCons/Tool/ifort.xml index f2644f2..26d4ca9 100644 --- a/src/engine/SCons/Tool/ifort.xml +++ b/src/engine/SCons/Tool/ifort.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/Tool/ilink.py b/src/engine/SCons/Tool/ilink.py index d66c75e..577e54b 100644 --- a/src/engine/SCons/Tool/ilink.py +++ b/src/engine/SCons/Tool/ilink.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/ilink.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/ilink.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Defaults  import SCons.Tool diff --git a/src/engine/SCons/Tool/ilink.xml b/src/engine/SCons/Tool/ilink.xml index 700450f..941db53 100644 --- a/src/engine/SCons/Tool/ilink.xml +++ b/src/engine/SCons/Tool/ilink.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/Tool/ilink32.py b/src/engine/SCons/Tool/ilink32.py index b07afc8..3e8e095 100644 --- a/src/engine/SCons/Tool/ilink32.py +++ b/src/engine/SCons/Tool/ilink32.py @@ -5,7 +5,7 @@ XXX  """  # -# 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 @@ -27,7 +27,7 @@ XXX  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/ilink32.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/ilink32.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Tool  import SCons.Tool.bcc32 diff --git a/src/engine/SCons/Tool/ilink32.xml b/src/engine/SCons/Tool/ilink32.xml index 69a0cd2..02343d9 100644 --- a/src/engine/SCons/Tool/ilink32.xml +++ b/src/engine/SCons/Tool/ilink32.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/Tool/install.py b/src/engine/SCons/Tool/install.py index 4cebf5b..12dcf8f 100644 --- a/src/engine/SCons/Tool/install.py +++ b/src/engine/SCons/Tool/install.py @@ -8,7 +8,7 @@ selection method.  """  # -# 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 @@ -29,8 +29,9 @@ selection method.  # 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/Tool/install.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/install.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os  import re @@ -48,7 +49,7 @@ _UNIQUE_INSTALLED_FILES = None  class CopytreeError(EnvironmentError):      pass -                 +  # This is a patched version of shutil.copytree from python 2.5.  It  # doesn't fail if the dir exists, which regular copytree does  # (annoyingly).  Note the XXX comment in the docstring. @@ -83,21 +84,21 @@ def scons_copytree(src, dst, symlinks=False):              else:                  shutil.copy2(srcname, dstname)              # XXX What about devices, sockets etc.? -        except (IOError, os.error), why: +        except (IOError, os.error) as why:              errors.append((srcname, dstname, str(why)))          # catch the CopytreeError from the recursive copytree so that we can          # continue with other files -        except CopytreeError, err: +        except CopytreeError as err:              errors.extend(err.args[0])      try:          shutil.copystat(src, dst)      except SCons.Util.WinError:          # can't copy file access times on Windows          pass -    except OSError, why: +    except OSError as why:          errors.extend((src, dst, str(why)))      if errors: -        raise CopytreeError, errors +        raise CopytreeError(errors)  # @@ -165,10 +166,9 @@ def listShlibLinksToInstall(dest, source, env):  def installShlibLinks(dest, source, env):      """If we are installing a versioned shared library create the required links."""      Verbose = False -      symlinks = listShlibLinksToInstall(dest, source, env)      if Verbose: -        print 'installShlibLinks: symlinks=%r' % SCons.Tool.StringizeLibSymlinks(symlinks) +        print('installShlibLinks: symlinks={:r}'.format(SCons.Tool.StringizeLibSymlinks(symlinks)))      if symlinks:          SCons.Tool.CreateLibSymlinks(env, symlinks)      return @@ -244,12 +244,10 @@ def add_versioned_targets_to_INSTALLED_FILES(target, source, env):      Verbose = False      _INSTALLED_FILES.extend(target)      if Verbose: -        print "add_versioned_targets_to_INSTALLED_FILES: target=%r" % map(str, target) - +        print("add_versioned_targets_to_INSTALLED_FILES: target={:r}".format(list(map(str, target))))      symlinks = listShlibLinksToInstall(target[0], source, env)      if symlinks:          SCons.Tool.EmitLibSymlinks(env, symlinks, target[0]) -              _UNIQUE_INSTALLED_FILES = None      return (target, source) @@ -307,6 +305,7 @@ def InstallBuilderWrapper(env, target=None, source=None, dir=None, **kw):              tgt.extend(BaseInstallBuilder(env, target, src, **kw))      return tgt +  def InstallAsBuilderWrapper(env, target=None, source=None, **kw):      result = []      for src, tgt in map(lambda x, y: (x, y), source, target): @@ -315,6 +314,7 @@ def InstallAsBuilderWrapper(env, target=None, source=None, **kw):  BaseVersionedInstallBuilder = None +  def InstallVersionedBuilderWrapper(env, target=None, source=None, dir=None, **kw):      if target and dir:          import SCons.Errors @@ -346,6 +346,7 @@ def InstallVersionedBuilderWrapper(env, target=None, source=None, dir=None, **kw  added = None +  def generate(env):      from SCons.Script import AddOption, GetOption diff --git a/src/engine/SCons/Tool/install.xml b/src/engine/SCons/Tool/install.xml index 40e83b8..139cd1e 100644 --- a/src/engine/SCons/Tool/install.xml +++ b/src/engine/SCons/Tool/install.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/Tool/intelc.py b/src/engine/SCons/Tool/intelc.py index 995377c..425f221 100644 --- a/src/engine/SCons/Tool/intelc.py +++ b/src/engine/SCons/Tool/intelc.py @@ -10,7 +10,7 @@ selection method.  """  # -# 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 @@ -30,9 +30,9 @@ selection method.  # 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 +from __future__ import division, print_function -__revision__ = "src/engine/SCons/Tool/intelc.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/intelc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import math, sys, os.path, glob, string, re @@ -245,17 +245,16 @@ def get_all_compiler_versions():                          # Registry points to nonexistent dir.  Ignore this                          # version.                          value = get_intel_registry_value('ProductDir', subkey, 'IA32') -                    except MissingRegistryError, e: +                    except MissingRegistryError as e:                          # Registry key is left dangling (potentially                          # after uninstalling). -                        print \ -                            "scons: *** Ignoring the registry key for the Intel compiler version %s.\n" \ +                        print("scons: *** Ignoring the registry key for the Intel compiler version %s.\n" \                              "scons: *** It seems that the compiler was uninstalled and that the registry\n" \ -                            "scons: *** was not cleaned up properly.\n" % subkey +                            "scons: *** was not cleaned up properly.\n" % subkey)                      else: -                        print "scons: *** Ignoring "+str(value) +                        print("scons: *** Ignoring "+str(value))                  i = i + 1          except EnvironmentError: @@ -293,7 +292,7 @@ def get_all_compiler_versions():              # JPA: For the new version of Intel compiler 2016.1.              m = re.search(r'([0-9]{0,4})(?:_sp\d*)?\.([0-9][0-9.]*)$', d)              if m: -                versions.append("%s.%s"%(m.group(1), m,group(2))) +                versions.append("%s.%s"%(m.group(1), m.group(2)))      def keyfunc(str):          """Given a dot-separated version string, return a tuple of ints representing it.""" @@ -486,8 +485,8 @@ def generate(env, version=None, abi=None, topdir=None, verbose=0):              bindir="bin"              libdir="lib"          if verbose: -            print "Intel C compiler: using version %s (%g), abi %s, in '%s/%s'"%\ -                  (repr(version), linux_ver_normalize(version),abi,topdir,bindir) +            print("Intel C compiler: using version %s (%g), abi %s, in '%s/%s'"%\ +                  (repr(version), linux_ver_normalize(version),abi,topdir,bindir))              if is_linux:                  # Show the actual compiler version by running the compiler.                  os.system('%s/%s/icc --version'%(topdir,bindir)) @@ -501,14 +500,14 @@ def generate(env, version=None, abi=None, topdir=None, verbose=0):                     'LIB'             : libdir,                     'PATH'            : bindir,                     'LD_LIBRARY_PATH' : libdir} -            for p in paths.keys(): +            for p in list(paths.keys()):                  env.PrependENVPath(p, os.path.join(topdir, paths[p]))          if is_mac:              paths={'INCLUDE'         : 'include',                     'LIB'             : libdir,                     'PATH'            : bindir,                     'LD_LIBRARY_PATH' : libdir} -            for p in paths.keys(): +            for p in list(paths.keys()):                  env.PrependENVPath(p, os.path.join(topdir, paths[p]))          if is_windows:              #       env key    reg valname   default subdir of top diff --git a/src/engine/SCons/Tool/intelc.xml b/src/engine/SCons/Tool/intelc.xml index 9f88c14..3ec9ddd 100644 --- a/src/engine/SCons/Tool/intelc.xml +++ b/src/engine/SCons/Tool/intelc.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/Tool/ipkg.py b/src/engine/SCons/Tool/ipkg.py index f7f8fb2..4ad53c9 100644 --- a/src/engine/SCons/Tool/ipkg.py +++ b/src/engine/SCons/Tool/ipkg.py @@ -11,7 +11,7 @@ packages fake_root.  """  # -# 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 @@ -33,7 +33,7 @@ packages fake_root.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/ipkg.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/ipkg.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os @@ -44,20 +44,26 @@ def generate(env):      try:          bld = env['BUILDERS']['Ipkg']      except KeyError: -        bld = SCons.Builder.Builder( action  = '$IPKGCOM', -                                     suffix  = '$IPKGSUFFIX', -                                     source_scanner = None, -                                     target_scanner = None) +        bld = SCons.Builder.Builder(action='$IPKGCOM', +                                    suffix='$IPKGSUFFIX', +                                    source_scanner=None, +                                    target_scanner=None)          env['BUILDERS']['Ipkg'] = bld -    env['IPKG']       = 'ipkg-build' -    env['IPKGCOM']    = '$IPKG $IPKGFLAGS ${SOURCE}' -    env['IPKGUSER']   = os.popen('id -un').read().strip() -    env['IPKGGROUP']  = os.popen('id -gn').read().strip() -    env['IPKGFLAGS']  = SCons.Util.CLVar('-o $IPKGUSER -g $IPKGGROUP') + +    env['IPKG'] = 'ipkg-build' +    env['IPKGCOM'] = '$IPKG $IPKGFLAGS ${SOURCE}' + +    if env.WhereIs('id'): +        env['IPKGUSER'] = os.popen('id -un').read().strip() +        env['IPKGGROUP'] = os.popen('id -gn').read().strip() +    env['IPKGFLAGS'] = SCons.Util.CLVar('-o $IPKGUSER -g $IPKGGROUP')      env['IPKGSUFFIX'] = '.ipk'  def exists(env): +    """ +    Can we find the tool +    """      return env.Detect('ipkg-build')  # Local Variables: diff --git a/src/engine/SCons/Tool/jar.py b/src/engine/SCons/Tool/jar.py index ba69547..a56dd70 100644 --- a/src/engine/SCons/Tool/jar.py +++ b/src/engine/SCons/Tool/jar.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/jar.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/jar.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Subst  import SCons.Util diff --git a/src/engine/SCons/Tool/jar.xml b/src/engine/SCons/Tool/jar.xml index 7141cc2..e18207e 100644 --- a/src/engine/SCons/Tool/jar.xml +++ b/src/engine/SCons/Tool/jar.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/Tool/javac.py b/src/engine/SCons/Tool/javac.py index adaf35f..f3cabf3 100644 --- a/src/engine/SCons/Tool/javac.py +++ b/src/engine/SCons/Tool/javac.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -30,7 +30,7 @@ selection method.  # 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/Tool/javac.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/javac.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os  import os.path diff --git a/src/engine/SCons/Tool/javac.xml b/src/engine/SCons/Tool/javac.xml index 0f3ee13..be478ba 100644 --- a/src/engine/SCons/Tool/javac.xml +++ b/src/engine/SCons/Tool/javac.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/Tool/javacTests.py b/src/engine/SCons/Tool/javacTests.py index 6cfb42e..0debbb6 100644 --- a/src/engine/SCons/Tool/javacTests.py +++ b/src/engine/SCons/Tool/javacTests.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 diff --git a/src/engine/SCons/Tool/javah.py b/src/engine/SCons/Tool/javah.py index 76a49d4..0e1885c 100644 --- a/src/engine/SCons/Tool/javah.py +++ b/src/engine/SCons/Tool/javah.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/javah.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/javah.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os.path diff --git a/src/engine/SCons/Tool/javah.xml b/src/engine/SCons/Tool/javah.xml index 35a5e28..f362e3e 100644 --- a/src/engine/SCons/Tool/javah.xml +++ b/src/engine/SCons/Tool/javah.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/Tool/latex.py b/src/engine/SCons/Tool/latex.py index 18c53aa..aa7ea15 100644 --- a/src/engine/SCons/Tool/latex.py +++ b/src/engine/SCons/Tool/latex.py @@ -10,7 +10,7 @@ selection method.  """  # -# 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 @@ -32,7 +32,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/latex.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/latex.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Action  import SCons.Defaults @@ -55,10 +55,10 @@ def generate(env):      env.AppendUnique(LATEXSUFFIXES=SCons.Tool.LaTeXSuffixes) -    import dvi +    from . import dvi      dvi.generate(env) -    import pdf +    from . import pdf      pdf.generate(env)      bld = env['BUILDERS']['DVI'] diff --git a/src/engine/SCons/Tool/latex.xml b/src/engine/SCons/Tool/latex.xml index 1504317..bb0816d 100644 --- a/src/engine/SCons/Tool/latex.xml +++ b/src/engine/SCons/Tool/latex.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/Tool/ldc.py b/src/engine/SCons/Tool/ldc.py index f0d726e..5bb04ff 100644 --- a/src/engine/SCons/Tool/ldc.py +++ b/src/engine/SCons/Tool/ldc.py @@ -1,7 +1,9 @@ +from __future__ import print_function +  """SCons.Tool.ldc  Tool-specific initialization for the LDC compiler. -(http://www.dsource.org/projects/ldc) +(https://github.com/ldc-developers/ldc)  Developed by Russel Winder (russel@winder.org.uk)  2012-05-09 onwards @@ -24,7 +26,7 @@ Lib tool variables:  """  # -# 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 @@ -46,7 +48,7 @@ Lib tool variables:  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/ldc.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/ldc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os  import subprocess @@ -57,7 +59,7 @@ import SCons.Defaults  import SCons.Scanner.D  import SCons.Tool -import SCons.Tool.DCommon +import SCons.Tool.DCommon as DCommon  def generate(env): @@ -68,7 +70,7 @@ def generate(env):      static_obj.add_emitter('.d', SCons.Defaults.StaticObjectEmitter)      shared_obj.add_emitter('.d', SCons.Defaults.SharedObjectEmitter) -    env['DC'] = env.Detect('ldc2') +    env['DC'] = env.Detect('ldc2') or 'ldc2'      env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -of=$TARGET $SOURCES'      env['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}'      env['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}' @@ -84,7 +86,7 @@ def generate(env):      env['DDEBUG'] = []      if env['DC']: -        SCons.Tool.DCommon.addDPATHToEnv(env, env['DC']) +        DCommon.addDPATHToEnv(env, env['DC'])      env['DINCPREFIX'] = '-I='      env['DINCSUFFIX'] = '' @@ -100,54 +102,55 @@ def generate(env):      env['DLINKFLAGS'] = SCons.Util.CLVar('')      env['DLINKCOM'] = '$DLINK -of=$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS' -    env['DSHLINK'] = '$DC' -    env['DSHLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared -defaultlib=phobos2-ldc') -    # Hack for Fedora the packages of which use the wrong name :-( -    if os.path.exists('/usr/lib64/libphobos-ldc.so') or  os.path.exists('/usr/lib32/libphobos-ldc.so') or os.path.exists('/usr/lib/libphobos-ldc.so') : -        env['DSHLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared -defaultlib=phobos-ldc') -    env['SHDLINKCOM'] = '$DLINK -of=$TARGET $DSHLINKFLAGS $__DSHLIBVERSIONFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS' +    env['SHDLINK'] = '$DC' +    env['SHDLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared -defaultlib=phobos2-ldc') + +    env['SHDLINKCOM'] = '$DLINK -of=$TARGET $SHDLINKFLAGS $__SHDLIBVERSIONFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS -L-ldruntime-ldc'      env['DLIBLINKPREFIX'] = '' if env['PLATFORM'] == 'win32' else '-L-l'      env['DLIBLINKSUFFIX'] = '.lib' if env['PLATFORM'] == 'win32' else '' -    #env['_DLIBFLAGS'] = '${_concat(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, __env__, RDirs, TARGET, SOURCE)}' +    # env['_DLIBFLAGS'] = '${_concat(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, __env__, RDirs, TARGET, SOURCE)}'      env['_DLIBFLAGS'] = '${_stripixes(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES,  __env__)}'      env['DLIBDIRPREFIX'] = '-L-L'      env['DLIBDIRSUFFIX'] = ''      env['_DLIBDIRFLAGS'] = '${_concat(DLIBDIRPREFIX, LIBPATH, DLIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)}' -      env['DLIB'] = 'lib' if env['PLATFORM'] == 'win32' else 'ar cr'      env['DLIBCOM'] = '$DLIB $_DLIBFLAGS {0}$TARGET $SOURCES $_DLIBFLAGS'.format('-c ' if env['PLATFORM'] == 'win32' else '') -    #env['_DLIBFLAGS'] = '${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)}' +    # env['_DLIBFLAGS'] = '${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)}'      env['DLIBFLAGPREFIX'] = '-'      env['DLIBFLAGSUFFIX'] = ''      # __RPATH is set to $_RPATH in the platform specification if that      # platform supports it. -    env['DRPATHPREFIX'] = '-L-rpath=' +    env['DRPATHPREFIX'] = '-L-Wl,-rpath,' if env['PLATFORM'] == 'darwin' else '-L-rpath='      env['DRPATHSUFFIX'] = ''      env['_DRPATH'] = '${_concat(DRPATHPREFIX, RPATH, DRPATHSUFFIX, __env__)}'      # Support for versioned libraries -    env['_DSHLIBVERSIONFLAGS'] = '$DSHLIBVERSIONFLAGS -L-soname=$_DSHLIBSONAME' -    env['_DSHLIBSONAME'] = '${DShLibSonameGenerator(__env__,TARGET)}' +    env['_SHDLIBVERSIONFLAGS'] = '$SHDLIBVERSIONFLAGS -L-soname=$_SHDLIBSONAME' +    env['_SHDLIBSONAME'] = '${DShLibSonameGenerator(__env__,TARGET)}'      # NOTE: this is a quick hack, the soname will only work if there is      # c/c++ linker loaded which provides callback for the ShLibSonameGenerator      env['DShLibSonameGenerator'] = SCons.Tool.ShLibSonameGenerator -    # NOTE: this is only for further reference, currently $DSHLIBVERSION does +    # NOTE: this is only for further reference, currently $SHDLIBVERSION does      # not work, the user must use $SHLIBVERSION -    env['DSHLIBVERSION'] = '$SHLIBVERSION' -    env['DSHLIBVERSIONFLAGS'] = [] +    env['SHDLIBVERSION'] = '$SHLIBVERSION' +    env['SHDLIBVERSIONFLAGS'] = [] -    SCons.Tool.createStaticLibBuilder(env) +    env['BUILDERS']['ProgramAllAtOnce'] = SCons.Builder.Builder( +        action='$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -of=$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS', +        emitter=DCommon.allAtOnceEmitter, +    )  def exists(env):      return env.Detect('ldc2') +  # Local Variables:  # tab-width:4  # indent-tabs-mode:nil diff --git a/src/engine/SCons/Tool/ldc.xml b/src/engine/SCons/Tool/ldc.xml index 0db55c3..1479867 100644 --- a/src/engine/SCons/Tool/ldc.xml +++ b/src/engine/SCons/Tool/ldc.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. @@ -32,10 +32,6 @@ Sets construction variables for the D language compiler LDC2.  <sets>  <item>DC</item>  <item>DCOM</item> -<item>_DINCFLAGS</item> -<item>_DVERFLAGS</item> -<item>_DDEBUGFLAGS</item> -<item>_DFLAGS</item>  <item>SHDC</item>  <item>SHDCOM</item>  <item>DPATH</item> @@ -59,23 +55,317 @@ Sets construction variables for the D language compiler LDC2.  <item>SHDLINKCOM</item>  <item>DLIBLINKPREFIX</item>  <item>DLIBLINKSUFFIX</item> -<item>_DLIBFLAGS</item>  <item>DLIBDIRPREFIX</item>  <item>DLIBDIRSUFFIX</item> -<item>_DLIBDIRFLAGS</item>  <item>DLIB</item>  <item>DLIBCOM</item> -<item>_DLIBFLAGS</item>  <item>DLIBFLAGPREFIX</item>  <item>DLIBFLAGSUFFIX</item>  <item>DLINKFLAGPREFIX</item>  <item>DLINKFLAGSUFFIX</item> -<item>RPATHPREFIX</item> -<item>RPATHSUFFIX</item> -<item>_RPATH</item> +<item>DRPATHPREFIX</item> +<item>DRPATHSUFFIX</item> +<item>DShLibSonameGenerator</item> +<item>SHDLIBVERSION</item> +<item>SHDLIBVERSIONFLAGS</item>  </sets>  <uses>  </uses>  </tool> +<cvar name="DC"> +<summary> +<para> +The D compiler to use. +</para> +</summary> +</cvar> + +<cvar name="DCOM"> +<summary> +<para> +  The command line used to compile a D file to an object file. +  Any options specified in the &cv-link-DFLAGS; construction variable +  is included on this command line. +</para> +</summary> +</cvar> + +<cvar name="DDEBUG"> +<summary> +<para> +  List of debug tags to enable when compiling. +</para> +</summary> +</cvar> + +<cvar name="DFLAGS"> +<summary> +<para> +  General options that are passed to the D compiler. +</para> +</summary> +</cvar> + +<cvar name="DLIB"> +<summary> +<para> +  Name of the lib tool to use for D codes. +</para> +</summary> +</cvar> + +<cvar name="DLIBCOM"> +<summary> +<para> +  The command line to use when creating libraries. +</para> +</summary> +</cvar> + +<cvar name="DLINK"> +<summary> +<para> +  Name of the linker to use for linking systems including D sources. +</para> +</summary> +</cvar> + +<cvar name="DLINKCOM"> +<summary> +<para> +  The command line to use when linking systems including D sources. +</para> +</summary> +</cvar> + +<cvar name="DLINKFLAGS"> +<summary> +<para> +List of linker flags. +</para> +</summary> +</cvar> + +<cvar name="DPATH"> +<summary> +<para> +  List of paths to search for import modules. +</para> +</summary> +</cvar> + +<cvar name="DVERSIONS"> +<summary> +<para> +  List of version tags to enable when compiling. +</para> +</summary> +</cvar> + +<cvar name="SHDC"> +<summary> +<para> +  The name of the compiler to use when compiling D source +  destined to be in a shared objects. +</para> +</summary> +</cvar> + +<cvar name="SHDCOM"> +<summary> +<para> +  The command line to use when compiling code to be part of shared objects. +</para> +</summary> +</cvar> + +<cvar name="SHDLINK"> +<summary> +<para> +  The linker to use when creating shared objects for code bases +  include D sources. +</para> +</summary> +</cvar> + +<cvar name="SHDLINKCOM"> +<summary> +<para> +  The command line to use when generating shared objects. +</para> +</summary> +</cvar> + +<cvar name="SHDLINKFLAGS"> +<summary> +<para> +  The list of flags to use when generating a shared object. +</para> +</summary> +</cvar> + +<cvar name="DVERSUFFIX"> +  <summary> +    <para> +      DVERSUFFIX. +    </para> + </summary> +</cvar> + +<cvar name="DVERPREFIX"> +  <summary> +    <para> +      DVERPREFIX. +    </para> + </summary> +</cvar> + +<cvar name="DLINKFLAGSUFFIX"> +  <summary> +    <para> +      DLINKFLAGSUFFIX. +    </para> + </summary> +</cvar> + +<cvar name="DLINKFLAGPREFIX"> +  <summary> +    <para> +      DLINKFLAGPREFIX. +    </para> + </summary> +</cvar> + +<cvar name="DLIBLINKSUFFIX"> +  <summary> +    <para> +      DLIBLINKSUFFIX. +    </para> + </summary> +</cvar> + +<cvar name="DLIBLINKPREFIX"> +  <summary> +    <para> +      DLIBLINKPREFIX. +    </para> + </summary> +</cvar> + +<cvar name="DLIBFLAGSUFFIX"> +  <summary> +    <para> +      DLIBFLAGSUFFIX. +    </para> + </summary> +</cvar> + +<cvar name="DLIBFLAGPREFIX"> +  <summary> +    <para> +      DLIBFLAGPREFIX. +    </para> + </summary> +</cvar> + +<cvar name="DLIBDIRSUFFIX"> +  <summary> +    <para> +      DLIBLINKSUFFIX. +    </para> + </summary> +</cvar> + +<cvar name="DLIBDIRPREFIX"> +  <summary> +    <para> +      DLIBLINKPREFIX. +    </para> + </summary> +</cvar> + +<cvar name="DINCSUFFIX"> +  <summary> +    <para> +      DLIBFLAGSUFFIX. +    </para> + </summary> +</cvar> + + +<cvar name="DINCPREFIX"> +  <summary> +    <para> +      DINCPREFIX. +    </para> + </summary> +</cvar> + +<cvar name="DFLAGSUFFIX"> +  <summary> +    <para> +      DFLAGSUFFIX. +    </para> + </summary> +</cvar> + +<cvar name="DFLAGPREFIX"> +  <summary> +    <para> +      DFLAGPREFIX. +    </para> + </summary> +</cvar> + +<cvar name="DFILESUFFIX"> +  <summary> +    <para> +      DFILESUFFIX. +    </para> + </summary> +</cvar> + +<cvar name="DDEBUGPREFIX"> +  <summary> +    <para> +      DDEBUGPREFIX. +    </para> + </summary> +</cvar> + +<cvar name="DDEBUGSUFFIX"> +  <summary> +    <para> +      DDEBUGSUFFIX. +    </para> + </summary> +</cvar> + +<builder name="ProgramAllAtOnce"> +  <summary> +    <para> +      Builds an executable from D sources without first creating individual +      objects for each file. +    </para> +    <para> +      D sources can be compiled file-by-file as C and C++ source are, and +      D is integrated into the &scons; Object and Program builders for +      this model of build. D codes can though do whole source +      meta-programming (some of the testing frameworks do this). For this +      it is imperative that all sources are compiled and linked in a single call of +      the D compiler. This builder serves that purpose. +    </para> +    <example_commands> +      env.ProgramAllAtOnce('executable', ['mod_a.d, mod_b.d', 'mod_c.d']) +    </example_commands> +    <para> +      This command will compile the modules mod_a, mod_b, and mod_c in a +      single compilation process without first creating object files for +      the modules. Some of the D compilers will create executable.o others +      will not. +    </para> +  </summary> +</builder> +  </sconsdoc> diff --git a/src/engine/SCons/Tool/lex.py b/src/engine/SCons/Tool/lex.py index 4c5bb92..e185b93 100644 --- a/src/engine/SCons/Tool/lex.py +++ b/src/engine/SCons/Tool/lex.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/lex.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/lex.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os.path diff --git a/src/engine/SCons/Tool/lex.xml b/src/engine/SCons/Tool/lex.xml index 9dd512e..e178308 100644 --- a/src/engine/SCons/Tool/lex.xml +++ b/src/engine/SCons/Tool/lex.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/Tool/link.py b/src/engine/SCons/Tool/link.py index 720a66c..e8c11ed 100644 --- a/src/engine/SCons/Tool/link.py +++ b/src/engine/SCons/Tool/link.py @@ -1,3 +1,4 @@ +  """SCons.Tool.link  Tool-specific initialization for the generic Posix linker. @@ -9,7 +10,7 @@ selection method.  """  # -# 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 @@ -30,8 +31,9 @@ selection method.  # 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/Tool/link.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/link.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import sys  import re @@ -45,7 +47,9 @@ from SCons.Tool.FortranCommon import isfortran  from SCons.Tool.DCommon import isD -cplusplus = __import__('c++', globals(), locals(), []) +import SCons.Tool.cxx +cplusplus = SCons.Tool.cxx +# cplusplus = __import__(__package__+'.cxx', globals(), locals(), ['*'])  issued_mixed_link_warning = False @@ -76,20 +80,20 @@ def smart_link(source, target, env, for_signature):  def _lib_emitter(target, source, env, **kw):      Verbose = False      if Verbose: -        print "_lib_emitter: target[0]=%r" % target[0].get_path() +        print("_lib_emitter: target[0]={:r}".format(target[0].get_path()))      for tgt in target:          tgt.attributes.shared = 1 -     +      try:          symlink_generator = kw['symlink_generator']      except KeyError:          pass      else:          if Verbose: -            print "_lib_emitter: symlink_generator=%r" % symlink_generator +            print("_lib_emitter: symlink_generator={:r}".format(symlink_generator))          symlinks = symlink_generator(env, target[0])          if Verbose: -            print "_lib_emitter: symlinks=%r" % symlinks  +            print("_lib_emitter: symlinks={:r}".format(symlinks))          if symlinks:              SCons.Tool.EmitLibSymlinks(env, symlinks, target[0]) @@ -108,28 +112,28 @@ def _versioned_lib_name(env, libnode, version, prefix, suffix, prefix_generator,      Verbose = False      if Verbose: -        print "_versioned_lib_name: libnode=%r" % libnode.get_path() -        print "_versioned_lib_name: version=%r" % version -        print "_versioned_lib_name: prefix=%r" % prefix -        print "_versioned_lib_name: suffix=%r" % suffix -        print "_versioned_lib_name: suffix_generator=%r" % suffix_generator +        print("_versioned_lib_name: libnode={:r}".format(libnode.get_path())) +        print("_versioned_lib_name: version={:r}".format(version)) +        print("_versioned_lib_name: prefix={:r}".format(prefix)) +        print("_versioned_lib_name: suffix={:r}".format(suffix)) +        print("_versioned_lib_name: suffix_generator={:r}".format(suffix_generator))      versioned_name = os.path.basename(libnode.get_path())      if Verbose: -        print "_versioned_lib_name: versioned_name=%r" % versioned_name +        print("_versioned_lib_name: versioned_name={:r}".format(versioned_name))      versioned_prefix = prefix_generator(env, **kw)      versioned_suffix = suffix_generator(env, **kw)      if Verbose: -        print "_versioned_lib_name: versioned_prefix=%r" % versioned_prefix -        print "_versioned_lib_name: versioned_suffix=%r" % versioned_suffix +        print("_versioned_lib_name: versioned_prefix={:r}".format(versioned_prefix)) +        print("_versioned_lib_name: versioned_suffix={:r}".format(versioned_suffix))      versioned_prefix_re = '^' + re.escape(versioned_prefix)      versioned_suffix_re = re.escape(versioned_suffix) + '$'      name = re.sub(versioned_prefix_re, prefix, versioned_name)      name = re.sub(versioned_suffix_re, suffix, name)      if Verbose: -        print "_versioned_lib_name: name=%r" % name +        print("_versioned_lib_name: name={:r}".format(name))      return name  def _versioned_shlib_name(env, libnode, version, prefix, suffix, **kw): @@ -146,33 +150,33 @@ def _versioned_lib_suffix(env, suffix, version):      """For suffix='.so' and version='0.1.2' it returns '.so.0.1.2'"""      Verbose = False      if Verbose: -        print "_versioned_lib_suffix: suffix=%r" % suffix -        print "_versioned_lib_suffix: version=%r" % version +        print("_versioned_lib_suffix: suffix={:r}".format(suffix)) +        print("_versioned_lib_suffix: version={:r}".format(version))      if not suffix.endswith(version):          suffix = suffix + '.' + version      if Verbose: -        print "_versioned_lib_suffix: return suffix=%r" % suffix +        print("_versioned_lib_suffix: return suffix={:r}".format(suffix))      return suffix  def _versioned_lib_soname(env, libnode, version, prefix, suffix, name_func):      """For libnode='/optional/dir/libfoo.so.X.Y.Z' it returns 'libfoo.so.X'"""      Verbose = False      if Verbose: -        print "_versioned_lib_soname: version=%r" % version +        print("_versioned_lib_soname: version={:r}".format(version))      name = name_func(env, libnode, version, prefix, suffix)      if Verbose: -        print "_versioned_lib_soname: name=%r" % name +        print("_versioned_lib_soname: name={:r}".format(name))      major = version.split('.')[0]      soname = name + '.' + major      if Verbose: -        print "_versioned_lib_soname: soname=%r" % soname +        print("_versioned_lib_soname: soname={:r}".format(soname))      return soname  def _versioned_shlib_soname(env, libnode, version, prefix, suffix): -    return _versioned_lib_soname(env, libnode, version, prefix, suffix, _versioned_shlib_name)  +    return _versioned_lib_soname(env, libnode, version, prefix, suffix, _versioned_shlib_name)  def _versioned_ldmod_soname(env, libnode, version, prefix, suffix): -    return _versioned_lib_soname(env, libnode, version, prefix, suffix, _versioned_ldmod_name)  +    return _versioned_lib_soname(env, libnode, version, prefix, suffix, _versioned_ldmod_name)  def _versioned_lib_symlinks(env, libnode, version, prefix, suffix, name_func, soname_func):      """Generate link names that should be created for a versioned shared lirbrary. @@ -181,23 +185,23 @@ def _versioned_lib_symlinks(env, libnode, version, prefix, suffix, name_func, so      Verbose = False      if Verbose: -        print "_versioned_lib_symlinks: libnode=%r" % libnode.get_path() -        print "_versioned_lib_symlinks: version=%r" % version +        print("_versioned_lib_symlinks: libnode={:r}".format(libnode.get_path())) +        print("_versioned_lib_symlinks: version={:r}".format(version))      if sys.platform.startswith('openbsd'):          # OpenBSD uses x.y shared library versioning numbering convention          # and doesn't use symlinks to backwards-compatible libraries          if Verbose: -            print "_versioned_lib_symlinks: return symlinks=%r" % None +            print("_versioned_lib_symlinks: return symlinks={:r}".format(None))          return None      linkdir = libnode.get_dir()      if Verbose: -        print "_versioned_lib_symlinks: linkdir=%r" % linkdir.get_path() +        print("_versioned_lib_symlinks: linkdir={:r}".format(linkdir.get_path()))      name = name_func(env, libnode, version, prefix, suffix)      if Verbose: -        print "_versioned_lib_symlinks: name=%r" % name +        print("_versioned_lib_symlinks: name={:r}".format(name))      soname = soname_func(env, libnode, version, prefix, suffix) @@ -213,7 +217,7 @@ def _versioned_lib_symlinks(env, libnode, version, prefix, suffix, name_func, so          symlinks = [ (link0, libnode), (link1, libnode) ]      if Verbose: -        print "_versioned_lib_symlinks: return symlinks=%r" % SCons.Tool.StringizeLibSymlinks(symlinks) +        print("_versioned_lib_symlinks: return symlinks={:r}".format(SCons.Tool.StringizeLibSymlinks(symlinks)))      return symlinks @@ -239,15 +243,17 @@ def _versioned_lib_callbacks():          'VersionedLdModSoname'   : _versioned_ldmod_soname,      }.copy() -# Setup all variables required by the versioning machinery  def _setup_versioned_lib_variables(env, **kw): +    """ +    Setup all variables required by the versioning machinery +    """      tool = None      try: tool = kw['tool']      except KeyError: pass      use_soname = False -    try: use_soname = kw['use_soname']  +    try: use_soname = kw['use_soname']      except KeyError: pass      # The $_SHLIBVERSIONFLAGS define extra commandline flags used when diff --git a/src/engine/SCons/Tool/link.xml b/src/engine/SCons/Tool/link.xml index 9b12f00..669a020 100644 --- a/src/engine/SCons/Tool/link.xml +++ b/src/engine/SCons/Tool/link.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/Tool/linkloc.py b/src/engine/SCons/Tool/linkloc.py index 3b0b678..b79be06 100644 --- a/src/engine/SCons/Tool/linkloc.py +++ b/src/engine/SCons/Tool/linkloc.py @@ -10,7 +10,7 @@ selection method.  """  # -# 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 @@ -32,7 +32,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/linkloc.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/linkloc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os.path  import re @@ -52,8 +52,8 @@ def repl_linker_command(m):      # Replaces any linker command file directives (e.g. "@foo.lnk") with      # the actual contents of the file.      try: -        f=open(m.group(2), "r") -        return m.group(1) + f.read() +        with open(m.group(2), "r") as f: +            return m.group(1) + f.read()      except IOError:          # the linker should return an error if it can't          # find the linker command file so we will remain quiet. diff --git a/src/engine/SCons/Tool/linkloc.xml b/src/engine/SCons/Tool/linkloc.xml index 959b8c4..09b43cb 100644 --- a/src/engine/SCons/Tool/linkloc.xml +++ b/src/engine/SCons/Tool/linkloc.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/Tool/m4.py b/src/engine/SCons/Tool/m4.py index 0e7c965..38b9976 100644 --- a/src/engine/SCons/Tool/m4.py +++ b/src/engine/SCons/Tool/m4.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/m4.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/m4.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Action  import SCons.Builder diff --git a/src/engine/SCons/Tool/m4.xml b/src/engine/SCons/Tool/m4.xml index e5fadda..f919af9 100644 --- a/src/engine/SCons/Tool/m4.xml +++ b/src/engine/SCons/Tool/m4.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/Tool/masm.py b/src/engine/SCons/Tool/masm.py index 62f3003..90162f4 100644 --- a/src/engine/SCons/Tool/masm.py +++ b/src/engine/SCons/Tool/masm.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/masm.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/masm.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Defaults  import SCons.Tool diff --git a/src/engine/SCons/Tool/masm.xml b/src/engine/SCons/Tool/masm.xml index 12f74b4..acc3aa3 100644 --- a/src/engine/SCons/Tool/masm.xml +++ b/src/engine/SCons/Tool/masm.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/Tool/midl.py b/src/engine/SCons/Tool/midl.py index c7e2577..4088fc4 100644 --- a/src/engine/SCons/Tool/midl.py +++ b/src/engine/SCons/Tool/midl.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/midl.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/midl.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Action  import SCons.Builder @@ -39,26 +39,26 @@ import SCons.Defaults  import SCons.Scanner.IDL  import SCons.Util -from MSCommon import msvc_exists +from .MSCommon import msvc_exists  def midl_emitter(target, source, env):      """Produces a list of outputs from the MIDL compiler""" -    base, ext = SCons.Util.splitext(str(target[0])) +    base, _ = SCons.Util.splitext(str(target[0]))      tlb = target[0]      incl = base + '.h'      interface = base + '_i.c' -    t = [tlb, incl, interface] +    targets = [tlb, incl, interface]      midlcom = env['MIDLCOM']      if midlcom.find('/proxy') != -1:          proxy = base + '_p.c' -        t.append(proxy) +        targets.append(proxy)      if midlcom.find('/dlldata') != -1:          dlldata = base + '_data.c' -        t.append(dlldata) -     -    return (t,source) +        targets.append(dlldata) + +    return (targets, source)  idl_scanner = SCons.Scanner.IDL.IDLScan() diff --git a/src/engine/SCons/Tool/midl.xml b/src/engine/SCons/Tool/midl.xml index 6b11128..cc1b880 100644 --- a/src/engine/SCons/Tool/midl.xml +++ b/src/engine/SCons/Tool/midl.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/Tool/mingw.py b/src/engine/SCons/Tool/mingw.py index b4889b0..c2eaa96 100644 --- a/src/engine/SCons/Tool/mingw.py +++ b/src/engine/SCons/Tool/mingw.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/mingw.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/mingw.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os  import os.path @@ -86,7 +86,8 @@ def shlib_emitter(target, source, env):      no_import_lib = env.get('no_import_lib', 0)      if not dll: -        raise SCons.Errors.UserError("A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX")) +        raise SCons.Errors.UserError("A shared library should have exactly one target with the suffix: %s Target(s) are:%s" %  \ +            (env.subst("$SHLIBSUFFIX"), ",".join([str(t) for t in target])))      if not no_import_lib and \         not env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX'): diff --git a/src/engine/SCons/Tool/mingw.xml b/src/engine/SCons/Tool/mingw.xml index a503f4f..4848637 100644 --- a/src/engine/SCons/Tool/mingw.xml +++ b/src/engine/SCons/Tool/mingw.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/Tool/msgfmt.py b/src/engine/SCons/Tool/msgfmt.py index 09b1e2a..7e3e2a4 100644 --- a/src/engine/SCons/Tool/msgfmt.py +++ b/src/engine/SCons/Tool/msgfmt.py @@ -1,6 +1,6 @@  """ msgfmt tool """ -# 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 @@  # 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/Tool/msgfmt.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/msgfmt.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  from SCons.Builder import BuilderBase  ############################################################################# @@ -41,7 +41,7 @@ class _MOFileBuilder(BuilderBase):      import SCons.Util      from SCons.Tool.GettextCommon import _read_linguas_from_files      linguas_files = None -    if env.has_key('LINGUAS_FILE') and env['LINGUAS_FILE'] is not None: +    if 'LINGUAS_FILE' in env and env['LINGUAS_FILE'] is not None:        linguas_files = env['LINGUAS_FILE']        # This should prevent from endless recursion.         env['LINGUAS_FILE'] = None diff --git a/src/engine/SCons/Tool/msgfmt.xml b/src/engine/SCons/Tool/msgfmt.xml index 246f91e..e00f372 100644 --- a/src/engine/SCons/Tool/msgfmt.xml +++ b/src/engine/SCons/Tool/msgfmt.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/Tool/msginit.py b/src/engine/SCons/Tool/msginit.py index aa95d78..63daf7f 100644 --- a/src/engine/SCons/Tool/msginit.py +++ b/src/engine/SCons/Tool/msginit.py @@ -3,7 +3,7 @@  Tool specific initialization of msginit tool.  """ -# 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 @@ -24,7 +24,7 @@ Tool specific initialization of msginit tool.  # 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/Tool/msginit.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/msginit.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Warnings  import SCons.Builder @@ -35,7 +35,7 @@ def _optional_no_translator_flag(env):    """ Return '--no-translator' flag if we run *msginit(1)*  in non-interactive        mode."""    import SCons.Util -  if env.has_key('POAUTOINIT'): +  if 'POAUTOINIT' in env:      autoinit = env['POAUTOINIT']    else:      autoinit = False @@ -66,7 +66,7 @@ def _POInitBuilderWrapper(env, target=None, source=_null, **kw):    if source is _null:      if 'POTDOMAIN' in kw:        domain = kw['POTDOMAIN'] -    elif env.has_key('POTDOMAIN'): +    elif 'POTDOMAIN' in env:        domain = env['POTDOMAIN']      else:        domain = 'messages' diff --git a/src/engine/SCons/Tool/msginit.xml b/src/engine/SCons/Tool/msginit.xml index df7f33f..3a2a969 100644 --- a/src/engine/SCons/Tool/msginit.xml +++ b/src/engine/SCons/Tool/msginit.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/Tool/msgmerge.py b/src/engine/SCons/Tool/msgmerge.py index c7ebd88..aef1f5f 100644 --- a/src/engine/SCons/Tool/msgmerge.py +++ b/src/engine/SCons/Tool/msgmerge.py @@ -3,7 +3,7 @@  Tool specific initialization for `msgmerge` tool.  """ -# 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 @@ -24,7 +24,7 @@ Tool specific initialization for `msgmerge` tool.  # 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/Tool/msgmerge.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/msgmerge.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  #############################################################################  def _update_or_init_po_files(target, source, env): @@ -58,7 +58,7 @@ def _POUpdateBuilderWrapper(env, target=None, source=_null, **kw):    if source is _null:      if 'POTDOMAIN' in kw:        domain = kw['POTDOMAIN'] -    elif env.has_key('POTDOMAIN') and env['POTDOMAIN']: +    elif 'POTDOMAIN' in env and env['POTDOMAIN']:        domain = env['POTDOMAIN']      else:        domain = 'messages' diff --git a/src/engine/SCons/Tool/msgmerge.xml b/src/engine/SCons/Tool/msgmerge.xml index 01ea726..65d19e1 100644 --- a/src/engine/SCons/Tool/msgmerge.xml +++ b/src/engine/SCons/Tool/msgmerge.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/Tool/mslib.py b/src/engine/SCons/Tool/mslib.py index 22683a7..3d79649 100644 --- a/src/engine/SCons/Tool/mslib.py +++ b/src/engine/SCons/Tool/mslib.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/mslib.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/mslib.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Defaults  import SCons.Tool @@ -39,7 +39,7 @@ import SCons.Tool.msvs  import SCons.Tool.msvc  import SCons.Util -from MSCommon import msvc_exists, msvc_setup_env_once +from .MSCommon import msvc_exists, msvc_setup_env_once  def generate(env):      """Add Builders and construction variables for lib to an Environment.""" diff --git a/src/engine/SCons/Tool/mslib.xml b/src/engine/SCons/Tool/mslib.xml index b6af18c..6ee2f22 100644 --- a/src/engine/SCons/Tool/mslib.xml +++ b/src/engine/SCons/Tool/mslib.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/Tool/mslink.py b/src/engine/SCons/Tool/mslink.py index 173df7f..1b16b63 100644 --- a/src/engine/SCons/Tool/mslink.py +++ b/src/engine/SCons/Tool/mslink.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -30,8 +30,9 @@ selection method.  # 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/Tool/mslink.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/mslink.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os.path @@ -44,7 +45,7 @@ import SCons.Tool.msvc  import SCons.Tool.msvs  import SCons.Util -from MSCommon import msvc_setup_env_once, msvc_exists +from .MSCommon import msvc_setup_env_once, msvc_exists  def pdbGenerator(env, target, source, for_signature):      try: @@ -191,7 +192,7 @@ def prog_emitter(target, source, env):          # MSVC 11 and above need the PCH object file to be added to the link line,          # otherwise you get link error LNK2011.          pchobj = SCons.Util.splitext(str(env['PCH']))[0] + '.obj' -        # print "prog_emitter, version %s, appending pchobj %s"%(version_num, pchobj) +        # print("prog_emitter, version %s, appending pchobj %s"%(version_num, pchobj))          if pchobj not in extrasources:              extrasources.append(pchobj) @@ -203,7 +204,7 @@ def RegServerFunc(target, source, env):          if ret:              raise SCons.Errors.UserError("Unable to register %s" % target[0])          else: -            print "Registered %s sucessfully" % target[0] +            print("Registered %s sucessfully" % target[0])          return ret      return 0 @@ -220,10 +221,10 @@ def embedManifestDllCheck(target, source, env):          if os.path.exists(manifestSrc):              ret = (embedManifestDllAction) ([target[0]],None,env)                      if ret: -                raise SCons.Errors.UserError, "Unable to embed manifest into %s" % (target[0]) +                raise SCons.Errors.UserError("Unable to embed manifest into %s" % (target[0]))              return ret          else: -            print '(embed: no %s.manifest found; not embedding.)'%str(target[0]) +            print('(embed: no %s.manifest found; not embedding.)'%str(target[0]))      return 0  def embedManifestExeCheck(target, source, env): @@ -234,10 +235,10 @@ def embedManifestExeCheck(target, source, env):          if os.path.exists(manifestSrc):              ret = (embedManifestExeAction) ([target[0]],None,env)              if ret: -                raise SCons.Errors.UserError, "Unable to embed manifest into %s" % (target[0]) +                raise SCons.Errors.UserError("Unable to embed manifest into %s" % (target[0]))              return ret          else: -            print '(embed: no %s.manifest found; not embedding.)'%str(target[0]) +            print('(embed: no %s.manifest found; not embedding.)'%str(target[0]))      return 0  embedManifestDllCheckAction = SCons.Action.Action(embedManifestDllCheck, None) diff --git a/src/engine/SCons/Tool/mslink.xml b/src/engine/SCons/Tool/mslink.xml index 99fd253..24b79c7 100644 --- a/src/engine/SCons/Tool/mslink.xml +++ b/src/engine/SCons/Tool/mslink.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/Tool/mssdk.py b/src/engine/SCons/Tool/mssdk.py index 7cf439a..dd9de93 100644 --- a/src/engine/SCons/Tool/mssdk.py +++ b/src/engine/SCons/Tool/mssdk.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/Tool/mssdk.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/mssdk.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  """engine.SCons.Tool.mssdk @@ -33,7 +33,7 @@ It will usually be imported through the generic SCons.Tool.Tool()  selection method.  """ -from MSCommon import mssdk_exists, \ +from .MSCommon import mssdk_exists, \                       mssdk_setup_env  def generate(env): diff --git a/src/engine/SCons/Tool/mssdk.xml b/src/engine/SCons/Tool/mssdk.xml index a29c4eb..0ae3553 100644 --- a/src/engine/SCons/Tool/mssdk.xml +++ b/src/engine/SCons/Tool/mssdk.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/Tool/msvc.py b/src/engine/SCons/Tool/msvc.py index 08368e7..2fe16c3 100644 --- a/src/engine/SCons/Tool/msvc.py +++ b/src/engine/SCons/Tool/msvc.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/msvc.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/msvc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os.path  import re @@ -47,7 +47,7 @@ import SCons.Util  import SCons.Warnings  import SCons.Scanner.RC -from MSCommon import msvc_exists, msvc_setup_env_once +from .MSCommon import msvc_exists, msvc_setup_env_once, msvc_version_to_maj_min  CSuffixes = ['.c', '.C']  CXXSuffixes = ['.cc', '.cpp', '.cxx', '.c++', '.C++'] @@ -60,6 +60,21 @@ def validate_vars(env):          if not SCons.Util.is_String(env['PCHSTOP']):              raise SCons.Errors.UserError("The PCHSTOP construction variable must be a string: %r"%env['PCHSTOP']) +def msvc_set_PCHPDBFLAGS(env): +    """ +    Set appropriate PCHPDBFLAGS for the MSVC version being used. +    """ +    if env.get('MSVC_VERSION',False): +        maj, min = msvc_version_to_maj_min(env['MSVC_VERSION']) +        if maj < 8: +            env['PCHPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Yd") or ""}']) +        else: +            env['PCHPDBFLAGS'] = '' +    else: +        # Default if we can't determine which version of MSVC we're using +        env['PCHPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Yd") or ""}']) + +  def pch_emitter(target, source, env):      """Adds the object file target.""" @@ -259,7 +274,9 @@ def generate(env):      env['CFILESUFFIX'] = '.c'      env['CXXFILESUFFIX'] = '.cc' -    env['PCHPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Yd") or ""}']) +    msvc_set_PCHPDBFLAGS(env) + +      env['PCHCOM'] = '$CXX /Fo${TARGETS[1]} $CXXFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Yc$PCHSTOP /Fp${TARGETS[0]} $CCPDBFLAGS $PCHPDBFLAGS'      env['BUILDERS']['PCH'] = pch_builder diff --git a/src/engine/SCons/Tool/msvc.xml b/src/engine/SCons/Tool/msvc.xml index f7e2173..edc6936 100644 --- a/src/engine/SCons/Tool/msvc.xml +++ b/src/engine/SCons/Tool/msvc.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. @@ -352,6 +352,8 @@ constructor; setting it later has no effect.  <para>  Valid values for Windows are +<literal>14.0</literal>, +<literal>14.0Exp</literal>,  <literal>12.0</literal>,  <literal>12.0Exp</literal>,  <literal>11.0</literal>, @@ -440,4 +442,27 @@ For example, if you want to compile 64-bit binaries, you would set  </summary>  </cvar> +<cvar name="MSVC_UWP_APP"> +<summary> +<para> +Build libraries for a Universal Windows Platform (UWP) Application. +</para> + +<para> +If &cv-MSVC_UWP_APP; is set, the Visual Studio environment will be set up to point +to the Windows Store compatible libraries and Visual Studio runtimes. In doing so, +any libraries that are built will be able to be used in a UWP App and published +to the Windows Store. +This flag will only have an effect with Visual Studio 2015+. +This variable must be passed as an argument to the Environment() +constructor; setting it later has no effect. +</para> + +<para> +Valid values are '1' or '0' +</para> + +</summary> +</cvar> +  </sconsdoc> diff --git a/src/engine/SCons/Tool/msvs.py b/src/engine/SCons/Tool/msvs.py index c7e91b4..05531c6 100644 --- a/src/engine/SCons/Tool/msvs.py +++ b/src/engine/SCons/Tool/msvs.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -30,7 +30,9 @@ selection method.  # 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/Tool/msvs.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +from __future__ import print_function + +__revision__ = "src/engine/SCons/Tool/msvs.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.compat @@ -38,7 +40,6 @@ import base64  import hashlib  import ntpath  import os -# compat layer imports "cPickle" for us if it's available.  import pickle  import re  import sys @@ -51,8 +52,9 @@ import SCons.PathList  import SCons.Util  import SCons.Warnings -from MSCommon import msvc_exists, msvc_setup_env_once +from .MSCommon import msvc_exists, msvc_setup_env_once  from SCons.Defaults import processDefines +from SCons.compat import PICKLE_PROTOCOL  ##############################################################################  # Below here are the classes and functions for generation of @@ -63,6 +65,8 @@ def xmlify(s):      s = s.replace("&", "&") # do this first      s = s.replace("'", "'")      s = s.replace('"', """) +    s = s.replace('<', "<") +    s = s.replace('>', ">")      s = s.replace('\n', '
')      return s @@ -70,7 +74,7 @@ def xmlify(s):  # Returns a tuple of nodes.  def processIncludes(includes, env, target, source):      return SCons.PathList.PathList(includes).subst_path(env, target, source) -     +  external_makefile_guid = '{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}' @@ -83,7 +87,7 @@ def _generateGUID(slnfile, name):      # Normalize the slnfile path to a Windows path (\ separators) so      # the generated file has a consistent GUID even if we generate      # it on a non-Windows platform. -    m.update(ntpath.normpath(str(slnfile)) + str(name)) +    m.update(bytearray(ntpath.normpath(str(slnfile)) + str(name),'utf-8'))      solution = m.hexdigest().upper()      # convert most of the signature to GUID form (discard the rest)      solution = "{" + solution[:8] + "-" + solution[8:12] + "-" + solution[12:16] + "-" + solution[16:20] + "-" + solution[20:32] + "}" @@ -168,15 +172,15 @@ class _UserGenerator(object):      Base class for .dsp.user file generator      '''      # Default instance values. -    # Ok ... a bit defensive, but it does not seem reasonable to crash the  +    # Ok ... a bit defensive, but it does not seem reasonable to crash the      # build for a workspace user file. :-)      usrhead = None -    usrdebg = None  +    usrdebg = None      usrconf = None -    createfile = False  +    createfile = False      def __init__(self, dspfile, source, env):          # DebugSettings should be a list of debug dictionary sorted in the same order -        # as the target list and variants  +        # as the target list and variants          if 'variant' not in env:              raise SCons.Errors.InternalError("You must specify a 'variant' argument (i.e. 'Debug' or " +\                    "'Release') to create an MSVSProject.") @@ -184,7 +188,7 @@ class _UserGenerator(object):              variants = [env['variant']]          elif SCons.Util.is_List(env['variant']):              variants = env['variant'] -         +          if 'DebugSettings' not in env or env['DebugSettings'] == None:              dbg_settings = []          elif SCons.Util.is_Dict(env['DebugSettings']): @@ -200,37 +204,37 @@ class _UserGenerator(object):                      dbg_settings.append({})          else:              dbg_settings = [] -             +          if len(dbg_settings) == 1:              dbg_settings = dbg_settings * len(variants) -             +          self.createfile = self.usrhead and self.usrdebg and self.usrconf and \ -                            dbg_settings and bool([ds for ds in dbg_settings if ds])  +                            dbg_settings and bool([ds for ds in dbg_settings if ds])          if self.createfile: -            dbg_settings = dict(zip(variants, dbg_settings)) +            dbg_settings = dict(list(zip(variants, dbg_settings)))              for var, src in dbg_settings.items():                  # Update only expected keys                  trg = {} -                for key in [k for k in self.usrdebg.keys() if k in src]: +                for key in [k for k in list(self.usrdebg.keys()) if k in src]:                      trg[key] = str(src[key])                  self.configs[var].debug = trg -     +      def UserHeader(self):          encoding = self.env.subst('$MSVSENCODING')          versionstr = self.versionstr          self.usrfile.write(self.usrhead % locals()) -    +      def UserProject(self):          pass -     +      def Build(self):          if not self.createfile:              return          try:              filename = self.dspabs +'.user'              self.usrfile = open(filename, 'w') -        except IOError, detail: +        except IOError as detail:              raise SCons.Errors.InternalError('Unable to open "' + filename + '" for writing:' + str(detail))          else:              self.UserHeader() @@ -290,7 +294,7 @@ class _GenerateV7User(_UserGenerator):              self.usrconf = V9UserConfiguration              self.usrdebg = V9DebugSettings          _UserGenerator.__init__(self, dspfile, source, env) -     +      def UserProject(self):          confkeys = sorted(self.configs.keys())          for kind in confkeys: @@ -298,8 +302,8 @@ class _GenerateV7User(_UserGenerator):              platform = self.configs[kind].platform              debug = self.configs[kind].debug              if debug: -                debug_settings = '\n'.join(['\t\t\t\t%s="%s"' % (key, xmlify(value))  -                                            for key, value in debug.items()  +                debug_settings = '\n'.join(['\t\t\t\t%s="%s"' % (key, xmlify(value)) +                                            for key, value in debug.items()                                              if value is not None])                  self.usrfile.write(self.usrconf % locals())          self.usrfile.write('\t</Configurations>\n</VisualStudioUserFile>') @@ -345,7 +349,7 @@ V10DebugSettings = {  class _GenerateV10User(_UserGenerator):      """Generates a Project'user file for MSVS 2010""" -     +      def __init__(self, dspfile, source, env):          self.versionstr = '4.0'          self.usrhead = V10UserHeader @@ -360,8 +364,8 @@ class _GenerateV10User(_UserGenerator):              platform = self.configs[kind].platform              debug = self.configs[kind].debug              if debug: -                debug_settings = '\n'.join(['\t\t<%s>%s</%s>' % (key, xmlify(value), key)  -                                            for key, value in debug.items()  +                debug_settings = '\n'.join(['\t\t<%s>%s</%s>' % (key, xmlify(value), key) +                                            for key, value in debug.items()                                              if value is not None])                  self.usrfile.write(self.usrconf % locals())          self.usrfile.write('</Project>') @@ -457,7 +461,7 @@ class _DSPGenerator(object):                  runfile.append(s)          self.sconscript = env['MSVSSCONSCRIPT'] -         +          if 'cmdargs' not in env or env['cmdargs'] == None:              cmdargs = [''] * len(variants)          elif SCons.Util.is_String(env['cmdargs']): @@ -467,7 +471,7 @@ class _DSPGenerator(object):                  raise SCons.Errors.InternalError("Sizes of 'cmdargs' and 'variant' lists must be the same.")              else:                  cmdargs = env['cmdargs'] -                 +          self.env = env          if 'name' in self.env: @@ -525,13 +529,13 @@ class _DSPGenerator(object):                  config.platform = 'Win32'              self.configs[variant] = config -            print "Adding '" + self.name + ' - ' + config.variant + '|' + config.platform + "' to '" + str(dspfile) + "'" +            print("Adding '" + self.name + ' - ' + config.variant + '|' + config.platform + "' to '" + str(dspfile) + "'")          for i in range(len(variants)):              AddConfig(self, variants[i], buildtarget[i], outdir[i], runfile[i], cmdargs[i])          self.platforms = [] -        for key in self.configs.keys(): +        for key in list(self.configs.keys()):              platform = self.configs[key].platform              if not platform in self.platforms:                  self.platforms.append(platform) @@ -640,11 +644,11 @@ class _GenerateV6DSP(_DSPGenerator):          if self.nokeep == 0:              # now we pickle some data and add it to the file -- MSDEV will ignore it. -            pdata = pickle.dumps(self.configs,1) -            pdata = base64.encodestring(pdata) +            pdata = pickle.dumps(self.configs,PICKLE_PROTOCOL) +            pdata = base64.encodestring(pdata).decode()              self.file.write(pdata + '\n') -            pdata = pickle.dumps(self.sources,1) -            pdata = base64.encodestring(pdata) +            pdata = pickle.dumps(self.sources,PICKLE_PROTOCOL) +            pdata = base64.encodestring(pdata).decode()              self.file.write(pdata + '\n')      def PrintSourceFiles(self): @@ -654,7 +658,7 @@ class _GenerateV6DSP(_DSPGenerator):                        'Resource Files': 'r|rc|ico|cur|bmp|dlg|rc2|rct|bin|cnt|rtf|gif|jpg|jpeg|jpe',                        'Other Files': ''} -        for kind in sorted(categories.keys(), key=lambda a: a.lower()): +        for kind in sorted(list(categories.keys()), key=lambda a: a.lower()):              if not self.sources[kind]:                  continue # skip empty groups @@ -725,7 +729,7 @@ class _GenerateV6DSP(_DSPGenerator):      def Build(self):          try:              self.file = open(self.dspabs,'w') -        except IOError, detail: +        except IOError as detail:              raise SCons.Errors.InternalError('Unable to open "' + self.dspabs + '" for writing:' + str(detail))          else:              self.PrintHeader() @@ -817,7 +821,7 @@ class _GenerateV7DSP(_DSPGenerator, _GenerateV7User):              self.dspheader = V7DSPHeader              self.dspconfiguration = V7DSPConfiguration          self.file = None -         +          _GenerateV7User.__init__(self, dspfile, source, env)      def PrintHeader(self): @@ -894,7 +898,7 @@ class _GenerateV7DSP(_DSPGenerator, _GenerateV7User):              preprocdefs = xmlify(';'.join(processDefines(self.env.get('CPPDEFINES', []))))              includepath_Dirs = processIncludes(self.env.get('CPPPATH', []), self.env, None, None)              includepath = xmlify(';'.join([str(x) for x in includepath_Dirs])) -             +              if not env_has_buildtarget:                  del self.env['MSVSBUILDTARGET'] @@ -912,11 +916,11 @@ class _GenerateV7DSP(_DSPGenerator, _GenerateV7User):          if self.nokeep == 0:              # now we pickle some data and add it to the file -- MSDEV will ignore it. -            pdata = pickle.dumps(self.configs,1) -            pdata = base64.encodestring(pdata) +            pdata = pickle.dumps(self.configs,PICKLE_PROTOCOL) +            pdata = base64.encodestring(pdata).decode()              self.file.write('<!-- SCons Data:\n' + pdata + '\n') -            pdata = pickle.dumps(self.sources,1) -            pdata = base64.encodestring(pdata) +            pdata = pickle.dumps(self.sources,PICKLE_PROTOCOL) +            pdata = base64.encodestring(pdata).decode()              self.file.write(pdata + '-->\n')      def printSources(self, hierarchy, commonprefix): @@ -950,7 +954,7 @@ class _GenerateV7DSP(_DSPGenerator, _GenerateV7User):          self.file.write('\t<Files>\n') -        cats = sorted([k for k in categories.keys() if self.sources[k]], +        cats = sorted([k for k in list(categories.keys()) if self.sources[k]],                        key=lambda a: a.lower())          for kind in cats:              if len(cats) > 1: @@ -1037,13 +1041,13 @@ class _GenerateV7DSP(_DSPGenerator, _GenerateV7User):      def Build(self):          try:              self.file = open(self.dspabs,'w') -        except IOError, detail: +        except IOError as detail:              raise SCons.Errors.InternalError('Unable to open "' + self.dspabs + '" for writing:' + str(detail))          else:              self.PrintHeader()              self.PrintProject()              self.file.close() -             +          _GenerateV7User.Build(self)  V10DSPHeader = """\ @@ -1100,7 +1104,7 @@ class _GenerateV10DSP(_DSPGenerator, _GenerateV10User):          self.dspheader = V10DSPHeader          self.dspconfiguration = V10DSPProjectConfiguration          self.dspglobals = V10DSPGlobals -         +          _GenerateV10User.__init__(self, dspfile, source, env)      def PrintHeader(self): @@ -1131,27 +1135,27 @@ class _GenerateV10DSP(_DSPGenerator, _GenerateV10User):                           '\t\t<SccLocalPath>%s</SccLocalPath>\n' % (scc_project_name, scc_local_path_legacy))          else:              self.dspglobals = self.dspglobals.replace('%(scc_attrs)s', '') -             +          self.file.write(self.dspheader % locals()) -         +          self.file.write('\t<ItemGroup Label="ProjectConfigurations">\n') -         +          confkeys = sorted(self.configs.keys())          for kind in confkeys:              variant = self.configs[kind].variant              platform = self.configs[kind].platform              self.file.write(self.dspconfiguration % locals()) -         +          self.file.write('\t</ItemGroup>\n') -         +          self.file.write(self.dspglobals % locals()) -     +      def PrintProject(self):          name = self.name          confkeys = sorted(self.configs.keys()) -              +          self.file.write('\t<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\n') -         +          toolset = ''          if 'MSVC_VERSION' in self.env:              version_num, suite = msvs_parse_version(self.env['MSVC_VERSION']) @@ -1164,16 +1168,16 @@ class _GenerateV10DSP(_DSPGenerator, _GenerateV10User):          self.file.write('\t<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\n')          self.file.write('\t<ImportGroup Label="ExtensionSettings">\n')          self.file.write('\t</ImportGroup>\n') -         +          for kind in confkeys:              variant = self.configs[kind].variant              platform = self.configs[kind].platform              self.file.write(V10DSPImportGroupCondition % locals()) -         +          self.file.write('\t<PropertyGroup Label="UserMacros" />\n')          self.file.write('\t<PropertyGroup>\n')          self.file.write('\t<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n') -         +          for kind in confkeys:              variant = self.configs[kind].variant              platform = self.configs[kind].platform @@ -1181,7 +1185,7 @@ class _GenerateV10DSP(_DSPGenerator, _GenerateV10User):              buildtarget = self.configs[kind].buildtarget              runfile     = self.configs[kind].runfile              cmdargs = self.configs[kind].cmdargs -             +              env_has_buildtarget = 'MSVSBUILDTARGET' in self.env              if not env_has_buildtarget:                  self.env['MSVSBUILDTARGET'] = buildtarget @@ -1206,41 +1210,41 @@ class _GenerateV10DSP(_DSPGenerator, _GenerateV10User):                  del self.env['MSVSBUILDTARGET']              self.file.write(V10DSPCommandLine % locals()) -         +          self.file.write('\t</PropertyGroup>\n') -         +          #filter settings in MSVS 2010 are stored in separate file          self.filtersabs = self.dspabs + '.filters'          try:              self.filters_file = open(self.filtersabs, 'w') -        except IOError, detail: +        except IOError as detail:              raise SCons.Errors.InternalError('Unable to open "' + self.filtersabs + '" for writing:' + str(detail)) -             +          self.filters_file.write('<?xml version="1.0" encoding="utf-8"?>\n'                                  '<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\n') -                                 +          self.PrintSourceFiles() -         +          self.filters_file.write('</Project>')          self.filters_file.close() -         +          self.file.write('\t<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\n'                          '\t<ImportGroup Label="ExtensionTargets">\n'                          '\t</ImportGroup>\n'                          '</Project>\n') -                         +          if self.nokeep == 0:              # now we pickle some data and add it to the file -- MSDEV will ignore it. -            pdata = pickle.dumps(self.configs,1) -            pdata = base64.encodestring(pdata) +            pdata = pickle.dumps(self.configs,PICKLE_PROTOCOL) +            pdata = base64.encodestring(pdata).decode()              self.file.write('<!-- SCons Data:\n' + pdata + '\n') -            pdata = pickle.dumps(self.sources,1) -            pdata = base64.encodestring(pdata) +            pdata = pickle.dumps(self.sources,PICKLE_PROTOCOL) +            pdata = base64.encodestring(pdata).decode()              self.file.write(pdata + '-->\n')      def printFilters(self, hierarchy, name):          sorteditems = sorted(hierarchy.items(), key = lambda a: a[0].lower()) -         +          for key, value in sorteditems:              if SCons.Util.is_Dict(value):                  filter_name = name + '\\' + key @@ -1248,14 +1252,14 @@ class _GenerateV10DSP(_DSPGenerator, _GenerateV10User):                                          '\t\t\t<UniqueIdentifier>%s</UniqueIdentifier>\n'                                          '\t\t</Filter>\n' % (filter_name, _generateGUID(self.dspabs, filter_name)))                  self.printFilters(value, filter_name) -         +      def printSources(self, hierarchy, kind, commonprefix, filter_name):          keywords = {'Source Files': 'ClCompile',                      'Header Files': 'ClInclude',                      'Local Headers': 'ClInclude',                      'Resource Files': 'None',                      'Other Files': 'None'} -                     +          sorteditems = sorted(hierarchy.items(), key = lambda a: a[0].lower())          # First folders, then files @@ -1269,7 +1273,7 @@ class _GenerateV10DSP(_DSPGenerator, _GenerateV10User):                  if commonprefix:                      file = os.path.join(commonprefix, value)                  file = os.path.normpath(file) -                 +                  self.file.write('\t\t<%s Include="%s" />\n' % (keywords[kind], file))                  self.filters_file.write('\t\t<%s Include="%s">\n'                                          '\t\t\t<Filter>%s</Filter>\n' @@ -1281,10 +1285,10 @@ class _GenerateV10DSP(_DSPGenerator, _GenerateV10User):                        'Local Headers': 'h;hpp;hxx;hm;inl',                        'Resource Files': 'r;rc;ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe',                        'Other Files': ''} -         -        cats = sorted([k for k in categories.keys() if self.sources[k]], + +        cats = sorted([k for k in list(categories.keys()) if self.sources[k]],  		              key = lambda a: a.lower()) -         +          # print vcxproj.filters file first          self.filters_file.write('\t<ItemGroup>\n')          for kind in cats: @@ -1292,7 +1296,7 @@ class _GenerateV10DSP(_DSPGenerator, _GenerateV10User):                                      '\t\t\t<UniqueIdentifier>{7b42d31d-d53c-4868-8b92-ca2bc9fc052f}</UniqueIdentifier>\n'                                      '\t\t\t<Extensions>%s</Extensions>\n'                                      '\t\t</Filter>\n' % (kind, categories[kind])) -                                     +              # First remove any common prefix              sources = self.sources[kind]              commonprefix = None @@ -1305,17 +1309,17 @@ class _GenerateV10DSP(_DSPGenerator, _GenerateV10User):                  # +1 because the filename starts after the separator                  sources = [s[len(cp)+1:] for s in sources]                  commonprefix = cp -             +              hierarchy = makeHierarchy(sources)              self.printFilters(hierarchy, kind) -             +          self.filters_file.write('\t</ItemGroup>\n') -             +          # then print files and filters          for kind in cats:              self.file.write('\t<ItemGroup>\n')              self.filters_file.write('\t<ItemGroup>\n') -                 +              # First remove any common prefix              sources = self.sources[kind]              commonprefix = None @@ -1328,13 +1332,13 @@ class _GenerateV10DSP(_DSPGenerator, _GenerateV10User):                  # +1 because the filename starts after the separator                  sources = [s[len(cp)+1:] for s in sources]                  commonprefix = cp -             +              hierarchy = makeHierarchy(sources)              self.printSources(hierarchy, kind, commonprefix, kind) -                         +              self.file.write('\t</ItemGroup>\n')              self.filters_file.write('\t</ItemGroup>\n') -                 +          # add the SConscript file outside of the groups          self.file.write('\t<ItemGroup>\n'                          '\t\t<None Include="%s" />\n' @@ -1342,18 +1346,18 @@ class _GenerateV10DSP(_DSPGenerator, _GenerateV10User):                          '\t</ItemGroup>\n' % str(self.sconscript))      def Parse(self): -        print "_GenerateV10DSP.Parse()" +        print("_GenerateV10DSP.Parse()")      def Build(self):          try:              self.file = open(self.dspabs, 'w') -        except IOError, detail: +        except IOError as detail:              raise SCons.Errors.InternalError('Unable to open "' + self.dspabs + '" for writing:' + str(detail))          else:              self.PrintHeader()              self.PrintProject()              self.file.close() -             +          _GenerateV10User.Build(self)  class _DSWGenerator(object): @@ -1428,7 +1432,7 @@ class _GenerateV7DSW(_DSWGenerator):                  config.platform = 'Win32'              self.configs[variant] = config -            print "Adding '" + self.name + ' - ' + config.variant + '|' + config.platform + "' to '" + str(dswfile) + "'" +            print("Adding '" + self.name + ' - ' + config.variant + '|' + config.platform + "' to '" + str(dswfile) + "'")          if 'variant' not in env:              raise SCons.Errors.InternalError("You must specify a 'variant' argument (i.e. 'Debug' or " +\ @@ -1440,7 +1444,7 @@ class _GenerateV7DSW(_DSWGenerator):                  AddConfig(self, variant)          self.platforms = [] -        for key in self.configs.keys(): +        for key in list(self.configs.keys()):              platform = self.configs[key].platform              if not platform in self.platforms:                  self.platforms.append(platform) @@ -1461,7 +1465,7 @@ class _GenerateV7DSW(_DSWGenerator):                                  'SLN_RELATIVE_FOLDER_PATH': dsp_relative_folder_path,                                  'SLN_RELATIVE_FILE_PATH': dsp_relative_file_path}                  self.dspfiles_info.append(dspfile_info) -                 +          self.dspfiles_info = []          GenerateProjectFilesInfo(self) @@ -1507,7 +1511,7 @@ class _GenerateV7DSW(_DSWGenerator):              self.file.write('# Visual Studio 2008\n')          elif self.version_num >= 8.0:              self.file.write('# Visual Studio 2005\n') -             +          for dspinfo in self.dspfiles_info:              name = dspinfo['NAME']              base, suffix = SCons.Util.splitext(name) @@ -1605,14 +1609,15 @@ class _GenerateV7DSW(_DSWGenerator):                              '\tEndGlobalSection\n')          self.file.write('EndGlobal\n')          if self.nokeep == 0: -            pdata = pickle.dumps(self.configs,1) -            pdata = base64.encodestring(pdata) -            self.file.write(pdata + '\n') +            pdata = pickle.dumps(self.configs,PICKLE_PROTOCOL) +            pdata = base64.encodestring(pdata).decode() +            self.file.write(pdata) +            self.file.write('\n')      def Build(self):          try:              self.file = open(self.dswfile,'w') -        except IOError, detail: +        except IOError as detail:              raise SCons.Errors.InternalError('Unable to open "' + self.dswfile + '" for writing:' + str(detail))          else:              self.PrintSolution() @@ -1661,7 +1666,7 @@ class _GenerateV6DSW(_DSWGenerator):      def Build(self):          try:              self.file = open(self.dswfile,'w') -        except IOError, detail: +        except IOError as detail:              raise SCons.Errors.InternalError('Unable to open "' + self.dswfile + '" for writing:' + str(detail))          else:              self.PrintWorkspace() @@ -1718,8 +1723,8 @@ def GenerateProject(target, source, env):      if not dspfile is builddspfile:          try:              bdsp = open(str(builddspfile), "w+") -        except IOError, detail: -            print 'Unable to open "' + str(dspfile) + '" for writing:',detail,'\n' +        except IOError as detail: +            print('Unable to open "' + str(dspfile) + '" for writing:',detail,'\n')              raise          bdsp.write("This is just a placeholder file.\nThe real project file is here:\n%s\n" % dspfile.get_abspath()) @@ -1734,8 +1739,8 @@ def GenerateProject(target, source, env):              try:                  bdsw = open(str(builddswfile), "w+") -            except IOError, detail: -                print 'Unable to open "' + str(dspfile) + '" for writing:',detail,'\n' +            except IOError as detail: +                print('Unable to open "' + str(dspfile) + '" for writing:',detail,'\n')                  raise              bdsw.write("This is just a placeholder file.\nThe real workspace file is here:\n%s\n" % dswfile.get_abspath()) @@ -1843,7 +1848,10 @@ def projectEmitter(target, source, env):          targetlist = targetlist + t      # Beginning with Visual Studio 2010 for each project file (.vcxproj) we have additional file (.vcxproj.filters) -    if float(env['MSVS_VERSION']) >= 10.0: +    version_num = 6.0 +    if 'MSVS_VERSION' in env: +        version_num, suite = msvs_parse_version(env['MSVS_VERSION']) +    if version_num >= 10.0:          targetlist.append(targetlist[0] + '.filters')      return (targetlist, sourcelist) @@ -1969,7 +1977,7 @@ def generate(env):      else:          env['MSVS']['PROJECTSUFFIX']  = '.vcxproj'          env['MSVS']['SOLUTIONSUFFIX'] = '.sln' -		 +      if (version_num >= 10.0):          env['MSVSENCODING'] = 'utf-8'      else: diff --git a/src/engine/SCons/Tool/msvs.xml b/src/engine/SCons/Tool/msvs.xml index 4ca5fb1..0408509 100644 --- a/src/engine/SCons/Tool/msvs.xml +++ b/src/engine/SCons/Tool/msvs.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. @@ -127,22 +127,24 @@ compilation error messages displayed in the Visual Studio console output  window. This can be remedied by adding the Visual C/C++ <literal>/FC</literal>  compiler option to the &cv-link-CCFLAGS; variable so that the compiler will  print the full path name of any files that cause compilation errors. </para> -<para> Example usage: </para> <example_commands>barsrcs = ['bar.cpp'], -barincs = ['bar.h'], +<para> Example usage: </para> +    <example_commands> +barsrcs = ['bar.cpp'] +barincs = ['bar.h']  barlocalincs = ['StdAfx.h']  barresources = ['bar.rc','resource.h']  barmisc = ['bar_readme.txt']  dll = env.SharedLibrary(target = 'bar.dll',                          source = barsrcs) - +buildtarget = [s for s in dll if str(s).endswith('dll')]  env.MSVSProject(target = 'Bar' + env['MSVSPROJECTSUFFIX'],                  srcs = barsrcs,                  incs = barincs,                  localincs = barlocalincs,                  resources = barresources,                  misc = barmisc, -                buildtarget = dll, +                buildtarget = buildtarget,                  variant = 'Release')  </example_commands>  <para>Starting with version 2.4 of diff --git a/src/engine/SCons/Tool/msvsTests.py b/src/engine/SCons/Tool/msvsTests.py index 86df271..8c09487 100644 --- a/src/engine/SCons/Tool/msvsTests.py +++ b/src/engine/SCons/Tool/msvsTests.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 @@ -20,8 +20,9 @@  # 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/Tool/msvsTests.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/msvsTests.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os  import sys @@ -623,7 +624,7 @@ class msvsTestCase(unittest.TestCase):          tests_cmdargs = [(None,            dict.fromkeys(list_variant, '')),                            ('',              dict.fromkeys(list_variant, '')),                            (list_cmdargs[0], dict.fromkeys(list_variant, list_cmdargs[0])), -                         (list_cmdargs,    dict(zip(list_variant, list_cmdargs)))] +                         (list_cmdargs,    dict(list(zip(list_variant, list_cmdargs))))]          # Run the test for each test case          for param_cmdargs, expected_cmdargs in tests_cmdargs: @@ -650,8 +651,8 @@ class msvsTestCase(unittest.TestCase):                       'cmdargs': expected_cmdargs[variant_platform]}              # Create parameter environment with final parameter dictionary -            param_dict = dict(zip(('variant', 'runfile', 'buildtarget', 'outdir'), -                                  [list(l) for l in zip(*param_configs)])) +            param_dict = dict(list(zip(('variant', 'runfile', 'buildtarget', 'outdir'), +                                  [list(l) for l in zip(*param_configs)])))              param_dict['cmdargs'] = param_cmdargs              # Hack to be able to run the test with a 'DummyEnv' @@ -667,8 +668,8 @@ class msvsTestCase(unittest.TestCase):              genDSP = function_test(dspfile, source, env)              # Check expected result -            self.assertListEqual(genDSP.configs.keys(), expected_configs.keys()) -            for key in genDSP.configs.keys(): +            self.assertListEqual(list(genDSP.configs.keys()), list(expected_configs.keys())) +            for key in list(genDSP.configs.keys()):                  self.assertDictEqual(genDSP.configs[key].__dict__, expected_configs[key])  class msvs6aTestCase(msvsTestCase): @@ -827,7 +828,7 @@ if __name__ == "__main__":      ]      for test_class in test_classes: -        print "TEST: ", test_class.__doc__ +        print("TEST: ", test_class.__doc__)          back_osenv = copy.deepcopy(os.environ)          try:              # XXX: overriding the os.environ is bad, but doing it diff --git a/src/engine/SCons/Tool/mwcc.py b/src/engine/SCons/Tool/mwcc.py index a7ddb53..566f812 100644 --- a/src/engine/SCons/Tool/mwcc.py +++ b/src/engine/SCons/Tool/mwcc.py @@ -8,7 +8,7 @@ selection method.  """  # -# 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 @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/mwcc.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/mwcc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os  import os.path diff --git a/src/engine/SCons/Tool/mwcc.xml b/src/engine/SCons/Tool/mwcc.xml index 65f4852..39e6dfa 100644 --- a/src/engine/SCons/Tool/mwcc.xml +++ b/src/engine/SCons/Tool/mwcc.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/Tool/mwld.py b/src/engine/SCons/Tool/mwld.py index eeb80f0..9abeeb5 100644 --- a/src/engine/SCons/Tool/mwld.py +++ b/src/engine/SCons/Tool/mwld.py @@ -8,7 +8,7 @@ selection method.  """  # -# 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 @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/mwld.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/mwld.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Tool diff --git a/src/engine/SCons/Tool/mwld.xml b/src/engine/SCons/Tool/mwld.xml index c081461..993fefe 100644 --- a/src/engine/SCons/Tool/mwld.xml +++ b/src/engine/SCons/Tool/mwld.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/Tool/nasm.py b/src/engine/SCons/Tool/nasm.py index ee1d78c..c605cc6 100644 --- a/src/engine/SCons/Tool/nasm.py +++ b/src/engine/SCons/Tool/nasm.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/nasm.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/nasm.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Defaults  import SCons.Tool diff --git a/src/engine/SCons/Tool/nasm.xml b/src/engine/SCons/Tool/nasm.xml index f7b7b38..1834b34 100644 --- a/src/engine/SCons/Tool/nasm.xml +++ b/src/engine/SCons/Tool/nasm.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/Tool/packaging.xml b/src/engine/SCons/Tool/packaging.xml index 98ba508..ea39115 100644 --- a/src/engine/SCons/Tool/packaging.xml +++ b/src/engine/SCons/Tool/packaging.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/Tool/packaging/__init__.py b/src/engine/SCons/Tool/packaging/__init__.py index 9b1a14a..b844afb 100644 --- a/src/engine/SCons/Tool/packaging/__init__.py +++ b/src/engine/SCons/Tool/packaging/__init__.py @@ -4,7 +4,7 @@ SCons Packaging Tool.  """  # -# 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 @@ -25,7 +25,7 @@ SCons Packaging Tool.  # 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/Tool/packaging/__init__.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/packaging/__init__.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Environment  from SCons.Variables import * @@ -119,7 +119,7 @@ def Package(env, target=None, source=None, **kw):          try:              file,path,desc=imp.find_module(type, __path__)              return imp.load_module(type, file, path, desc) -        except ImportError, e: +        except ImportError as e:              raise EnvironmentError("packager %s not available: %s"%(type,str(e)))      packagers=list(map(load_packager, PACKAGETYPE)) @@ -140,7 +140,7 @@ def Package(env, target=None, source=None, **kw):          if 'PACKAGEROOT' not in kw:              kw['PACKAGEROOT'] = default_name%kw -    except KeyError, e: +    except KeyError as e:          raise SCons.Errors.UserError( "Missing Packagetag '%s'"%e.args[0] )      # setup the source files @@ -156,10 +156,10 @@ def Package(env, target=None, source=None, **kw):          assert( len(target) == 0 ) -    except KeyError, e: +    except KeyError as e:          raise SCons.Errors.UserError( "Missing Packagetag '%s' for %s packager"\                                        % (e.args[0],packager.__name__) ) -    except TypeError, e: +    except TypeError as e:          # this exception means that a needed argument for the packager is          # missing. As our packagers get their "tags" as named function          # arguments we need to find out which one is missing. @@ -233,7 +233,7 @@ def copy_attr(f1, f2):      """      copyit = lambda x: not hasattr(f2, x) and x[:10] == 'PACKAGING_'      if f1._tags: -        pattrs = list(filter(copyit, f1._tags)) +        pattrs = [tag for tag in f1._tags if copyit(tag)]          for attr in pattrs:              f2.Tag(attr, f1.GetTag(attr)) @@ -288,7 +288,7 @@ def stripinstallbuilder(target, source, env):              (file.builder.name=="InstallBuilder" or\               file.builder.name=="InstallAsBuilder")) -    if len(list(filter(has_no_install_location, source))): +    if len([src for src in source if has_no_install_location(src)]):          warn(Warning, "there are files to package which have no\          InstallBuilder attached, this might lead to irreproducible packages") diff --git a/src/engine/SCons/Tool/packaging/__init__.xml b/src/engine/SCons/Tool/packaging/__init__.xml index 794184d..0ee0f6b 100644 --- a/src/engine/SCons/Tool/packaging/__init__.xml +++ b/src/engine/SCons/Tool/packaging/__init__.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/Tool/packaging/ipk.py b/src/engine/SCons/Tool/packaging/ipk.py index b3abe13..71fa2b0 100644 --- a/src/engine/SCons/Tool/packaging/ipk.py +++ b/src/engine/SCons/Tool/packaging/ipk.py @@ -2,7 +2,7 @@  """  # -# 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 @@ -24,7 +24,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/packaging/ipk.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/packaging/ipk.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Builder  import SCons.Node.FS @@ -169,7 +169,7 @@ Description: $X_IPK_DESCRIPTION      #      # close all opened files -    for f in opened_files.values(): +    for f in list(opened_files.values()):          f.close()      # call a user specified function diff --git a/src/engine/SCons/Tool/packaging/msi.py b/src/engine/SCons/Tool/packaging/msi.py index 087a8b1..827ce76 100644 --- a/src/engine/SCons/Tool/packaging/msi.py +++ b/src/engine/SCons/Tool/packaging/msi.py @@ -4,7 +4,7 @@ The msi packager.  """  # -# 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 @@ -25,7 +25,7 @@ The msi packager.  # 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/Tool/packaging/msi.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/packaging/msi.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os  import SCons @@ -216,7 +216,7 @@ def build_wxsfile(target, source, env):          if 'CHANGE_SPECFILE' in env:              env['CHANGE_SPECFILE'](target, source) -    except KeyError, e: +    except KeyError as e:          raise SCons.Errors.UserError( '"%s" package field for MSI is missing.' % e.args[0] )  # diff --git a/src/engine/SCons/Tool/packaging/rpm.py b/src/engine/SCons/Tool/packaging/rpm.py index 899e375..3c48b02 100644 --- a/src/engine/SCons/Tool/packaging/rpm.py +++ b/src/engine/SCons/Tool/packaging/rpm.py @@ -4,7 +4,7 @@ The rpm packager.  """  # -# 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 @@ -25,7 +25,7 @@ The rpm packager.  # 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/Tool/packaging/rpm.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/packaging/rpm.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os @@ -95,13 +95,15 @@ def collectintargz(target, source, env):      # find the .spec file for rpm and add it since it is not necessarily found      # by the FindSourceFiles function.      sources.extend( [s for s in source if str(s).rfind('.spec')!=-1] ) +    # sort to keep sources from changing order across builds +    sources.sort()      # as the source contains the url of the source package this rpm package      # is built from, we extract the target name      tarball = (str(target[0])+".tar.gz").replace('.rpm', '')      try:          tarball = env['SOURCE_URL'].split('/')[-1] -    except KeyError, e: +    except KeyError as e:          raise SCons.Errors.UserError( "Missing PackageTag '%s' for RPM packager" % e.args[0] )      tarball = src_targz.package(env, source=sources, target=tarball, @@ -136,7 +138,7 @@ def build_specfile(target, source, env):          if 'CHANGE_SPECFILE' in env:              env['CHANGE_SPECFILE'](target, source) -    except KeyError, e: +    except KeyError as e:          raise SCons.Errors.UserError( '"%s" package field for RPM is missing.' % e.args[0] ) @@ -225,7 +227,6 @@ def build_specfile_header(spec):          'X_RPM_EXCLUDEARCH'   : 'ExcludeArch: %s\n',          'X_RPM_EXCLUSIVEARCH' : 'ExclusiveArch: %s\n',          'X_RPM_PREFIX'        : 'Prefix: %s\n', -        'X_RPM_CONFLICTS'     : 'Conflicts: %s\n',          # internal use          'X_RPM_BUILDROOT'     : 'BuildRoot: %s\n', } @@ -270,7 +271,7 @@ def build_specfile_filesection(spec, files):      for file in files:          # build the tagset          tags = {} -        for k in supported_tags.keys(): +        for k in list(supported_tags.keys()):              try:                  v = file.GetTag(k)                  if v: @@ -324,7 +325,7 @@ class SimpleTagCompiler(object):          for key, replacement in domestic:              try:                  str = str + replacement % values[key] -            except KeyError, e: +            except KeyError as e:                  if self.mandatory:                      raise e @@ -335,7 +336,7 @@ class SimpleTagCompiler(object):                  int_values_for_key = [(get_country_code(t[0]),t[1]) for t in x]                  for v in int_values_for_key:                      str = str + replacement % v -            except KeyError, e: +            except KeyError as e:                  if self.mandatory:                      raise e diff --git a/src/engine/SCons/Tool/packaging/src_tarbz2.py b/src/engine/SCons/Tool/packaging/src_tarbz2.py index 686d6ca..b40e550 100644 --- a/src/engine/SCons/Tool/packaging/src_tarbz2.py +++ b/src/engine/SCons/Tool/packaging/src_tarbz2.py @@ -4,7 +4,7 @@ The tarbz2 SRC packager.  """  # -# 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,7 +26,7 @@ The tarbz2 SRC packager.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/packaging/src_tarbz2.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/packaging/src_tarbz2.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  from SCons.Tool.packaging import putintopackageroot diff --git a/src/engine/SCons/Tool/packaging/src_targz.py b/src/engine/SCons/Tool/packaging/src_targz.py index a993d58..01fc91a 100644 --- a/src/engine/SCons/Tool/packaging/src_targz.py +++ b/src/engine/SCons/Tool/packaging/src_targz.py @@ -4,7 +4,7 @@ The targz SRC packager.  """  # -# 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,7 +26,7 @@ The targz SRC packager.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/packaging/src_targz.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/packaging/src_targz.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  from SCons.Tool.packaging import putintopackageroot diff --git a/src/engine/SCons/Tool/packaging/src_zip.py b/src/engine/SCons/Tool/packaging/src_zip.py index c288fd9..ea21a87 100644 --- a/src/engine/SCons/Tool/packaging/src_zip.py +++ b/src/engine/SCons/Tool/packaging/src_zip.py @@ -4,7 +4,7 @@ The zip SRC packager.  """  # -# 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,7 +26,7 @@ The zip SRC packager.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/packaging/src_zip.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/packaging/src_zip.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  from SCons.Tool.packaging import putintopackageroot diff --git a/src/engine/SCons/Tool/packaging/tarbz2.py b/src/engine/SCons/Tool/packaging/tarbz2.py index 51d998a..c919cab 100644 --- a/src/engine/SCons/Tool/packaging/tarbz2.py +++ b/src/engine/SCons/Tool/packaging/tarbz2.py @@ -4,7 +4,7 @@ The tarbz2 SRC packager.  """  # -# 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,7 +26,7 @@ The tarbz2 SRC packager.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/packaging/tarbz2.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/packaging/tarbz2.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot diff --git a/src/engine/SCons/Tool/packaging/targz.py b/src/engine/SCons/Tool/packaging/targz.py index 121599b..e9e984e 100644 --- a/src/engine/SCons/Tool/packaging/targz.py +++ b/src/engine/SCons/Tool/packaging/targz.py @@ -4,7 +4,7 @@ The targz SRC packager.  """  # -# 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,7 +26,7 @@ The targz SRC packager.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/packaging/targz.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/packaging/targz.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot diff --git a/src/engine/SCons/Tool/packaging/zip.py b/src/engine/SCons/Tool/packaging/zip.py index 873de02..3b80ead 100644 --- a/src/engine/SCons/Tool/packaging/zip.py +++ b/src/engine/SCons/Tool/packaging/zip.py @@ -4,7 +4,7 @@ The zip SRC packager.  """  # -# 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,7 +26,7 @@ The zip SRC packager.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/packaging/zip.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/packaging/zip.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot diff --git a/src/engine/SCons/Tool/pdf.py b/src/engine/SCons/Tool/pdf.py index b29cd15..381732a 100644 --- a/src/engine/SCons/Tool/pdf.py +++ b/src/engine/SCons/Tool/pdf.py @@ -6,7 +6,7 @@ Add an explicit action to run epstopdf to convert .eps files to .pdf  """  # -# 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 @@ -28,7 +28,7 @@ Add an explicit action to run epstopdf to convert .eps files to .pdf  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/pdf.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/pdf.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Builder  import SCons.Tool diff --git a/src/engine/SCons/Tool/pdf.xml b/src/engine/SCons/Tool/pdf.xml index 0d19da3..9688a6f 100644 --- a/src/engine/SCons/Tool/pdf.xml +++ b/src/engine/SCons/Tool/pdf.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/Tool/pdflatex.py b/src/engine/SCons/Tool/pdflatex.py index a182586..d539770 100644 --- a/src/engine/SCons/Tool/pdflatex.py +++ b/src/engine/SCons/Tool/pdflatex.py @@ -10,7 +10,7 @@ selection method.  """  # -# 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 @@ -32,7 +32,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/pdflatex.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/pdflatex.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Action  import SCons.Util @@ -62,7 +62,7 @@ def generate(env):      env.AppendUnique(LATEXSUFFIXES=SCons.Tool.LaTeXSuffixes) -    import pdf +    from . import pdf      pdf.generate(env)      bld = env['BUILDERS']['PDF'] diff --git a/src/engine/SCons/Tool/pdflatex.xml b/src/engine/SCons/Tool/pdflatex.xml index 8b757da..4dae90b 100644 --- a/src/engine/SCons/Tool/pdflatex.xml +++ b/src/engine/SCons/Tool/pdflatex.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/Tool/pdftex.py b/src/engine/SCons/Tool/pdftex.py index c47d537..06e9d7c 100644 --- a/src/engine/SCons/Tool/pdftex.py +++ b/src/engine/SCons/Tool/pdftex.py @@ -10,7 +10,7 @@ selection method.  """  # -# 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 @@ -32,7 +32,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/pdftex.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/pdftex.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os  import SCons.Action @@ -85,7 +85,7 @@ def generate(env):      env.AppendUnique(LATEXSUFFIXES=SCons.Tool.LaTeXSuffixes) -    import pdf +    from . import pdf      pdf.generate(env)      bld = env['BUILDERS']['PDF'] diff --git a/src/engine/SCons/Tool/pdftex.xml b/src/engine/SCons/Tool/pdftex.xml index f2e1dd3..e84296a 100644 --- a/src/engine/SCons/Tool/pdftex.xml +++ b/src/engine/SCons/Tool/pdftex.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/Tool/qt.py b/src/engine/SCons/Tool/qt.py index 69e534f..e7c1b95 100644 --- a/src/engine/SCons/Tool/qt.py +++ b/src/engine/SCons/Tool/qt.py @@ -10,7 +10,7 @@ selection method.  """  # -# 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 @@ -31,8 +31,9 @@ selection method.  # 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/Tool/qt.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/qt.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os.path  import re @@ -58,7 +59,11 @@ SCons.Warnings.enableWarningClass(ToolQtWarning)  header_extensions = [".h", ".hxx", ".hpp", ".hh"]  if SCons.Util.case_sensitive_suffixes('.h', '.H'):      header_extensions.append('.H') -cplusplus = __import__('c++', globals(), locals(), []) + +import SCons.Tool.cxx +cplusplus = SCons.Tool.cxx +#cplusplus = __import__('cxx', globals(), locals(), []) +  cxx_suffixes = cplusplus.CXXSuffixes  def checkMocIncluded(target, source, env): @@ -130,15 +135,17 @@ class _Automoc(object):              if not obj.has_builder():                  # binary obj file provided                  if debug: -                    print "scons: qt: '%s' seems to be a binary. Discarded." % str(obj) +                    print("scons: qt: '%s' seems to be a binary. Discarded." % str(obj))                  continue              cpp = obj.sources[0]              if not splitext(str(cpp))[1] in cxx_suffixes:                  if debug: -                    print "scons: qt: '%s' is no cxx file. Discarded." % str(cpp)  +                    print("scons: qt: '%s' is no cxx file. Discarded." % str(cpp))                   # c or fortran source                  continue              #cpp_contents = comment.sub('', cpp.get_text_contents()) +            if debug: +                print("scons: qt: Getting contents of %s" % cpp)              cpp_contents = cpp.get_text_contents()              h=None              for h_ext in header_extensions: @@ -148,12 +155,12 @@ class _Automoc(object):                  h = find_file(hname, (cpp.get_dir(),), env.File)                  if h:                      if debug: -                        print "scons: qt: Scanning '%s' (header of '%s')" % (str(h), str(cpp)) +                        print("scons: qt: Scanning '%s' (header of '%s')" % (str(h), str(cpp)))                      #h_contents = comment.sub('', h.get_text_contents())                      h_contents = h.get_text_contents()                      break              if not h and debug: -                print "scons: qt: no header for '%s'." % (str(cpp)) +                print("scons: qt: no header for '%s'." % (str(cpp)))              if h and q_object_search.search(h_contents):                  # h file with the Q_OBJECT macro found -> add moc_cpp                  moc_cpp = env.Moc(h) @@ -161,14 +168,14 @@ class _Automoc(object):                  out_sources.append(moc_o)                  #moc_cpp.target_scanner = SCons.Defaults.CScan                  if debug: -                    print "scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(h), str(moc_cpp)) +                    print("scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(h), str(moc_cpp)))              if cpp and q_object_search.search(cpp_contents):                  # cpp file with Q_OBJECT macro found -> add moc                  # (to be included in cpp)                  moc = env.Moc(cpp)                  env.Ignore(moc, moc)                  if debug: -                    print "scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(cpp), str(moc)) +                    print("scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(cpp), str(moc)))                  #moc.source_scanner = SCons.Defaults.CScan          # restore the original env attributes (FIXME)          objBuilder.env = objBuilderEnv diff --git a/src/engine/SCons/Tool/qt.xml b/src/engine/SCons/Tool/qt.xml index 4e38417..86d50d6 100644 --- a/src/engine/SCons/Tool/qt.xml +++ b/src/engine/SCons/Tool/qt.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/Tool/rmic.py b/src/engine/SCons/Tool/rmic.py index 0a04b59..9e1eaee 100644 --- a/src/engine/SCons/Tool/rmic.py +++ b/src/engine/SCons/Tool/rmic.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/rmic.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/rmic.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os.path diff --git a/src/engine/SCons/Tool/rmic.xml b/src/engine/SCons/Tool/rmic.xml index d305f55..2b0d42b 100644 --- a/src/engine/SCons/Tool/rmic.xml +++ b/src/engine/SCons/Tool/rmic.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/Tool/rpcgen.py b/src/engine/SCons/Tool/rpcgen.py index 2348e39..1f2c66d 100644 --- a/src/engine/SCons/Tool/rpcgen.py +++ b/src/engine/SCons/Tool/rpcgen.py @@ -8,7 +8,7 @@ selection method.  """  # -# 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 @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/rpcgen.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/rpcgen.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  from SCons.Builder import Builder  import SCons.Util diff --git a/src/engine/SCons/Tool/rpcgen.xml b/src/engine/SCons/Tool/rpcgen.xml index 6760ab1..60f216e 100644 --- a/src/engine/SCons/Tool/rpcgen.xml +++ b/src/engine/SCons/Tool/rpcgen.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/Tool/rpm.py b/src/engine/SCons/Tool/rpm.py index 43bb0e7..5cd97b3 100644 --- a/src/engine/SCons/Tool/rpm.py +++ b/src/engine/SCons/Tool/rpm.py @@ -11,7 +11,7 @@ tar.gz consisting of the source file and a specfile.  """  # -# 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 @@ -33,7 +33,7 @@ tar.gz consisting of the source file and a specfile.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/rpm.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/rpm.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os  import re @@ -71,7 +71,7 @@ def build_rpm(target, source, env):                                 stdout=subprocess.PIPE,                                 stderr=subprocess.STDOUT,                                 shell=True) -    output = handle.stdout.read() +    output = SCons.Util.to_str(handle.stdout.read())      status = handle.wait()      if status: diff --git a/src/engine/SCons/Tool/rpmutils.py b/src/engine/SCons/Tool/rpmutils.py index 07c1ff3..f71d664 100644 --- a/src/engine/SCons/Tool/rpmutils.py +++ b/src/engine/SCons/Tool/rpmutils.py @@ -14,7 +14,7 @@ exact syntax.  """ -# 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,13 +34,16 @@ exact syntax.  # 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/Tool/rpmutils.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/rpmutils.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import platform  import subprocess +import SCons.Util +  # Start of rpmrc dictionaries (Marker, don't change or remove!)  os_canon = {    'AIX' : ['AIX','5'], @@ -443,6 +446,7 @@ def defaultMachine(use_rpm_default=True):          try:              # This should be the most reliable way to get the default arch              rmachine = subprocess.check_output(['rpm', '--eval=%_target_cpu'], shell=False).rstrip() +            rmachine = SCons.Util.to_str(rmachine)          except Exception as e:              # Something went wrong, try again by looking up platform.machine()              return defaultMachine(False) @@ -501,7 +505,7 @@ def updateRpmDicts(rpmrc, pyfile):                  key = tokens[0]                  if key in sections:                      # Have we met this section before? -                    if not data.has_key(tokens[0]): +                    if tokens[0] not in data:                          # No, so insert it                          data[key] = {}                      # Insert data @@ -519,7 +523,7 @@ def updateRpmDicts(rpmrc, pyfile):                  if l.startswith('# Start of rpmrc dictionaries'):                      pm = 1                      # Write data sections to single dictionaries -                    for key, entries in data.iteritems(): +                    for key, entries in data.items():                          out.write("%s = {\n" % key)                          for arch in sorted(entries.keys()):                              out.write("  '%s' : ['%s'],\n" % (arch, "','".join(entries[arch]))) @@ -529,7 +533,7 @@ def updateRpmDicts(rpmrc, pyfile):          pass  def usage(): -    print "rpmutils.py rpmrc.in rpmutils.py" +    print("rpmutils.py rpmrc.in rpmutils.py")  def main():      import sys diff --git a/src/engine/SCons/Tool/sgiar.py b/src/engine/SCons/Tool/sgiar.py index aa3cb44..a421cc1 100644 --- a/src/engine/SCons/Tool/sgiar.py +++ b/src/engine/SCons/Tool/sgiar.py @@ -11,7 +11,7 @@ selection method.  """  # -# 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 @@ -33,7 +33,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/sgiar.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/sgiar.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Defaults  import SCons.Tool diff --git a/src/engine/SCons/Tool/sgiar.xml b/src/engine/SCons/Tool/sgiar.xml index b47b990..ffbc80e 100644 --- a/src/engine/SCons/Tool/sgiar.xml +++ b/src/engine/SCons/Tool/sgiar.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/Tool/sgic++.py b/src/engine/SCons/Tool/sgic++.py index 6124ade..7a9b1e9 100644 --- a/src/engine/SCons/Tool/sgic++.py +++ b/src/engine/SCons/Tool/sgic++.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,25 +31,10 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/sgic++.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/sgic++.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" -import SCons.Util - -cplusplus = __import__('c++', globals(), locals(), []) - -def generate(env): -    """Add Builders and construction variables for SGI MIPS C++ to an Environment.""" - -    cplusplus.generate(env) - -    env['CXX']         = 'CC' -    env['CXXFLAGS']    = SCons.Util.CLVar('-LANG:std') -    env['SHCXX']       = '$CXX' -    env['SHOBJSUFFIX'] = '.o' -    env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 -     -def exists(env): -    return env.Detect('CC') +#forward proxy to the preffered cxx version +from SCons.Tool.sgicxx import *  # Local Variables:  # tab-width:4 diff --git a/src/engine/SCons/Tool/sgic++.xml b/src/engine/SCons/Tool/sgic++.xml index 7635173..03ca3b1 100644 --- a/src/engine/SCons/Tool/sgic++.xml +++ b/src/engine/SCons/Tool/sgic++.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/Tool/sgicc.py b/src/engine/SCons/Tool/sgicc.py index 0a0604f..e9f561d 100644 --- a/src/engine/SCons/Tool/sgicc.py +++ b/src/engine/SCons/Tool/sgicc.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,9 +31,9 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/sgicc.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/sgicc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" -import cc +from . import cc  def generate(env):      """Add Builders and construction variables for gcc to an Environment.""" diff --git a/src/engine/SCons/Tool/sgicc.xml b/src/engine/SCons/Tool/sgicc.xml index 99b9ee6..1e12bf3 100644 --- a/src/engine/SCons/Tool/sgicc.xml +++ b/src/engine/SCons/Tool/sgicc.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/Tool/RCS.py b/src/engine/SCons/Tool/sgicxx.py index 7a8b8b1..61c415b 100644 --- a/src/engine/SCons/Tool/RCS.py +++ b/src/engine/SCons/Tool/sgicxx.py @@ -1,6 +1,6 @@ -"""SCons.Tool.RCS.py +"""SCons.Tool.sgic++ -Tool-specific initialization for RCS. +Tool-specific initialization for MIPSpro C++ on SGI.  There normally shouldn't be any need to import this module directly.  It will usually be imported through the generic SCons.Tool.Tool() @@ -8,7 +8,8 @@ selection method.  """ -# 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 @@ -28,33 +29,30 @@ selection method.  # 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/Tool/RCS.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/sgicxx.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" -import SCons.Action -import SCons.Builder  import SCons.Util -def generate(env): -    """Add a Builder factory function and construction variables for -    RCS to an Environment.""" +import SCons.Tool.cxx +cplusplus = SCons.Tool.cxx +#cplusplus = __import__('cxx', globals(), locals(), []) -    def RCSFactory(env=env): -        """ """ -        import SCons.Warnings as W -        W.warn(W.DeprecatedSourceCodeWarning, """The RCS() factory is deprecated and there is no replacement.""") -        act = SCons.Action.Action('$RCS_COCOM', '$RCS_COCOMSTR') -        return SCons.Builder.Builder(action = act, env = env) -    env.RCS = RCSFactory +def generate(env): +    """Add Builders and construction variables for SGI MIPS C++ to an Environment.""" -    env['RCS']          = 'rcs' -    env['RCS_CO']       = 'co' -    env['RCS_COFLAGS']  = SCons.Util.CLVar('') -    env['RCS_COCOM']    = '$RCS_CO $RCS_COFLAGS $TARGET' +    cplusplus.generate(env) +    env['CXX']         = 'CC' +    env['CXXFLAGS']    = SCons.Util.CLVar('-LANG:std') +    env['SHCXX']       = '$CXX' +    env['SHOBJSUFFIX'] = '.o' +    env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 +      def exists(env): -    return env.Detect('rcs') +    return env.Detect('CC')  # Local Variables:  # tab-width:4 diff --git a/src/engine/SCons/Tool/sgilink.py b/src/engine/SCons/Tool/sgilink.py index 9f7446b..c327151 100644 --- a/src/engine/SCons/Tool/sgilink.py +++ b/src/engine/SCons/Tool/sgilink.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,11 +31,11 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/sgilink.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/sgilink.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Util -import link +from . import link  linkers = ['CC', 'cc'] diff --git a/src/engine/SCons/Tool/sgilink.xml b/src/engine/SCons/Tool/sgilink.xml index ef741e7..ede0eed 100644 --- a/src/engine/SCons/Tool/sgilink.xml +++ b/src/engine/SCons/Tool/sgilink.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/Tool/sunar.py b/src/engine/SCons/Tool/sunar.py index a055708..cd1e18d 100644 --- a/src/engine/SCons/Tool/sunar.py +++ b/src/engine/SCons/Tool/sunar.py @@ -10,7 +10,7 @@ selection method.  """  # -# 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 @@ -32,7 +32,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/sunar.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/sunar.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Defaults  import SCons.Tool diff --git a/src/engine/SCons/Tool/sunar.xml b/src/engine/SCons/Tool/sunar.xml index 6f26a29..b97e6a2 100644 --- a/src/engine/SCons/Tool/sunar.xml +++ b/src/engine/SCons/Tool/sunar.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/Tool/sunc++.py b/src/engine/SCons/Tool/sunc++.py index f8b12a1..1219bcf 100644 --- a/src/engine/SCons/Tool/sunc++.py +++ b/src/engine/SCons/Tool/sunc++.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,109 +31,12 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/sunc++.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/sunc++.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" -import SCons -import os -import re -import subprocess +#forward proxy to the preffered cxx version +from SCons.Tool.suncxx import * -cplusplus = __import__('c++', globals(), locals(), []) - -package_info = {} - -def get_package_info(package_name, pkginfo, pkgchk): -    try: -        return package_info[package_name] -    except KeyError: -        version = None -        pathname = None -        try: -            sadm_contents = open('/var/sadm/install/contents', 'r').read() -        except EnvironmentError: -            pass -        else: -            sadm_re = re.compile('^(\S*/bin/CC)(=\S*)? %s$' % package_name, re.M) -            sadm_match = sadm_re.search(sadm_contents) -            if sadm_match: -                pathname = os.path.dirname(sadm_match.group(1)) - -        try: -            p = subprocess.Popen([pkginfo, '-l', package_name], -                                 stdout=subprocess.PIPE, -                                 stderr=open('/dev/null', 'w')) -        except EnvironmentError: -            pass -        else: -            pkginfo_contents = p.communicate()[0] -            version_re = re.compile('^ *VERSION:\s*(.*)$', re.M) -            version_match = version_re.search(pkginfo_contents) -            if version_match: -                version = version_match.group(1) - -        if pathname is None: -            try: -                p = subprocess.Popen([pkgchk, '-l', package_name], -                                     stdout=subprocess.PIPE, -                                     stderr=open('/dev/null', 'w')) -            except EnvironmentError: -                pass -            else: -                pkgchk_contents = p.communicate()[0] -                pathname_re = re.compile(r'^Pathname:\s*(.*/bin/CC)$', re.M) -                pathname_match = pathname_re.search(pkgchk_contents) -                if pathname_match: -                    pathname = os.path.dirname(pathname_match.group(1)) - -        package_info[package_name] = (pathname, version) -        return package_info[package_name] - -# use the package installer tool lslpp to figure out where cppc and what -# version of it is installed -def get_cppc(env): -    cxx = env.subst('$CXX') -    if cxx: -        cppcPath = os.path.dirname(cxx) -    else: -        cppcPath = None - -    cppcVersion = None - -    pkginfo = env.subst('$PKGINFO') -    pkgchk = env.subst('$PKGCHK') - -    for package in ['SPROcpl']: -        path, version = get_package_info(package, pkginfo, pkgchk) -        if path and version: -            cppcPath, cppcVersion = path, version -            break - -    return (cppcPath, 'CC', 'CC', cppcVersion) - -def generate(env): -    """Add Builders and construction variables for SunPRO C++.""" -    path, cxx, shcxx, version = get_cppc(env) -    if path: -        cxx = os.path.join(path, cxx) -        shcxx = os.path.join(path, shcxx) - -    cplusplus.generate(env) - -    env['CXX'] = cxx -    env['SHCXX'] = shcxx -    env['CXXVERSION'] = version -    env['SHCXXFLAGS']   = SCons.Util.CLVar('$CXXFLAGS -KPIC') -    env['SHOBJPREFIX']  = 'so_' -    env['SHOBJSUFFIX']  = '.o' -     -def exists(env): -    path, cxx, shcxx, version = get_cppc(env) -    if path and cxx: -        cppc = os.path.join(path, cxx) -        if os.path.exists(cppc): -            return cppc -    return None  # Local Variables:  # tab-width:4 diff --git a/src/engine/SCons/Tool/sunc++.xml b/src/engine/SCons/Tool/sunc++.xml index 023a7f4..2e7b220 100644 --- a/src/engine/SCons/Tool/sunc++.xml +++ b/src/engine/SCons/Tool/sunc++.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/Tool/suncc.py b/src/engine/SCons/Tool/suncc.py index 4bcba29..bc4eb4f 100644 --- a/src/engine/SCons/Tool/suncc.py +++ b/src/engine/SCons/Tool/suncc.py @@ -8,7 +8,7 @@ selection method.  """  # -# 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 @@ -30,11 +30,11 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/suncc.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/suncc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Util -import cc +from . import cc  def generate(env):      """ diff --git a/src/engine/SCons/Tool/suncc.xml b/src/engine/SCons/Tool/suncc.xml index f015870..61cfb30 100644 --- a/src/engine/SCons/Tool/suncc.xml +++ b/src/engine/SCons/Tool/suncc.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/Tool/suncxx.py b/src/engine/SCons/Tool/suncxx.py new file mode 100644 index 0000000..1545500 --- /dev/null +++ b/src/engine/SCons/Tool/suncxx.py @@ -0,0 +1,144 @@ +"""SCons.Tool.sunc++ + +Tool-specific initialization for C++ on SunOS / Solaris. + +There normally shouldn't be any need to import this module directly. +It will usually be imported through the generic SCons.Tool.Tool() +selection method. + +""" + +# +# 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 +# "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/Tool/suncxx.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" + +import SCons + +import os +import re +import subprocess + +import SCons.Tool.cxx +cplusplus = SCons.Tool.cxx +#cplusplus = __import__('c++', globals(), locals(), []) + +package_info = {} + +def get_package_info(package_name, pkginfo, pkgchk): +    try: +        return package_info[package_name] +    except KeyError: +        version = None +        pathname = None +        try: +            sadm_contents = open('/var/sadm/install/contents', 'r').read() +        except EnvironmentError: +            pass +        else: +            sadm_re = re.compile('^(\S*/bin/CC)(=\S*)? %s$' % package_name, re.M) +            sadm_match = sadm_re.search(sadm_contents) +            if sadm_match: +                pathname = os.path.dirname(sadm_match.group(1)) + +        try: +            p = subprocess.Popen([pkginfo, '-l', package_name], +                                 stdout=subprocess.PIPE, +                                 stderr=open('/dev/null', 'w')) +        except EnvironmentError: +            pass +        else: +            pkginfo_contents = p.communicate()[0] +            version_re = re.compile('^ *VERSION:\s*(.*)$', re.M) +            version_match = version_re.search(pkginfo_contents) +            if version_match: +                version = version_match.group(1) + +        if pathname is None: +            try: +                p = subprocess.Popen([pkgchk, '-l', package_name], +                                     stdout=subprocess.PIPE, +                                     stderr=open('/dev/null', 'w')) +            except EnvironmentError: +                pass +            else: +                pkgchk_contents = p.communicate()[0] +                pathname_re = re.compile(r'^Pathname:\s*(.*/bin/CC)$', re.M) +                pathname_match = pathname_re.search(pkgchk_contents) +                if pathname_match: +                    pathname = os.path.dirname(pathname_match.group(1)) + +        package_info[package_name] = (pathname, version) +        return package_info[package_name] + +# use the package installer tool lslpp to figure out where cppc and what +# version of it is installed +def get_cppc(env): +    cxx = env.subst('$CXX') +    if cxx: +        cppcPath = os.path.dirname(cxx) +    else: +        cppcPath = None + +    cppcVersion = None + +    pkginfo = env.subst('$PKGINFO') +    pkgchk = env.subst('$PKGCHK') + +    for package in ['SPROcpl']: +        path, version = get_package_info(package, pkginfo, pkgchk) +        if path and version: +            cppcPath, cppcVersion = path, version +            break + +    return (cppcPath, 'CC', 'CC', cppcVersion) + +def generate(env): +    """Add Builders and construction variables for SunPRO C++.""" +    path, cxx, shcxx, version = get_cppc(env) +    if path: +        cxx = os.path.join(path, cxx) +        shcxx = os.path.join(path, shcxx) + +    cplusplus.generate(env) + +    env['CXX'] = cxx +    env['SHCXX'] = shcxx +    env['CXXVERSION'] = version +    env['SHCXXFLAGS']   = SCons.Util.CLVar('$CXXFLAGS -KPIC') +    env['SHOBJPREFIX']  = 'so_' +    env['SHOBJSUFFIX']  = '.o' +     +def exists(env): +    path, cxx, shcxx, version = get_cppc(env) +    if path and cxx: +        cppc = os.path.join(path, cxx) +        if os.path.exists(cppc): +            return cppc +    return None + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/src/engine/SCons/Tool/sunf77.py b/src/engine/SCons/Tool/sunf77.py index 3a1dc7b..9842d31 100644 --- a/src/engine/SCons/Tool/sunf77.py +++ b/src/engine/SCons/Tool/sunf77.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,11 +31,11 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/sunf77.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/sunf77.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Util -from FortranCommon import add_all_to_env +from .FortranCommon import add_all_to_env  compilers = ['sunf77', 'f77'] diff --git a/src/engine/SCons/Tool/sunf77.xml b/src/engine/SCons/Tool/sunf77.xml index d9bc8a6..8f6ecaf 100644 --- a/src/engine/SCons/Tool/sunf77.xml +++ b/src/engine/SCons/Tool/sunf77.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/Tool/sunf90.py b/src/engine/SCons/Tool/sunf90.py index e5f3788..7245f99 100644 --- a/src/engine/SCons/Tool/sunf90.py +++ b/src/engine/SCons/Tool/sunf90.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,11 +31,11 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/sunf90.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/sunf90.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Util -from FortranCommon import add_all_to_env +from .FortranCommon import add_all_to_env  compilers = ['sunf90', 'f90'] diff --git a/src/engine/SCons/Tool/sunf90.xml b/src/engine/SCons/Tool/sunf90.xml index 4541971..8f151fe 100644 --- a/src/engine/SCons/Tool/sunf90.xml +++ b/src/engine/SCons/Tool/sunf90.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/Tool/sunf95.py b/src/engine/SCons/Tool/sunf95.py index 8534f40..aae8828 100644 --- a/src/engine/SCons/Tool/sunf95.py +++ b/src/engine/SCons/Tool/sunf95.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,11 +31,11 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/sunf95.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/sunf95.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Util -from FortranCommon import add_all_to_env +from .FortranCommon import add_all_to_env  compilers = ['sunf95', 'f95'] diff --git a/src/engine/SCons/Tool/sunf95.xml b/src/engine/SCons/Tool/sunf95.xml index 986f410..a2c77da 100644 --- a/src/engine/SCons/Tool/sunf95.xml +++ b/src/engine/SCons/Tool/sunf95.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/Tool/sunlink.py b/src/engine/SCons/Tool/sunlink.py index b36d0e5..175157f 100644 --- a/src/engine/SCons/Tool/sunlink.py +++ b/src/engine/SCons/Tool/sunlink.py @@ -8,7 +8,7 @@ selection method.  """  # -# 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 @@ -30,14 +30,14 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/sunlink.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/sunlink.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os  import os.path  import SCons.Util -import link +from . import link  ccLinker = None diff --git a/src/engine/SCons/Tool/sunlink.xml b/src/engine/SCons/Tool/sunlink.xml index 2d470f5..b652f5c 100644 --- a/src/engine/SCons/Tool/sunlink.xml +++ b/src/engine/SCons/Tool/sunlink.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/Tool/swig.py b/src/engine/SCons/Tool/swig.py index 0f6883c..dedf103 100644 --- a/src/engine/SCons/Tool/swig.py +++ b/src/engine/SCons/Tool/swig.py @@ -7,9 +7,10 @@ It will usually be imported through the generic SCons.Tool.Tool()  selection method.  """ +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 @@ -31,7 +32,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/swig.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/swig.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os.path  import re @@ -140,13 +141,14 @@ def _get_swig_version(env, swig):                                   stdout = subprocess.PIPE)      if pipe.wait() != 0: return -    out = pipe.stdout.read() -    match = re.search(r'SWIG Version\s+(\S+).*', out, re.MULTILINE) +    # MAYBE:   out = SCons.Util.to_str (pipe.stdout.read()) +    out = SCons.Util.to_str(pipe.stdout.read()) +    match = re.search('SWIG Version\s+(\S+).*', out, re.MULTILINE)      if match: -        if verbose: print "Version is:%s"%match.group(1) +        if verbose: print("Version is:%s"%match.group(1))          return match.group(1)      else: -        if verbose: print "Unable to detect version: [%s]"%out +        if verbose: print("Unable to detect version: [%s]"%out)  def generate(env):      """Add Builders and construction variables for swig to an Environment.""" diff --git a/src/engine/SCons/Tool/swig.xml b/src/engine/SCons/Tool/swig.xml index d56c491..53d92ef 100644 --- a/src/engine/SCons/Tool/swig.xml +++ b/src/engine/SCons/Tool/swig.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/Tool/tar.py b/src/engine/SCons/Tool/tar.py index 924358b..77392ae 100644 --- a/src/engine/SCons/Tool/tar.py +++ b/src/engine/SCons/Tool/tar.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/tar.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/tar.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Action  import SCons.Builder diff --git a/src/engine/SCons/Tool/tar.xml b/src/engine/SCons/Tool/tar.xml index ace2c4c..637b7db 100644 --- a/src/engine/SCons/Tool/tar.xml +++ b/src/engine/SCons/Tool/tar.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/Tool/tex.py b/src/engine/SCons/Tool/tex.py index 8da6d75..990c9fa 100644 --- a/src/engine/SCons/Tool/tex.py +++ b/src/engine/SCons/Tool/tex.py @@ -10,7 +10,7 @@ selection method.  """  # -# 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 @@ -31,8 +31,9 @@ selection method.  # 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/Tool/tex.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/tex.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os.path  import re @@ -164,15 +165,15 @@ def FindFile(name,suffixes,paths,env,requireExt=False):          if ext:              name = name + ext      if Verbose: -        print " searching for '%s' with extensions: " % name,suffixes +        print(" searching for '%s' with extensions: " % name,suffixes)      for path in paths:          testName = os.path.join(path,name)          if Verbose: -            print " look for '%s'" % testName +            print(" look for '%s'" % testName)          if os.path.isfile(testName):              if Verbose: -                print " found '%s'" % testName +                print(" found '%s'" % testName)              return env.fs.File(testName)          else:              name_ext = SCons.Util.splitext(testName)[1] @@ -183,14 +184,14 @@ def FindFile(name,suffixes,paths,env,requireExt=False):              for suffix in suffixes:                  testNameExt = testName + suffix                  if Verbose: -                    print " look for '%s'" % testNameExt +                    print(" look for '%s'" % testNameExt)                  if os.path.isfile(testNameExt):                      if Verbose: -                        print " found '%s'" % testNameExt +                        print(" found '%s'" % testNameExt)                      return env.fs.File(testNameExt)      if Verbose: -        print " did not find '%s'" % name +        print(" did not find '%s'" % name)      return None  def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None): @@ -250,7 +251,7 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None          saved_hashes[suffix] = theNode.get_csig()      if Verbose: -        print "hashes: ",saved_hashes +        print("hashes: ",saved_hashes)      must_rerun_latex = True @@ -269,12 +270,12 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None          if saved_hashes[suffix] == new_md5:              if Verbose: -                print "file %s not changed" % (targetbase+suffix) +                print("file %s not changed" % (targetbase+suffix))              return False        # unchanged          saved_hashes[suffix] = new_md5          must_rerun_latex = True          if Verbose: -            print "file %s changed, rerunning Latex, new hash = " % (targetbase+suffix), new_md5 +            print("file %s changed, rerunning Latex, new hash = " % (targetbase+suffix), new_md5)          return True     # changed      # generate the file name that latex will generate @@ -296,7 +297,7 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None          logfilename = targetbase + '.log'          logContent = ''          if os.path.isfile(logfilename): -            logContent = open(logfilename, "rb").read() +            logContent = open(logfilename, "r").read()          # Read the fls file to find all .aux files @@ -304,7 +305,7 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None          flsContent = ''          auxfiles = []          if os.path.isfile(flsfilename): -            flsContent = open(flsfilename, "rb").read() +            flsContent = open(flsfilename, "r").read()              auxfiles = openout_aux_re.findall(flsContent)              # remove duplicates              dups = {} @@ -314,7 +315,7 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None          bcffiles = []          if os.path.isfile(flsfilename): -            flsContent = open(flsfilename, "rb").read() +            flsContent = open(flsfilename, "r").read()              bcffiles = openout_bcf_re.findall(flsContent)              # remove duplicates              dups = {} @@ -323,8 +324,8 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None              bcffiles = list(dups.keys())          if Verbose: -            print "auxfiles ",auxfiles -            print "bcffiles ",bcffiles +            print("auxfiles ",auxfiles) +            print("bcffiles ",bcffiles)          # Now decide if bibtex will need to be run.          # The information that bibtex reads from the .aux file is @@ -337,10 +338,10 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None                  already_bibtexed.append(auxfilename)                  target_aux = os.path.join(targetdir, auxfilename)                  if os.path.isfile(target_aux): -                    content = open(target_aux, "rb").read() +                    content = open(target_aux, "r").read()                      if content.find("bibdata") != -1:                          if Verbose: -                            print "Need to run bibtex on ",auxfilename +                            print("Need to run bibtex on ",auxfilename)                          bibfile = env.fs.File(SCons.Util.splitext(target_aux)[0])                          result = BibTeXAction(bibfile, bibfile, env)                          if result != 0: @@ -360,10 +361,10 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None                  already_bibtexed.append(bcffilename)                  target_bcf = os.path.join(targetdir, bcffilename)                  if os.path.isfile(target_bcf): -                    content = open(target_bcf, "rb").read() +                    content = open(target_bcf, "r").read()                      if content.find("bibdata") != -1:                          if Verbose: -                            print "Need to run biber on ",bcffilename +                            print("Need to run biber on ",bcffilename)                          bibfile = env.fs.File(SCons.Util.splitext(target_bcf)[0])                          result = BiberAction(bibfile, bibfile, env)                          if result != 0: @@ -374,7 +375,7 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None          if check_MD5(suffix_nodes['.idx'],'.idx') or (count == 1 and run_makeindex):              # We must run makeindex              if Verbose: -                print "Need to run makeindex" +                print("Need to run makeindex")              idxfile = suffix_nodes['.idx']              result = MakeIndexAction(idxfile, idxfile, env)              if result != 0: @@ -392,7 +393,7 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None          if check_MD5(suffix_nodes['.nlo'],'.nlo') or (count == 1 and run_nomenclature):              # We must run makeindex              if Verbose: -                print "Need to run makeindex for nomenclature" +                print("Need to run makeindex for nomenclature")              nclfile = suffix_nodes['.nlo']              result = MakeNclAction(nclfile, nclfile, env)              if result != 0: @@ -404,7 +405,7 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None          if check_MD5(suffix_nodes['.glo'],'.glo') or (count == 1 and run_glossaries) or (count == 1 and run_glossary):              # We must run makeindex              if Verbose: -                print "Need to run makeindex for glossary" +                print("Need to run makeindex for glossary")              glofile = suffix_nodes['.glo']              result = MakeGlossaryAction(glofile, glofile, env)              if result != 0: @@ -416,7 +417,7 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None          if check_MD5(suffix_nodes['.acn'],'.acn') or (count == 1 and run_acronyms):              # We must run makeindex              if Verbose: -                print "Need to run makeindex for acronyms" +                print("Need to run makeindex for acronyms")              acrfile = suffix_nodes['.acn']              result = MakeAcronymsAction(acrfile, acrfile, env)              if result != 0: @@ -429,7 +430,7 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None              if check_MD5(suffix_nodes[newglossary_suffix[ig][2]],newglossary_suffix[ig][2]) or (count == 1):                  # We must run makeindex                  if Verbose: -                    print "Need to run makeindex for newglossary" +                    print("Need to run makeindex for newglossary")                  newglfile = suffix_nodes[newglossary_suffix[ig][2]]                  MakeNewGlossaryAction = SCons.Action.Action("$MAKENEWGLOSSARYCOM ${SOURCE.filebase}%s -s ${SOURCE.filebase}.ist -t ${SOURCE.filebase}%s -o ${SOURCE.filebase}%s" % (newglossary_suffix[ig][2],newglossary_suffix[ig][0],newglossary_suffix[ig][1]), "$MAKENEWGLOSSARYCOMSTR") @@ -443,26 +444,26 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None          if warning_rerun_re.search(logContent):              must_rerun_latex = True              if Verbose: -                print "rerun Latex due to latex or package rerun warning" +                print("rerun Latex due to latex or package rerun warning")          if rerun_citations_re.search(logContent):              must_rerun_latex = True              if Verbose: -                print "rerun Latex due to 'Rerun to get citations correct' warning" +                print("rerun Latex due to 'Rerun to get citations correct' warning")          if undefined_references_re.search(logContent):              must_rerun_latex = True              if Verbose: -                print "rerun Latex due to undefined references or citations" +                print("rerun Latex due to undefined references or citations")          if (count >= int(env.subst('$LATEXRETRIES')) and must_rerun_latex): -            print "reached max number of retries on Latex ,",int(env.subst('$LATEXRETRIES')) +            print("reached max number of retries on Latex ,",int(env.subst('$LATEXRETRIES')))  # end of while loop      # rename Latex's output to what the target name is      if not (str(target[0]) == resultfilename  and  os.path.isfile(resultfilename)):          if os.path.isfile(resultfilename): -            print "move %s to %s" % (resultfilename, str(target[0]), ) +            print("move %s to %s" % (resultfilename, str(target[0]), ))              shutil.move(resultfilename,str(target[0]))      # Original comment (when TEXPICTS was not restored): @@ -516,27 +517,27 @@ def is_LaTeX(flist,env,abspath):      else:          env['ENV']['TEXINPUTS'] = savedpath      if Verbose: -        print "is_LaTeX search path ",paths -        print "files to search :",flist +        print("is_LaTeX search path ",paths) +        print("files to search :",flist)      # Now that we have the search path and file list, check each one      for f in flist:          if Verbose: -            print " checking for Latex source ",str(f) +            print(" checking for Latex source ",str(f))          content = f.get_text_contents()          if LaTeX_re.search(content):              if Verbose: -                print "file %s is a LaTeX file" % str(f) +                print("file %s is a LaTeX file" % str(f))              return 1          if Verbose: -            print "file %s is not a LaTeX file" % str(f) +            print("file %s is not a LaTeX file" % str(f))          # now find included files          inc_files = [ ]          inc_files.extend( include_re.findall(content) )          if Verbose: -            print "files included by '%s': "%str(f),inc_files +            print("files included by '%s': "%str(f),inc_files)          # inc_files is list of file names as given. need to find them          # using TEXINPUTS paths. @@ -546,7 +547,7 @@ def is_LaTeX(flist,env,abspath):              # make this a list since is_LaTeX takes a list.              fileList = [srcNode,]              if Verbose: -                print "FindFile found ",srcNode +                print("FindFile found ",srcNode)              if srcNode is not None:                  file_test = is_LaTeX(fileList, env, abspath) @@ -555,7 +556,7 @@ def is_LaTeX(flist,env,abspath):                  return file_test          if Verbose: -            print " done scanning ",str(f) +            print(" done scanning ",str(f))      return 0 @@ -620,15 +621,15 @@ def ScanFiles(theFile, target, paths, file_tests, file_tests_search, env, graphi      content = theFile.get_text_contents()      if Verbose: -        print " scanning ",str(theFile) +        print(" scanning ",str(theFile))      for i in range(len(file_tests_search)):          if file_tests[i][0] is None:              if Verbose: -                print "scan i ",i," files_tests[i] ",file_tests[i], file_tests[i][1] +                print("scan i ",i," files_tests[i] ",file_tests[i], file_tests[i][1])              file_tests[i][0] = file_tests_search[i].search(content)              if Verbose and file_tests[i][0]: -                print "   found match for ",file_tests[i][1][-1] +                print("   found match for ",file_tests[i][1][-1])              # for newglossary insert the suffixes in file_tests[i]              if file_tests[i][0] and file_tests[i][1][-1] == 'newglossary':                  findresult = file_tests_search[i].findall(content) @@ -639,19 +640,19 @@ def ScanFiles(theFile, target, paths, file_tests, file_tests_search, env, graphi                      suffix_list = ['.'+findresult[l][0],'.'+findresult[l][2],'.'+findresult[l][3] ]                      newglossary_suffix.append(suffix_list)                  if Verbose: -                    print " new suffixes for newglossary ",newglossary_suffix -                 +                    print(" new suffixes for newglossary ",newglossary_suffix) +      incResult = includeOnly_re.search(content)      if incResult:          aux_files.append(os.path.join(targetdir, incResult.group(1)))      if Verbose: -        print "\include file names : ", aux_files +        print("\include file names : ", aux_files)      # recursively call this on each of the included files      inc_files = [ ]      inc_files.extend( include_re.findall(content) )      if Verbose: -        print "files included by '%s': "%str(theFile),inc_files +        print("files included by '%s': "%str(theFile),inc_files)      # inc_files is list of file names as given. need to find them      # using TEXINPUTS paths. @@ -660,7 +661,7 @@ def ScanFiles(theFile, target, paths, file_tests, file_tests_search, env, graphi          if srcNode is not None:              file_tests = ScanFiles(srcNode, target, paths, file_tests, file_tests_search, env, graphics_extensions, targetdir, aux_files)      if Verbose: -        print " done scanning ",str(theFile) +        print(" done scanning ",str(theFile))      return file_tests  def tex_emitter_core(target, source, env, graphics_extensions): @@ -692,7 +693,7 @@ def tex_emitter_core(target, source, env, graphics_extensions):      env.SideEffect(flsfilename,target[0])      env.SideEffect(syncfilename,target[0])      if Verbose: -        print "side effect :",auxfilename,logfilename,flsfilename,syncfilename +        print("side effect :",auxfilename,logfilename,flsfilename,syncfilename)      env.Clean(target[0],auxfilename)      env.Clean(target[0],logfilename)      env.Clean(target[0],flsfilename) @@ -765,7 +766,7 @@ def tex_emitter_core(target, source, env, graphics_extensions):      else:          env['ENV']['TEXINPUTS'] = savedpath      if Verbose: -        print "search path ",paths +        print("search path ",paths)      # scan all sources for side effect files      aux_files = [] @@ -774,7 +775,7 @@ def tex_emitter_core(target, source, env, graphics_extensions):      for (theSearch,suffix_list) in file_tests:          # add side effects if feature is present.If file is to be generated,add all side effects          if Verbose and theSearch: -            print "check side effects for ",suffix_list[-1] +            print("check side effects for ",suffix_list[-1])          if (theSearch != None) or (not source[0].exists() ):              file_list = [targetbase,]              # for bibunit we need a list of files @@ -788,11 +789,11 @@ def tex_emitter_core(target, source, env, graphics_extensions):              if suffix_list[-1] == 'multibib':                  for multibibmatch in multibib_re.finditer(content):                      if Verbose: -                        print "multibib match ",multibibmatch.group(1) +                        print("multibib match ",multibibmatch.group(1))                      if multibibmatch != None:                          baselist = multibibmatch.group(1).split(',')                          if Verbose: -                            print "multibib list ", baselist +                            print("multibib list ", baselist)                          for i in range(len(baselist)):                              file_list.append(os.path.join(targetdir, baselist[i]))              # now define the side effects @@ -800,19 +801,19 @@ def tex_emitter_core(target, source, env, graphics_extensions):                  for suffix in suffix_list[:-1]:                      env.SideEffect(file_name + suffix,target[0])                      if Verbose: -                        print "side effect tst :",file_name + suffix, " target is ",str(target[0]) +                        print("side effect tst :",file_name + suffix, " target is ",str(target[0]))                      env.Clean(target[0],file_name + suffix)      for aFile in aux_files:          aFile_base = SCons.Util.splitext(aFile)[0]          env.SideEffect(aFile_base + '.aux',target[0])          if Verbose: -            print "side effect aux :",aFile_base + '.aux' +            print("side effect aux :",aFile_base + '.aux')          env.Clean(target[0],aFile_base + '.aux')      # read fls file to get all other files that latex creates and will read on the next pass      # remove files from list that we explicitly dealt with above      if os.path.isfile(flsfilename): -        content = open(flsfilename, "rb").read() +        content = open(flsfilename, "r").read()          out_files = openout_re.findall(content)          myfiles = [auxfilename, logfilename, flsfilename, targetbase+'.dvi',targetbase+'.pdf']          for filename in out_files[:]: @@ -820,7 +821,7 @@ def tex_emitter_core(target, source, env, graphics_extensions):                  out_files.remove(filename)          env.SideEffect(out_files,target[0])          if Verbose: -            print "side effect fls :",out_files +            print("side effect fls :",out_files)          env.Clean(target[0],out_files)      return (target, source) @@ -840,7 +841,7 @@ def generate(env):      generate_common(env) -    import dvi +    from . import dvi      dvi.generate(env)      bld = env['BUILDERS']['DVI'] @@ -853,7 +854,7 @@ def generate_darwin(env):      except KeyError:          environ = {}          env['ENV'] = environ -     +      if (platform.system() == 'Darwin'):          try:              ospath = env['ENV']['PATHOSX'] diff --git a/src/engine/SCons/Tool/tex.xml b/src/engine/SCons/Tool/tex.xml index c269dba..87741c0 100644 --- a/src/engine/SCons/Tool/tex.xml +++ b/src/engine/SCons/Tool/tex.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/Tool/textfile.py b/src/engine/SCons/Tool/textfile.py index 3cea7eb..7303e06 100644 --- a/src/engine/SCons/Tool/textfile.py +++ b/src/engine/SCons/Tool/textfile.py @@ -1,6 +1,6 @@  # -*- python -*-  # -# 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 @@ -44,7 +44,7 @@ Textfile/Substfile builder for SCons.      is unpredictable whether the expansion will occur.  """ -__revision__ = "src/engine/SCons/Tool/textfile.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/textfile.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons @@ -53,7 +53,15 @@ import re  from SCons.Node import Node  from SCons.Node.Python import Value -from SCons.Util import is_String, is_Sequence, is_Dict +from SCons.Util import is_String, is_Sequence, is_Dict, to_bytes, PY3 + + +if PY3: +    TEXTFILE_FILE_WRITE_MODE = 'w' +else: +    TEXTFILE_FILE_WRITE_MODE = 'wb' + +LINESEP = '\n'  def _do_subst(node, subs):      """ @@ -64,62 +72,82 @@ def _do_subst(node, subs):      1.2345 and so forth.      """      contents = node.get_text_contents() -    if not subs: return contents -    for (k,v) in subs: -        contents = re.sub(k, v, contents) +    if subs: +        for (k, val) in subs: +            contents = re.sub(k, val, contents) + +    if 'b' in TEXTFILE_FILE_WRITE_MODE: +        try: +            contents = bytearray(contents, 'utf-8') +        except UnicodeDecodeError: +            # contents is already utf-8 encoded python 2 str i.e. a byte array +            contents = bytearray(contents) +      return contents +  def _action(target, source, env): +      # prepare the line separator      linesep = env['LINESEPARATOR']      if linesep is None: -        linesep = os.linesep +        linesep = LINESEP # os.linesep      elif is_String(linesep):          pass      elif isinstance(linesep, Value):          linesep = linesep.get_text_contents()      else: -        raise SCons.Errors.UserError( -                           'unexpected type/class for LINESEPARATOR: %s' -                                         % repr(linesep), None) +        raise SCons.Errors.UserError('unexpected type/class for LINESEPARATOR: %s' +                                     % repr(linesep), None) + +    if 'b' in TEXTFILE_FILE_WRITE_MODE: +        linesep = to_bytes(linesep)      # create a dictionary to use for the substitutions      if 'SUBST_DICT' not in env:          subs = None    # no substitutions      else: -        d = env['SUBST_DICT'] -        if is_Dict(d): -            d = list(d.items()) -        elif is_Sequence(d): +        subst_dict = env['SUBST_DICT'] +        if is_Dict(subst_dict): +            subst_dict = list(subst_dict.items()) +        elif is_Sequence(subst_dict):              pass          else:              raise SCons.Errors.UserError('SUBST_DICT must be dict or sequence')          subs = [] -        for (k,v) in d: -            if callable(v): -                v = v() -            if is_String(v): -                v = env.subst(v) +        for (k, value) in subst_dict: +            if callable(value): +                value = value() +            if is_String(value): +                value = env.subst(value)              else: -                v = str(v) -            subs.append((k,v)) +                value = str(value) +            subs.append((k, value))      # write the file      try: -        fd = open(target[0].get_path(), "wb") -    except (OSError,IOError), e: +        if SCons.Util.PY3: +            target_file = open(target[0].get_path(), TEXTFILE_FILE_WRITE_MODE, newline='') +        else: +            target_file = open(target[0].get_path(), TEXTFILE_FILE_WRITE_MODE) +    except (OSError, IOError):          raise SCons.Errors.UserError("Can't write target file %s" % target[0]) +      # separate lines by 'linesep' only if linesep is not empty      lsep = None -    for s in source: -        if lsep: fd.write(lsep) -        fd.write(_do_subst(s, subs)) +    for line in source: +        if lsep: +            target_file.write(lsep) + +        target_file.write(_do_subst(line, subs))          lsep = linesep -    fd.close() +    target_file.close() +  def _strfunc(target, source, env):      return "Creating '%s'" % target[0] +  def _convert_list_R(newlist, sources):      for elem in sources:          if is_Sequence(elem): @@ -128,6 +156,8 @@ def _convert_list_R(newlist, sources):              newlist.append(elem)          else:              newlist.append(Value(elem)) + +  def _convert_list(target, source, env):      if len(target) != 1:          raise SCons.Errors.UserError("Only one target file allowed") @@ -135,29 +165,31 @@ def _convert_list(target, source, env):      _convert_list_R(newlist, source)      return target, newlist +  _common_varlist = ['SUBST_DICT', 'LINESEPARATOR']  _text_varlist = _common_varlist + ['TEXTFILEPREFIX', 'TEXTFILESUFFIX']  _text_builder = SCons.Builder.Builder( -    action = SCons.Action.Action(_action, _strfunc, varlist = _text_varlist), -    source_factory = Value, -    emitter = _convert_list, -    prefix = '$TEXTFILEPREFIX', -    suffix = '$TEXTFILESUFFIX', -    ) +    action=SCons.Action.Action(_action, _strfunc, varlist=_text_varlist), +    source_factory=Value, +    emitter=_convert_list, +    prefix='$TEXTFILEPREFIX', +    suffix='$TEXTFILESUFFIX', +)  _subst_varlist = _common_varlist + ['SUBSTFILEPREFIX', 'TEXTFILESUFFIX']  _subst_builder = SCons.Builder.Builder( -    action = SCons.Action.Action(_action, _strfunc, varlist = _subst_varlist), -    source_factory = SCons.Node.FS.File, -    emitter = _convert_list, -    prefix = '$SUBSTFILEPREFIX', -    suffix = '$SUBSTFILESUFFIX', -    src_suffix = ['.in'], -    ) +    action=SCons.Action.Action(_action, _strfunc, varlist=_subst_varlist), +    source_factory=SCons.Node.FS.File, +    emitter=_convert_list, +    prefix='$SUBSTFILEPREFIX', +    suffix='$SUBSTFILESUFFIX', +    src_suffix=['.in'], +) +  def generate(env): -    env['LINESEPARATOR'] = os.linesep +    env['LINESEPARATOR'] = LINESEP # os.linesep      env['BUILDERS']['Textfile'] = _text_builder      env['TEXTFILEPREFIX'] = ''      env['TEXTFILESUFFIX'] = '.txt' @@ -165,6 +197,7 @@ def generate(env):      env['SUBSTFILEPREFIX'] = ''      env['SUBSTFILESUFFIX'] = '' +  def exists(env):      return 1 diff --git a/src/engine/SCons/Tool/textfile.xml b/src/engine/SCons/Tool/textfile.xml index b6fe30d..bca7232 100644 --- a/src/engine/SCons/Tool/textfile.xml +++ b/src/engine/SCons/Tool/textfile.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. @@ -150,7 +150,7 @@ and the result replaces the key.  env = Environment(tools = ['default', 'textfile'])  env['prefix'] = '/usr/bin' -script_dict = {'@prefix@': '/bin', @exec_prefix@: '$prefix'} +script_dict = {'@prefix@': '/bin', '@exec_prefix@': '$prefix'}  env.Substfile('script.in', SUBST_DICT = script_dict)  conf_dict = {'%VERSION%': '1.2.3', '%BASE%': 'MyProg'} diff --git a/src/engine/SCons/Tool/tlib.py b/src/engine/SCons/Tool/tlib.py index dd2721a..c0a755e 100644 --- a/src/engine/SCons/Tool/tlib.py +++ b/src/engine/SCons/Tool/tlib.py @@ -5,7 +5,7 @@ XXX  """  # -# 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 @@ -27,7 +27,7 @@ XXX  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/tlib.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/tlib.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Tool  import SCons.Tool.bcc32 diff --git a/src/engine/SCons/Tool/tlib.xml b/src/engine/SCons/Tool/tlib.xml index b0b7c02..cb15db3 100644 --- a/src/engine/SCons/Tool/tlib.xml +++ b/src/engine/SCons/Tool/tlib.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/Tool/wix.py b/src/engine/SCons/Tool/wix.py index 85b46e5..3ddfa84 100644 --- a/src/engine/SCons/Tool/wix.py +++ b/src/engine/SCons/Tool/wix.py @@ -8,7 +8,7 @@ selection method.  """  # -# 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 @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/wix.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/wix.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import SCons.Builder  import SCons.Action diff --git a/src/engine/SCons/Tool/wixTests.py b/src/engine/SCons/Tool/wixTests.py index de47a56..965ca57 100644 --- a/src/engine/SCons/Tool/wixTests.py +++ b/src/engine/SCons/Tool/wixTests.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/Tool/wixTests.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/wixTests.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import unittest  import os.path diff --git a/src/engine/SCons/Tool/xgettext.py b/src/engine/SCons/Tool/xgettext.py index b05df26..2e2934b 100644 --- a/src/engine/SCons/Tool/xgettext.py +++ b/src/engine/SCons/Tool/xgettext.py @@ -1,10 +1,10 @@ -""" xgettext tool  +""" xgettext tool  Tool specific initialization of `xgettext` tool.  """ -# 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  # "Software"), to deal in the Software without restriction, including @@ -12,10 +12,10 @@ Tool specific initialization of `xgettext` tool.  # 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 @@ -24,312 +24,335 @@ Tool specific initialization of `xgettext` tool.  # 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/Tool/xgettext.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/xgettext.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" +  #############################################################################  class _CmdRunner(object): -  """ Callabe object, which runs shell command storing its stdout and stderr to -  variables. It also provides `strfunction()` method, which shall be used by -  scons Action objects to print command string. """ - -  def __init__( self, command, commandstr = None): -    self.out = None -    self.err = None -    self.status = None -    self.command = command -    self.commandstr = commandstr - -  def __call__(self, target, source, env):  -    import SCons.Action -    import subprocess -    import os -    import sys -    kw = {  -      'stdin'  : 'devnull', -      'stdout' : subprocess.PIPE, -      'stderr' : subprocess.PIPE, -      'universal_newlines' : True, -      'shell'  : True -    } -    command = env.subst(self.command, target = target, source = source) -    proc = SCons.Action._subproc(env, command, **kw) -    self.out, self.err = proc.communicate() -    self.status = proc.wait() -    if self.err: sys.stderr.write(unicode(self.err)) -    return self.status - -  def strfunction(self, target, source, env): -    import os -    comstr = self.commandstr -    if env.subst(comstr, target = target, source = source) == "": -      comstr = self.command -    s = env.subst(comstr, target = target, source = source) -    return s +    """ Callable object, which runs shell command storing its stdout and stderr to +    variables. It also provides `strfunction()` method, which shall be used by +    scons Action objects to print command string. """ + +    def __init__(self, command, commandstr=None): +        self.out = None +        self.err = None +        self.status = None +        self.command = command +        self.commandstr = commandstr + +    def __call__(self, target, source, env): +        import SCons.Action +        import subprocess +        import os +        import sys +        kw = { +            'stdin': 'devnull', +            'stdout': subprocess.PIPE, +            'stderr': subprocess.PIPE, +            'universal_newlines': True, +            'shell': True +        } +        command = env.subst(self.command, target=target, source=source) +        proc = SCons.Action._subproc(env, command, **kw) +        self.out, self.err = proc.communicate() +        self.status = proc.wait() +        if self.err: +            sys.stderr.write(unicode(self.err)) +        return self.status + +    def strfunction(self, target, source, env): +        import os +        comstr = self.commandstr +        if env.subst(comstr, target=target, source=source) == "": +            comstr = self.command +        s = env.subst(comstr, target=target, source=source) +        return s + +  #############################################################################  #############################################################################  def _update_pot_file(target, source, env): -  """ Action function for `POTUpdate` builder """ -  import re -  import os -  import SCons.Action -  nop = lambda target, source, env : 0 - -  # Save scons cwd and os cwd (NOTE: they may be different. After the job, we -  # revert each one to its original state). -  save_cwd = env.fs.getcwd() -  save_os_cwd = os.getcwd() -  chdir = target[0].dir -  chdir_str = repr(chdir.get_abspath()) -  # Print chdir message (employ SCons.Action.Action for that. It knows better -  # than me how to to this correctly). -  env.Execute(SCons.Action.Action(nop, "Entering " + chdir_str)) -  # Go to target's directory and do our job -  env.fs.chdir(chdir, 1) # Go into target's directory -  try: -    cmd = _CmdRunner('$XGETTEXTCOM', '$XGETTEXTCOMSTR') -    action = SCons.Action.Action(cmd, strfunction=cmd.strfunction) -    status = action([ target[0] ], source, env) -  except: -    # Something went wrong. +    """ Action function for `POTUpdate` builder """ +    import re +    import os +    import SCons.Action +    nop = lambda target, source, env: 0 + +    # Save scons cwd and os cwd (NOTE: they may be different. After the job, we +    # revert each one to its original state). +    save_cwd = env.fs.getcwd() +    save_os_cwd = os.getcwd() +    chdir = target[0].dir +    chdir_str = repr(chdir.get_abspath()) +    # Print chdir message (employ SCons.Action.Action for that. It knows better +    # than me how to to this correctly). +    env.Execute(SCons.Action.Action(nop, "Entering " + chdir_str)) +    # Go to target's directory and do our job +    env.fs.chdir(chdir, 1)  # Go into target's directory +    try: +        cmd = _CmdRunner('$XGETTEXTCOM', '$XGETTEXTCOMSTR') +        action = SCons.Action.Action(cmd, strfunction=cmd.strfunction) +        status = action([target[0]], source, env) +    except: +        # Something went wrong. +        env.Execute(SCons.Action.Action(nop, "Leaving " + chdir_str)) +        # Revert working dirs to previous state and re-throw exception. +        env.fs.chdir(save_cwd, 0) +        os.chdir(save_os_cwd) +        raise +    # Print chdir message.      env.Execute(SCons.Action.Action(nop, "Leaving " + chdir_str)) -    # Revert working dirs to previous state and re-throw exception. +    # Revert working dirs to previous state.      env.fs.chdir(save_cwd, 0)      os.chdir(save_os_cwd) -    raise -  # Print chdir message. -  env.Execute(SCons.Action.Action(nop, "Leaving " + chdir_str)) -  # Revert working dirs to previous state. -  env.fs.chdir(save_cwd, 0) -  os.chdir(save_os_cwd) -  # If the command was not successfull, return error code. -  if status: return status -  -  new_content = cmd.out -  -  if not new_content: -    # When xgettext finds no internationalized messages, no *.pot is created -    # (because we don't want to bother translators with empty POT files). -    needs_update = False -    explain = "no internationalized messages encountered" -  else: -    if target[0].exists(): -      # If the file already exists, it's left unaltered unless its messages -      # are outdated (w.r.t. to these recovered by xgettext from sources). -      old_content = target[0].get_text_contents() -      re_cdate = re.compile(r'^"POT-Creation-Date: .*"$[\r\n]?', re.M) -      old_content_nocdate = re.sub(re_cdate,"",old_content) -      new_content_nocdate = re.sub(re_cdate,"",new_content) -      if(old_content_nocdate == new_content_nocdate): -        # Messages are up-to-date +    # If the command was not successfull, return error code. +    if status: return status + +    new_content = cmd.out + +    if not new_content: +        # When xgettext finds no internationalized messages, no *.pot is created +        # (because we don't want to bother translators with empty POT files).          needs_update = False -        explain = "messages in file found to be up-to-date" -      else: -        # Messages are outdated -        needs_update = True -        explain = "messages in file were outdated" +        explain = "no internationalized messages encountered"      else: -      # No POT file found, create new one -      needs_update = True -      explain = "new file" -  if needs_update: -    # Print message employing SCons.Action.Action for that. -    msg = "Writing " + repr(str(target[0])) + " (" + explain + ")" -    env.Execute(SCons.Action.Action(nop, msg)) -    f = open(str(target[0]),"w") -    f.write(new_content) -    f.close() -    return 0 -  else: -    # Print message employing SCons.Action.Action for that. -    msg = "Not writing " + repr(str(target[0])) + " (" + explain + ")" -    env.Execute(SCons.Action.Action(nop, msg)) -    return 0  +        if target[0].exists(): +            # If the file already exists, it's left unaltered unless its messages +            # are outdated (w.r.t. to these recovered by xgettext from sources). +            old_content = target[0].get_text_contents() +            re_cdate = re.compile(r'^"POT-Creation-Date: .*"$[\r\n]?', re.M) +            old_content_nocdate = re.sub(re_cdate, "", old_content) +            new_content_nocdate = re.sub(re_cdate, "", new_content) +            if (old_content_nocdate == new_content_nocdate): +                # Messages are up-to-date +                needs_update = False +                explain = "messages in file found to be up-to-date" +            else: +                # Messages are outdated +                needs_update = True +                explain = "messages in file were outdated" +        else: +            # No POT file found, create new one +            needs_update = True +            explain = "new file" +    if needs_update: +        # Print message employing SCons.Action.Action for that. +        msg = "Writing " + repr(str(target[0])) + " (" + explain + ")" +        env.Execute(SCons.Action.Action(nop, msg)) +        f = open(str(target[0]), "w") +        f.write(new_content) +        f.close() +        return 0 +    else: +        # Print message employing SCons.Action.Action for that. +        msg = "Not writing " + repr(str(target[0])) + " (" + explain + ")" +        env.Execute(SCons.Action.Action(nop, msg)) +        return 0 + +  #############################################################################  #############################################################################  from SCons.Builder import BuilderBase + +  #############################################################################  class _POTBuilder(BuilderBase): -  def _execute(self, env, target, source, *args): -    if not target: -      if env.has_key('POTDOMAIN') and env['POTDOMAIN']: -        domain = env['POTDOMAIN'] -      else: -        domain = 'messages' -      target = [ domain ] -    return BuilderBase._execute(self, env, target, source, *args) +    def _execute(self, env, target, source, *args): +        if not target: +            if 'POTDOMAIN' in env and env['POTDOMAIN']: +                domain = env['POTDOMAIN'] +            else: +                domain = 'messages' +            target = [domain] +        return BuilderBase._execute(self, env, target, source, *args) + +  #############################################################################  ############################################################################# -def _scan_xgettext_from_files(target, source, env, files = None, path = None): -  """ Parses `POTFILES.in`-like file and returns list of extracted file names. -  """ -  import re -  import SCons.Util -  import SCons.Node.FS - -  if files is None: +def _scan_xgettext_from_files(target, source, env, files=None, path=None): +    """ Parses `POTFILES.in`-like file and returns list of extracted file names. +    """ +    import re +    import SCons.Util +    import SCons.Node.FS + +    if files is None: +        return 0 +    if not SCons.Util.is_List(files): +        files = [files] + +    if path is None: +        if 'XGETTEXTPATH' in env: +            path = env['XGETTEXTPATH'] +        else: +            path = [] +    if not SCons.Util.is_List(path): +        path = [path] + +    path = SCons.Util.flatten(path) + +    dirs = () +    for p in path: +        if not isinstance(p, SCons.Node.FS.Base): +            if SCons.Util.is_String(p): +                p = env.subst(p, source=source, target=target) +            p = env.arg2nodes(p, env.fs.Dir) +        dirs += tuple(p) +    # cwd is the default search path (when no path is defined by user) +    if not dirs: +        dirs = (env.fs.getcwd(),) + +    # Parse 'POTFILE.in' files. +    re_comment = re.compile(r'^#[^\n\r]*$\r?\n?', re.M) +    re_emptyln = re.compile(r'^[ \t\r]*$\r?\n?', re.M) +    re_trailws = re.compile(r'[ \t\r]+$') +    for f in files: +        # Find files in search path $XGETTEXTPATH +        if isinstance(f, SCons.Node.FS.Base) and f.rexists(): +            contents = f.get_text_contents() +            contents = re_comment.sub("", contents) +            contents = re_emptyln.sub("", contents) +            contents = re_trailws.sub("", contents) +            depnames = contents.splitlines() +            for depname in depnames: +                depfile = SCons.Node.FS.find_file(depname, dirs) +                if not depfile: +                    depfile = env.arg2nodes(depname, dirs[0].File) +                env.Depends(target, depfile)      return 0 -  if not SCons.Util.is_List(files): -    files = [ files ] -  if path is None: -    if env.has_key('XGETTEXTPATH'): -      path = env['XGETTEXTPATH'] -    else: -      path = [] -  if not SCons.Util.is_List(path): -    path = [ path ] - -  path = SCons.Util.flatten(path) - -  dirs = () -  for p in path: -    if not isinstance(p, SCons.Node.FS.Base): -      if SCons.Util.is_String(p): -        p = env.subst(p, source = source, target = target) -      p = env.arg2nodes(p, env.fs.Dir) -    dirs += tuple(p) -  # cwd is the default search path (when no path is defined by user) -  if not dirs: -    dirs = (env.fs.getcwd(),) - -  # Parse 'POTFILE.in' files. -  re_comment = re.compile(r'^#[^\n\r]*$\r?\n?', re.M) -  re_emptyln = re.compile(r'^[ \t\r]*$\r?\n?', re.M) -  re_trailws = re.compile(r'[ \t\r]+$') -  for f in files: -    # Find files in search path $XGETTEXTPATH -    if isinstance(f, SCons.Node.FS.Base) and f.rexists(): -      contents = f.get_text_contents() -      contents = re_comment.sub("", contents) -      contents = re_emptyln.sub("", contents) -      contents = re_trailws.sub("", contents) -      depnames = contents.splitlines() -      for depname in depnames:  -        depfile = SCons.Node.FS.find_file(depname, dirs) -        if not depfile: -          depfile = env.arg2nodes(depname, dirs[0].File) -        env.Depends(target, depfile) -  return 0 +  #############################################################################  #############################################################################  def _pot_update_emitter(target, source, env): -  """ Emitter function for `POTUpdate` builder """ -  from SCons.Tool.GettextCommon import _POTargetFactory -  import SCons.Util -  import SCons.Node.FS - -  if env.has_key('XGETTEXTFROM'):  -    xfrom = env['XGETTEXTFROM'] -  else: +    """ Emitter function for `POTUpdate` builder """ +    from SCons.Tool.GettextCommon import _POTargetFactory +    import SCons.Util +    import SCons.Node.FS + +    if 'XGETTEXTFROM' in env: +        xfrom = env['XGETTEXTFROM'] +    else: +        return target, source +    if not SCons.Util.is_List(xfrom): +        xfrom = [xfrom] + +    xfrom = SCons.Util.flatten(xfrom) + +    # Prepare list of 'POTFILE.in' files. +    files = [] +    for xf in xfrom: +        if not isinstance(xf, SCons.Node.FS.Base): +            if SCons.Util.is_String(xf): +                # Interpolate variables in strings +                xf = env.subst(xf, source=source, target=target) +            xf = env.arg2nodes(xf) +        files.extend(xf) +    if files: +        env.Depends(target, files) +        _scan_xgettext_from_files(target, source, env, files)      return target, source -  if not SCons.Util.is_List(xfrom): -    xfrom = [ xfrom ] - -  xfrom = SCons.Util.flatten(xfrom) -   -  # Prepare list of 'POTFILE.in' files. -  files = [] -  for xf in xfrom: -    if not isinstance(xf, SCons.Node.FS.Base): -      if SCons.Util.is_String(xf): -        # Interpolate variables in strings  -        xf = env.subst(xf, source = source, target = target) -      xf = env.arg2nodes(xf) -    files.extend(xf) -  if files: -    env.Depends(target, files) -    _scan_xgettext_from_files(target, source, env, files) -  return target, source + +  #############################################################################  #############################################################################  from SCons.Environment import _null + +  #############################################################################  def _POTUpdateBuilderWrapper(env, target=None, source=_null, **kw): -  return env._POTUpdateBuilder(target, source, **kw) +    return env._POTUpdateBuilder(target, source, **kw) + +  #############################################################################  #############################################################################  def _POTUpdateBuilder(env, **kw): -  """ Creates `POTUpdate` builder object """ -  import SCons.Action -  from SCons.Tool.GettextCommon import _POTargetFactory -  kw['action'] = SCons.Action.Action(_update_pot_file, None) -  kw['suffix'] = '$POTSUFFIX' -  kw['target_factory'] = _POTargetFactory(env, alias='$POTUPDATE_ALIAS').File -  kw['emitter'] = _pot_update_emitter -  return _POTBuilder(**kw) +    """ Creates `POTUpdate` builder object """ +    import SCons.Action +    from SCons.Tool.GettextCommon import _POTargetFactory +    kw['action'] = SCons.Action.Action(_update_pot_file, None) +    kw['suffix'] = '$POTSUFFIX' +    kw['target_factory'] = _POTargetFactory(env, alias='$POTUPDATE_ALIAS').File +    kw['emitter'] = _pot_update_emitter +    return _POTBuilder(**kw) + +  #############################################################################  ############################################################################# -def generate(env,**kw): -  """ Generate `xgettext` tool """ -  import SCons.Util -  from SCons.Tool.GettextCommon import RPaths, _detect_xgettext - -  try: -    env['XGETTEXT'] = _detect_xgettext(env) -  except: -    env['XGETTEXT'] = 'xgettext'  -  # NOTE: sources="$SOURCES" would work as well. However, we use following -  # construction to convert absolute paths provided by scons onto paths -  # relative to current working dir. Note, that scons expands $SOURCE(S) to -  # absolute paths for sources $SOURCE(s) outside of current subtree (e.g. in -  # "../"). With source=$SOURCE these absolute paths would be written to the -  # resultant *.pot file (and its derived *.po files) as references to lines in -  # source code (e.g. referring lines in *.c files). Such references would be -  # correct (e.g. in poedit) only on machine on which *.pot was generated and -  # would be of no use on other hosts (having a copy of source code located -  # in different place in filesystem). -  sources = '$( ${_concat( "", SOURCES, "", __env__, XgettextRPaths, TARGET' \ -    + ', SOURCES)} $)' - -  # NOTE: the output from $XGETTEXTCOM command must go to stdout, not to a file. -  # This is required by the POTUpdate builder's action. -  xgettextcom = '$XGETTEXT $XGETTEXTFLAGS $_XGETTEXTPATHFLAGS' \ -    + ' $_XGETTEXTFROMFLAGS -o - ' + sources - -  xgettextpathflags = '$( ${_concat( XGETTEXTPATHPREFIX, XGETTEXTPATH' \ -    + ', XGETTEXTPATHSUFFIX, __env__, RDirs, TARGET, SOURCES)} $)' -  xgettextfromflags = '$( ${_concat( XGETTEXTFROMPREFIX, XGETTEXTFROM' \ -    + ', XGETTEXTFROMSUFFIX, __env__, target=TARGET, source=SOURCES)} $)' - -  env.SetDefault( -    _XGETTEXTDOMAIN     = '${TARGET.filebase}', -    XGETTEXTFLAGS       = [ ], -    XGETTEXTCOM         = xgettextcom, -    XGETTEXTCOMSTR      = '', -    XGETTEXTPATH        = [ ], -    XGETTEXTPATHPREFIX   = '-D', -    XGETTEXTPATHSUFFIX   = '', -    XGETTEXTFROM        = None, -    XGETTEXTFROMPREFIX   = '-f', -    XGETTEXTFROMSUFFIX   = '', -   _XGETTEXTPATHFLAGS    = xgettextpathflags, -   _XGETTEXTFROMFLAGS   = xgettextfromflags, -    POTSUFFIX           =  ['.pot'], -    POTUPDATE_ALIAS     = 'pot-update', -    XgettextRPaths      = RPaths(env) -  ) -  env.Append( BUILDERS = { -    '_POTUpdateBuilder' : _POTUpdateBuilder(env) -  } ) -  env.AddMethod(_POTUpdateBuilderWrapper, 'POTUpdate') -  env.AlwaysBuild(env.Alias('$POTUPDATE_ALIAS')) +def generate(env, **kw): +    """ Generate `xgettext` tool """ +    import SCons.Util +    from SCons.Tool.GettextCommon import RPaths, _detect_xgettext + +    try: +        env['XGETTEXT'] = _detect_xgettext(env) +    except: +        env['XGETTEXT'] = 'xgettext' +    # NOTE: sources="$SOURCES" would work as well. However, we use following +    # construction to convert absolute paths provided by scons onto paths +    # relative to current working dir. Note, that scons expands $SOURCE(S) to +    # absolute paths for sources $SOURCE(s) outside of current subtree (e.g. in +    # "../"). With source=$SOURCE these absolute paths would be written to the +    # resultant *.pot file (and its derived *.po files) as references to lines in +    # source code (e.g. referring lines in *.c files). Such references would be +    # correct (e.g. in poedit) only on machine on which *.pot was generated and +    # would be of no use on other hosts (having a copy of source code located +    # in different place in filesystem). +    sources = '$( ${_concat( "", SOURCES, "", __env__, XgettextRPaths, TARGET' \ +              + ', SOURCES)} $)' + +    # NOTE: the output from $XGETTEXTCOM command must go to stdout, not to a file. +    # This is required by the POTUpdate builder's action. +    xgettextcom = '$XGETTEXT $XGETTEXTFLAGS $_XGETTEXTPATHFLAGS' \ +                  + ' $_XGETTEXTFROMFLAGS -o - ' + sources + +    xgettextpathflags = '$( ${_concat( XGETTEXTPATHPREFIX, XGETTEXTPATH' \ +                        + ', XGETTEXTPATHSUFFIX, __env__, RDirs, TARGET, SOURCES)} $)' +    xgettextfromflags = '$( ${_concat( XGETTEXTFROMPREFIX, XGETTEXTFROM' \ +                        + ', XGETTEXTFROMSUFFIX, __env__, target=TARGET, source=SOURCES)} $)' + +    env.SetDefault( +        _XGETTEXTDOMAIN='${TARGET.filebase}', +        XGETTEXTFLAGS=[], +        XGETTEXTCOM=xgettextcom, +        XGETTEXTCOMSTR='', +        XGETTEXTPATH=[], +        XGETTEXTPATHPREFIX='-D', +        XGETTEXTPATHSUFFIX='', +        XGETTEXTFROM=None, +        XGETTEXTFROMPREFIX='-f', +        XGETTEXTFROMSUFFIX='', +        _XGETTEXTPATHFLAGS=xgettextpathflags, +        _XGETTEXTFROMFLAGS=xgettextfromflags, +        POTSUFFIX=['.pot'], +        POTUPDATE_ALIAS='pot-update', +        XgettextRPaths=RPaths(env) +    ) +    env.Append(BUILDERS={ +        '_POTUpdateBuilder': _POTUpdateBuilder(env) +    }) +    env.AddMethod(_POTUpdateBuilderWrapper, 'POTUpdate') +    env.AlwaysBuild(env.Alias('$POTUPDATE_ALIAS')) + +  #############################################################################  #############################################################################  def exists(env): -  """ Check, whether the tool exists """ -  from SCons.Tool.GettextCommon import _xgettext_exists -  try: -    return _xgettext_exists(env) -  except: -    return False +    """ Check, whether the tool exists """ +    from SCons.Tool.GettextCommon import _xgettext_exists +    try: +        return _xgettext_exists(env) +    except: +        return False +  #############################################################################  # Local Variables: diff --git a/src/engine/SCons/Tool/xgettext.xml b/src/engine/SCons/Tool/xgettext.xml index 6937bd3..0b68c14 100644 --- a/src/engine/SCons/Tool/xgettext.xml +++ b/src/engine/SCons/Tool/xgettext.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/Tool/yacc.py b/src/engine/SCons/Tool/yacc.py index a2fa83c..4f9fbc2 100644 --- a/src/engine/SCons/Tool/yacc.py +++ b/src/engine/SCons/Tool/yacc.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/yacc.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/yacc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os.path diff --git a/src/engine/SCons/Tool/yacc.xml b/src/engine/SCons/Tool/yacc.xml index 00ad40b..6bdbd53 100644 --- a/src/engine/SCons/Tool/yacc.xml +++ b/src/engine/SCons/Tool/yacc.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/Tool/zip.py b/src/engine/SCons/Tool/zip.py index 7cfea31..0f6a8dd 100644 --- a/src/engine/SCons/Tool/zip.py +++ b/src/engine/SCons/Tool/zip.py @@ -9,7 +9,7 @@ selection method.  """  # -# 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 @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/zip.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog" +__revision__ = "src/engine/SCons/Tool/zip.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"  import os.path @@ -40,31 +40,23 @@ import SCons.Defaults  import SCons.Node.FS  import SCons.Util -try: -    import zipfile -    internal_zip = 1 -except ImportError: -    internal_zip = 0 - -if internal_zip: -    zipcompression = zipfile.ZIP_DEFLATED -    def zip(target, source, env): -        compression = env.get('ZIPCOMPRESSION', 0) -        zf = zipfile.ZipFile(str(target[0]), 'w', compression) -        for s in source: -            if s.isdir(): -                for dirpath, dirnames, filenames in os.walk(str(s)): -                    for fname in filenames: -                        path = os.path.join(dirpath, fname) -                        if os.path.isfile(path): -                            zf.write(path, os.path.relpath(path, str(env.get('ZIPROOT', '')))) -            else: -                zf.write(str(s), os.path.relpath(str(s), str(env.get('ZIPROOT', '')))) -        zf.close() -else: -    zipcompression = 0 -    zip = "$ZIP $ZIPFLAGS ${TARGET.abspath} $SOURCES" +import zipfile +zipcompression = zipfile.ZIP_DEFLATED +def zip(target, source, env): +    compression = env.get('ZIPCOMPRESSION', 0) +    zf = zipfile.ZipFile(str(target[0]), 'w', compression) +    for s in source: +        if s.isdir(): +            for dirpath, dirnames, filenames in os.walk(str(s)): +                for fname in filenames: +                    path = os.path.join(dirpath, fname) +                    if os.path.isfile(path): + +                        zf.write(path, os.path.relpath(path, str(env.get('ZIPROOT', '')))) +        else: +            zf.write(str(s), os.path.relpath(str(s), str(env.get('ZIPROOT', '')))) +    zf.close()  zipAction = SCons.Action.Action(zip, varlist=['ZIPCOMPRESSION']) @@ -91,7 +83,7 @@ def generate(env):      env['ZIPROOT']    = SCons.Util.CLVar('')  def exists(env): -    return internal_zip or env.Detect('zip') +    return True  # Local Variables:  # tab-width:4 diff --git a/src/engine/SCons/Tool/zip.xml b/src/engine/SCons/Tool/zip.xml index 9d3494e..82eb61a 100644 --- a/src/engine/SCons/Tool/zip.xml +++ b/src/engine/SCons/Tool/zip.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.  | 
