diff options
author | Tobias Markmann <tm@ayena.de> | 2018-07-13 15:20:36 (GMT) |
---|---|---|
committer | Tobias Markmann <tm@ayena.de> | 2018-09-26 14:05:36 (GMT) |
commit | 1536284a15743f6ec41d3230177a24d245158a9d (patch) | |
tree | 21216d18d93ddfc620e6b36dc28428c5d5b71775 /3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/common.py | |
parent | 091f6e520694360a0407ab0cf3bb036fb461e6e3 (diff) | |
download | swift-1536284a15743f6ec41d3230177a24d245158a9d.zip swift-1536284a15743f6ec41d3230177a24d245158a9d.tar.bz2 |
Update SCons in 3rdParty from 2.4.0 to 3.0.1
This also has our scons patch in 3rdParty/SCons applied.
Test-Information:
Builds with unit tests on macOS 10.13.6.
Change-Id: I25d3662eeec27a76dab10d501ba46dc16f0bef4b
Diffstat (limited to '3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/common.py')
-rw-r--r-- | 3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/common.py | 260 |
1 files changed, 0 insertions, 260 deletions
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/common.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/common.py deleted file mode 100644 index 60d7d40..0000000 --- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/common.py +++ /dev/null @@ -1,260 +0,0 @@ -# -# Copyright (c) 2001 - 2015 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/MSCommon/common.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog" - -__doc__ = """ -Common helper functions for working with the Microsoft tool chain. -""" - -import copy -import os -import subprocess -import re - -import SCons.Util - - -logfile = os.environ.get('SCONS_MSCOMMON_DEBUG') -if logfile == '-': - def debug(x): - print x -elif logfile: - try: - import logging - except ImportError: - debug = lambda x: open(logfile, 'a').write(x + '\n') - else: - logging.basicConfig(filename=logfile, level=logging.DEBUG) - debug = logging.debug -else: - debug = lambda x: None - - -_is_win64 = None - -def is_win64(): - """Return true if running on windows 64 bits. - - Works whether python itself runs in 64 bits or 32 bits.""" - # Unfortunately, python does not provide a useful way to determine - # if the underlying Windows OS is 32-bit or 64-bit. Worse, whether - # the Python itself is 32-bit or 64-bit affects what it returns, - # so nothing in sys.* or os.* help. - - # Apparently the best solution is to use env vars that Windows - # sets. If PROCESSOR_ARCHITECTURE is not x86, then the python - # process is running in 64 bit mode (on a 64-bit OS, 64-bit - # hardware, obviously). - # If this python is 32-bit but the OS is 64, Windows will set - # ProgramW6432 and PROCESSOR_ARCHITEW6432 to non-null. - # (Checking for HKLM\Software\Wow6432Node in the registry doesn't - # work, because some 32-bit installers create it.) - global _is_win64 - if _is_win64 is None: - # 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': - _is_win64 = True - if os.environ.get('PROCESSOR_ARCHITEW6432'): - _is_win64 = True - if os.environ.get('ProgramW6432'): - _is_win64 = True - return _is_win64 - - -def read_reg(value): - return SCons.Util.RegGetValue(SCons.Util.HKEY_LOCAL_MACHINE, value)[0] - -def has_reg(value): - """Return True if the given key exists in HKEY_LOCAL_MACHINE, False - otherwise.""" - try: - SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, value) - ret = True - except WindowsError: - ret = False - return ret - -# Functions for fetching environment variable settings from batch files. - -def normalize_env(env, keys, force=False): - """Given a dictionary representing a shell environment, add the variables - from os.environ needed for the processing of .bat files; the keys are - controlled by the keys argument. - - It also makes sure the environment values are correctly encoded. - - If force=True, then all of the key values that exist are copied - into the returned dictionary. If force=false, values are only - copied if the key does not already exist in the copied dictionary. - - Note: the environment is copied.""" - normenv = {} - if env: - for k in env.keys(): - normenv[k] = copy.deepcopy(env[k]).encode('mbcs') - - for k in keys: - if k in os.environ and (force or not k in normenv): - normenv[k] = os.environ[k].encode('mbcs') - - # 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") - - if sys32_dir not in normenv['PATH']: - normenv['PATH'] = normenv['PATH'] + os.pathsep + sys32_dir - - debug("PATH: %s"%normenv['PATH']) - - return normenv - -def get_output(vcbat, args = None, env = None): - """Parse the output of given bat file, with given args.""" - - if env is None: - # Create a blank environment, for use in launching the tools - env = SCons.Environment.Environment(tools=[]) - - # TODO: This is a hard-coded list of the variables that (may) need - # to be imported from os.environ[] for v[sc]*vars*.bat file - # 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 = [ - '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. - 'VS110COMNTOOLS', - 'VS100COMNTOOLS', - 'VS90COMNTOOLS', - 'VS80COMNTOOLS', - 'VS71COMNTOOLS', - 'VS70COMNTOOLS', - 'VS60COMNTOOLS', - ] - env['ENV'] = normalize_env(env['ENV'], 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) - else: - debug("Calling '%s'" % vcbat) - popen = SCons.Action._subproc(env, - '"%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 - # and won't work under Pythons not built with threading. - stdout = popen.stdout.read() - stderr = popen.stderr.read() - - # Extra debug logic, uncomment if necessar -# debug('get_output():stdout:%s'%stdout) -# debug('get_output():stderr:%s'%stderr) - - if stderr: - # TODO: find something better to do with stderr; - # this at least prevents errors from getting swallowed. - import sys - sys.stderr.write(stderr) - if popen.wait() != 0: - raise IOError(stderr.decode("mbcs")) - - output = stdout.decode("mbcs") - return output - -def parse_output(output, keep = ("INCLUDE", "LIB", "LIBPATH", "PATH")): - # 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 - rdk = {} - for i in keep: - 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: - # Do not add empty paths (when a var ends with ;) - if p: - p = p.encode('mbcs') - # 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) - - for line in output.splitlines(): - for k,v in rdk.items(): - m = v.match(line) - if m: - add_env(m, k) - - return dkeep - -# TODO(sgk): unused -def output_to_dict(output): - """Given an output string, parse it to find env variables. - - Return a dict where keys are variables names, and values their content""" - envlinem = re.compile(r'^([a-zA-z0-9]+)=([\S\s]*)$') - parsedenv = {} - for line in output.splitlines(): - m = envlinem.match(line) - if m: - parsedenv[m.group(1)] = m.group(2) - return parsedenv - -# TODO(sgk): unused -def get_new(l1, l2): - """Given two list l1 and l2, return the items in l2 which are not in l1. - Order is maintained.""" - - # We don't try to be smart: lists are small, and this is not the bottleneck - # is any case - new = [] - for i in l2: - if i not in l1: - new.append(i) - - return new - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: |