summaryrefslogtreecommitdiffstats
path: root/SCons/Environment.py
diff options
context:
space:
mode:
authorWilliam Deegan <bill@baddogconsulting.com>2020-12-12 23:15:29 (GMT)
committerGitHub <noreply@github.com>2020-12-12 23:15:29 (GMT)
commite96607c1dd670e37dc9352c466c3d0b8f2670d88 (patch)
treeeffedd562466baf9483e4e6ad4d28cef98ba11b7 /SCons/Environment.py
parenta28a7fed0cd8006756e0984478709aea5f9653a9 (diff)
parent2a764cbc646e633cef006ac9fc89f945a1cb44bd (diff)
downloadSCons-e96607c1dd670e37dc9352c466c3d0b8f2670d88.zip
SCons-e96607c1dd670e37dc9352c466c3d0b8f2670d88.tar.gz
SCons-e96607c1dd670e37dc9352c466c3d0b8f2670d88.tar.bz2
Merge branch 'master' into topic/grossag/newhashes
Diffstat (limited to 'SCons/Environment.py')
-rw-r--r--SCons/Environment.py210
1 files changed, 114 insertions, 96 deletions
diff --git a/SCons/Environment.py b/SCons/Environment.py
index 0bf5079..9f280e0 100644
--- a/SCons/Environment.py
+++ b/SCons/Environment.py
@@ -53,9 +53,27 @@ import SCons.SConf
import SCons.SConsign
import SCons.Subst
import SCons.Tool
-import SCons.Util
-from SCons.Util import MethodWrapper
import SCons.Warnings
+from SCons.Util import (
+ AppendPath,
+ CLVar,
+ LogicalLines,
+ MethodWrapper,
+ PrependPath,
+ Split,
+ WhereIs,
+ flatten,
+ is_Dict,
+ is_List,
+ is_Sequence,
+ is_String,
+ is_Tuple,
+ md5,
+ semi_deepcopy,
+ semi_deepcopy_dict,
+ to_String_for_subst,
+ uniquer_hashables,
+)
class _Null:
pass
@@ -69,18 +87,17 @@ _warn_target_signatures_deprecated = True
CleanTargets = {}
CalculatorArgs = {}
-semi_deepcopy = SCons.Util.semi_deepcopy
-semi_deepcopy_dict = SCons.Util.semi_deepcopy_dict
-
def alias_builder(env, target, source):
pass
-AliasBuilder = SCons.Builder.Builder(action = alias_builder,
- target_factory = SCons.Node.Alias.default_ans.Alias,
- source_factory = SCons.Node.FS.Entry,
- multi = 1,
- is_explicit = None,
- name='AliasBuilder')
+AliasBuilder = SCons.Builder.Builder(
+ action=alias_builder,
+ target_factory=SCons.Node.Alias.default_ans.Alias,
+ source_factory=SCons.Node.FS.Entry,
+ multi=True,
+ is_explicit=None,
+ name='AliasBuilder',
+)
def apply_tools(env, tools, toolpath):
# Store the toolpath in the Environment.
@@ -91,7 +108,7 @@ def apply_tools(env, tools, toolpath):
return
# Filter out null tools from the list.
for tool in [_f for _f in tools if _f]:
- if SCons.Util.is_List(tool) or isinstance(tool, tuple):
+ if is_List(tool) or isinstance(tool, tuple):
toolname = tool[0]
toolargs = tool[1] # should be a dict of kw args
tool = env.Tool(toolname, **toolargs)
@@ -191,7 +208,7 @@ def _delete_duplicates(l, keep_last):
# Note: MethodWrapper moved to SCons.Util as it was needed there
# and otherwise we had a circular import problem.
-class BuilderWrapper(SCons.Util.MethodWrapper):
+class BuilderWrapper(MethodWrapper):
"""
A MethodWrapper subclass that that associates an environment with
a Builder.
@@ -214,9 +231,9 @@ class BuilderWrapper(SCons.Util.MethodWrapper):
if source is _null:
source = target
target = None
- if target is not None and not SCons.Util.is_List(target):
+ if target is not None and not is_List(target):
target = [target]
- if source is not None and not SCons.Util.is_List(source):
+ if source is not None and not is_List(source):
source = [source]
return super().__call__(target, source, *args, **kw)
@@ -431,24 +448,24 @@ class SubstitutionEnvironment:
if not args:
return []
- args = SCons.Util.flatten(args)
+ args = flatten(args)
nodes = []
for v in args:
- if SCons.Util.is_String(v):
+ if is_String(v):
n = None
for l in lookup_list:
n = l(v)
if n is not None:
break
if n is not None:
- if SCons.Util.is_String(n):
+ if is_String(n):
# n = self.subst(n, raw=1, **kw)
kw['raw'] = 1
n = self.subst(n, **kw)
if node_factory:
n = node_factory(n)
- if SCons.Util.is_List(n):
+ if is_List(n):
nodes.extend(n)
else:
nodes.append(n)
@@ -456,7 +473,7 @@ class SubstitutionEnvironment:
# v = node_factory(self.subst(v, raw=1, **kw))
kw['raw'] = 1
v = node_factory(self.subst(v, **kw))
- if SCons.Util.is_List(v):
+ if is_List(v):
nodes.extend(v)
else:
nodes.append(v)
@@ -492,7 +509,7 @@ class SubstitutionEnvironment:
nkw = {}
for k, v in kw.items():
k = self.subst(k, raw, target, source)
- if SCons.Util.is_String(v):
+ if is_String(v):
v = self.subst(v, raw, target, source)
nkw[k] = v
return nkw
@@ -511,7 +528,7 @@ class SubstitutionEnvironment:
"""Substitute a path list, turning EntryProxies into Nodes
and leaving Nodes (and other objects) as-is."""
- if not SCons.Util.is_List(path):
+ if not is_List(path):
path = [path]
def s(obj):
@@ -524,23 +541,23 @@ class SubstitutionEnvironment:
try:
get = obj.get
except AttributeError:
- obj = SCons.Util.to_String_for_subst(obj)
+ obj = to_String_for_subst(obj)
else:
obj = get()
return obj
r = []
for p in path:
- if SCons.Util.is_String(p):
+ if is_String(p):
p = self.subst(p, target=target, source=source, conv=s)
- if SCons.Util.is_List(p):
+ if is_List(p):
if len(p) == 1:
p = p[0]
else:
# We have an object plus a string, or multiple
# objects that we need to smush together. No choice
# but to make them into a string.
- p = ''.join(map(SCons.Util.to_String_for_subst, p))
+ p = ''.join(map(to_String_for_subst, p))
else:
p = s(p)
r.append(p)
@@ -558,7 +575,7 @@ class SubstitutionEnvironment:
}
# if the command is a list, assume it's been quoted
# othewise force a shell
- if not SCons.Util.is_List(command): kw['shell'] = True
+ if not is_List(command): kw['shell'] = True
# run constructed command
p = SCons.Action._subproc(self, command, **kw)
out,err = p.communicate()
@@ -628,18 +645,18 @@ class SubstitutionEnvironment:
the result of that evaluation is then added to the dict.
"""
dict = {
- 'ASFLAGS' : SCons.Util.CLVar(''),
- 'CFLAGS' : SCons.Util.CLVar(''),
- 'CCFLAGS' : SCons.Util.CLVar(''),
- 'CXXFLAGS' : SCons.Util.CLVar(''),
+ 'ASFLAGS' : CLVar(''),
+ 'CFLAGS' : CLVar(''),
+ 'CCFLAGS' : CLVar(''),
+ 'CXXFLAGS' : CLVar(''),
'CPPDEFINES' : [],
- 'CPPFLAGS' : SCons.Util.CLVar(''),
+ 'CPPFLAGS' : CLVar(''),
'CPPPATH' : [],
- 'FRAMEWORKPATH' : SCons.Util.CLVar(''),
- 'FRAMEWORKS' : SCons.Util.CLVar(''),
+ 'FRAMEWORKPATH' : CLVar(''),
+ 'FRAMEWORKS' : CLVar(''),
'LIBPATH' : [],
'LIBS' : [],
- 'LINKFLAGS' : SCons.Util.CLVar(''),
+ 'LINKFLAGS' : CLVar(''),
'RPATH' : [],
}
@@ -648,7 +665,7 @@ class SubstitutionEnvironment:
if not arg:
return
- if not SCons.Util.is_String(arg):
+ if not is_String(arg):
for t in arg: do_parse(t)
return
@@ -818,7 +835,7 @@ class SubstitutionEnvironment:
unique: merge flags rather than appending (default: True)
"""
- if not SCons.Util.is_Dict(args):
+ if not is_Dict(args):
args = self.ParseFlags(args)
if not unique:
@@ -828,7 +845,7 @@ class SubstitutionEnvironment:
for key, value in args.items():
if not value:
continue
- value = SCons.Util.Split(value)
+ value = Split(value)
try:
orig = self[key]
except KeyError:
@@ -952,7 +969,7 @@ class Base(SubstitutionEnvironment):
platform = self._dict.get('PLATFORM', None)
if platform is None:
platform = SCons.Platform.Platform()
- if SCons.Util.is_String(platform):
+ if is_String(platform):
platform = SCons.Platform.Platform(platform)
self._dict['PLATFORM'] = str(platform)
platform(self)
@@ -1081,7 +1098,7 @@ class Base(SubstitutionEnvironment):
# claim they can scan the same suffix, earlier scanners
# in the list will overwrite later scanners, so that
# the result looks like a "first match" to the user.
- if not SCons.Util.is_List(scanners):
+ if not is_List(scanners):
scanners = [scanners]
else:
scanners = scanners[:] # copy so reverse() doesn't mod original
@@ -1164,13 +1181,13 @@ class Base(SubstitutionEnvironment):
# but Python 1.5.2 apparently doesn't let you use "continue"
# within try:-except: blocks, so we have to nest our code.
try:
- if key == 'CPPDEFINES' and SCons.Util.is_String(self._dict[key]):
+ if key == 'CPPDEFINES' and is_String(self._dict[key]):
self._dict[key] = [self._dict[key]]
orig = self._dict[key]
except KeyError:
# No existing variable in the environment, so just set
# it to the new value.
- if key == 'CPPDEFINES' and SCons.Util.is_String(val):
+ if key == 'CPPDEFINES' and is_String(val):
self._dict[key] = [val]
else:
self._dict[key] = val
@@ -1209,7 +1226,7 @@ class Base(SubstitutionEnvironment):
else:
# The original looks like a dictionary, so update it
# based on what we think the value looks like.
- if SCons.Util.is_List(val):
+ if is_List(val):
if key == 'CPPDEFINES':
tmp = []
for (k, v) in orig.items():
@@ -1227,7 +1244,7 @@ class Base(SubstitutionEnvironment):
try:
update_dict(val)
except (AttributeError, TypeError, ValueError):
- if SCons.Util.is_Dict(val):
+ if is_Dict(val):
for k, v in val.items():
orig[k] = v
else:
@@ -1237,7 +1254,7 @@ class Base(SubstitutionEnvironment):
# allow Dirs and strings beginning with # for top-relative
# Note this uses the current env's fs (in self).
def _canonicalize(self, path):
- if not SCons.Util.is_String(path): # typically a Dir
+ if not is_String(path): # typically a Dir
path = str(path)
if path and path[0] == '#':
path = str(self.fs.Dir(path))
@@ -1259,8 +1276,7 @@ class Base(SubstitutionEnvironment):
if envname in self._dict and name in self._dict[envname]:
orig = self._dict[envname][name]
- nv = SCons.Util.AppendPath(orig, newpath, sep, delete_existing,
- canonicalize=self._canonicalize)
+ nv = AppendPath(orig, newpath, sep, delete_existing, canonicalize=self._canonicalize)
if envname not in self._dict:
self._dict[envname] = {}
@@ -1275,30 +1291,30 @@ class Base(SubstitutionEnvironment):
"""
kw = copy_non_reserved_keywords(kw)
for key, val in kw.items():
- if SCons.Util.is_List(val):
+ if is_List(val):
val = _delete_duplicates(val, delete_existing)
if key not in self._dict or self._dict[key] in ('', None):
self._dict[key] = val
- elif SCons.Util.is_Dict(self._dict[key]) and \
- SCons.Util.is_Dict(val):
+ elif is_Dict(self._dict[key]) and \
+ is_Dict(val):
self._dict[key].update(val)
- elif SCons.Util.is_List(val):
+ elif is_List(val):
dk = self._dict[key]
if key == 'CPPDEFINES':
tmp = []
for i in val:
- if SCons.Util.is_List(i):
+ if is_List(i):
if len(i) >= 2:
tmp.append((i[0], i[1]))
else:
tmp.append((i[0],))
- elif SCons.Util.is_Tuple(i):
+ elif is_Tuple(i):
tmp.append(i)
else:
tmp.append((i,))
val = tmp
# Construct a list of (key, value) tuples.
- if SCons.Util.is_Dict(dk):
+ if is_Dict(dk):
tmp = []
for (k, v) in dk.items():
if v is not None:
@@ -1306,23 +1322,23 @@ class Base(SubstitutionEnvironment):
else:
tmp.append((k,))
dk = tmp
- elif SCons.Util.is_String(dk):
+ elif is_String(dk):
dk = [(dk,)]
else:
tmp = []
for i in dk:
- if SCons.Util.is_List(i):
+ if is_List(i):
if len(i) >= 2:
tmp.append((i[0], i[1]))
else:
tmp.append((i[0],))
- elif SCons.Util.is_Tuple(i):
+ elif is_Tuple(i):
tmp.append(i)
else:
tmp.append((i,))
dk = tmp
else:
- if not SCons.Util.is_List(dk):
+ if not is_List(dk):
dk = [dk]
if delete_existing:
dk = [x for x in dk if x not in val]
@@ -1331,22 +1347,22 @@ class Base(SubstitutionEnvironment):
self._dict[key] = dk + val
else:
dk = self._dict[key]
- if SCons.Util.is_List(dk):
+ if is_List(dk):
if key == 'CPPDEFINES':
tmp = []
for i in dk:
- if SCons.Util.is_List(i):
+ if is_List(i):
if len(i) >= 2:
tmp.append((i[0], i[1]))
else:
tmp.append((i[0],))
- elif SCons.Util.is_Tuple(i):
+ elif is_Tuple(i):
tmp.append(i)
else:
tmp.append((i,))
dk = tmp
# Construct a list of (key, value) tuples.
- if SCons.Util.is_Dict(val):
+ if is_Dict(val):
tmp = []
for (k, v) in val.items():
if v is not None:
@@ -1354,7 +1370,7 @@ class Base(SubstitutionEnvironment):
else:
tmp.append((k,))
val = tmp
- elif SCons.Util.is_String(val):
+ elif is_String(val):
val = [(val,)]
if delete_existing:
dk = list(filter(lambda x, val=val: x not in val, dk))
@@ -1373,9 +1389,9 @@ class Base(SubstitutionEnvironment):
self._dict[key] = dk + [val]
else:
if key == 'CPPDEFINES':
- if SCons.Util.is_String(dk):
+ if is_String(dk):
dk = [dk]
- elif SCons.Util.is_Dict(dk):
+ elif is_Dict(dk):
tmp = []
for (k, v) in dk.items():
if v is not None:
@@ -1383,12 +1399,12 @@ class Base(SubstitutionEnvironment):
else:
tmp.append((k,))
dk = tmp
- if SCons.Util.is_String(val):
+ if is_String(val):
if val in dk:
val = []
else:
val = [val]
- elif SCons.Util.is_Dict(val):
+ elif is_Dict(val):
tmp = []
for i,j in val.items():
if j is not None:
@@ -1483,6 +1499,8 @@ class Base(SubstitutionEnvironment):
def Decider(self, function):
copy_function = self._copy2_from_cache
if function in ('MD5', 'content'):
+ if not SCons.Util.md5:
+ raise UserError("MD5 signatures are not available in this version of Python.")
function = self._changed_content
elif function in ('MD5-timestamp', 'content-timestamp'):
function = self._changed_timestamp_then_content
@@ -1509,7 +1527,7 @@ class Base(SubstitutionEnvironment):
progs (str or list): one or more command names to check for
"""
- if not SCons.Util.is_List(progs):
+ if not is_List(progs):
progs = [progs]
for prog in progs:
path = self.WhereIs(prog)
@@ -1614,7 +1632,7 @@ class Base(SubstitutionEnvironment):
def parse_conf(env, cmd, unique=unique):
return env.MergeFlags(cmd, unique)
function = parse_conf
- if SCons.Util.is_List(command):
+ if is_List(command):
command = ' '.join(command)
command = self.subst(command)
return function(self, self.backtick(command))
@@ -1632,7 +1650,7 @@ class Base(SubstitutionEnvironment):
filename = self.subst(filename)
try:
with open(filename, 'r') as fp:
- lines = SCons.Util.LogicalLines(fp).readlines()
+ lines = LogicalLines(fp).readlines()
except IOError:
if must_exist:
raise
@@ -1714,14 +1732,14 @@ class Base(SubstitutionEnvironment):
else:
# The original looks like a dictionary, so update it
# based on what we think the value looks like.
- if SCons.Util.is_List(val):
+ if is_List(val):
for v in val:
orig[v] = None
else:
try:
update_dict(val)
except (AttributeError, TypeError, ValueError):
- if SCons.Util.is_Dict(val):
+ if is_Dict(val):
for k, v in val.items():
orig[k] = v
else:
@@ -1744,7 +1762,7 @@ class Base(SubstitutionEnvironment):
if envname in self._dict and name in self._dict[envname]:
orig = self._dict[envname][name]
- nv = SCons.Util.PrependPath(orig, newpath, sep, delete_existing,
+ nv = PrependPath(orig, newpath, sep, delete_existing,
canonicalize=self._canonicalize)
if envname not in self._dict:
@@ -1760,16 +1778,16 @@ class Base(SubstitutionEnvironment):
"""
kw = copy_non_reserved_keywords(kw)
for key, val in kw.items():
- if SCons.Util.is_List(val):
+ if is_List(val):
val = _delete_duplicates(val, not delete_existing)
if key not in self._dict or self._dict[key] in ('', None):
self._dict[key] = val
- elif SCons.Util.is_Dict(self._dict[key]) and \
- SCons.Util.is_Dict(val):
+ elif is_Dict(self._dict[key]) and \
+ is_Dict(val):
self._dict[key].update(val)
- elif SCons.Util.is_List(val):
+ elif is_List(val):
dk = self._dict[key]
- if not SCons.Util.is_List(dk):
+ if not is_List(dk):
dk = [dk]
if delete_existing:
dk = [x for x in dk if x not in val]
@@ -1778,7 +1796,7 @@ class Base(SubstitutionEnvironment):
self._dict[key] = val + dk
else:
dk = self._dict[key]
- if SCons.Util.is_List(dk):
+ if is_List(dk):
# By elimination, val is not a list. Since dk is a
# list, wrap val in a list first.
if delete_existing:
@@ -1843,7 +1861,7 @@ class Base(SubstitutionEnvironment):
return self.fs.Dir(self.subst(tp)).srcnode().get_abspath()
def Tool(self, tool, toolpath=None, **kw):
- if SCons.Util.is_String(tool):
+ if is_String(tool):
tool = self.subst(tool)
if toolpath is None:
toolpath = self.get('toolpath', [])
@@ -1859,17 +1877,17 @@ class Base(SubstitutionEnvironment):
path = self['ENV']['PATH']
except KeyError:
pass
- elif SCons.Util.is_String(path):
+ elif is_String(path):
path = self.subst(path)
if pathext is None:
try:
pathext = self['ENV']['PATHEXT']
except KeyError:
pass
- elif SCons.Util.is_String(pathext):
+ elif is_String(pathext):
pathext = self.subst(pathext)
- prog = SCons.Util.CLVar(self.subst(prog)) # support "program --with-args"
- path = SCons.Util.WhereIs(prog[0], path, pathext, reject)
+ prog = CLVar(self.subst(prog)) # support "program --with-args"
+ path = WhereIs(prog[0], path, pathext, reject)
if path: return path
return None
@@ -1883,7 +1901,7 @@ class Base(SubstitutionEnvironment):
def Action(self, *args, **kw):
def subst_string(a, self=self):
- if SCons.Util.is_String(a):
+ if is_String(a):
a = self.subst(a)
return a
nargs = list(map(subst_string, args))
@@ -1912,7 +1930,7 @@ class Base(SubstitutionEnvironment):
def Alias(self, target, source=[], action=None, **kw):
tlist = self.arg2nodes(target, self.ans.Alias)
- if not SCons.Util.is_List(source):
+ if not is_List(source):
source = [source]
source = [_f for _f in source if _f]
@@ -2060,7 +2078,7 @@ class Base(SubstitutionEnvironment):
"""
"""
s = self.subst(name)
- if SCons.Util.is_Sequence(s):
+ if is_Sequence(s):
result=[]
for e in s:
result.append(self.fs.Dir(e, *args, **kw))
@@ -2069,7 +2087,7 @@ class Base(SubstitutionEnvironment):
def PyPackageDir(self, modulename):
s = self.subst(modulename)
- if SCons.Util.is_Sequence(s):
+ if is_Sequence(s):
result=[]
for e in s:
result.append(self.fs.PyPackageDir(e))
@@ -2098,7 +2116,7 @@ class Base(SubstitutionEnvironment):
"""
"""
s = self.subst(name)
- if SCons.Util.is_Sequence(s):
+ if is_Sequence(s):
result=[]
for e in s:
result.append(self.fs.Entry(e, *args, **kw))
@@ -2126,7 +2144,7 @@ class Base(SubstitutionEnvironment):
"""
"""
s = self.subst(name)
- if SCons.Util.is_Sequence(s):
+ if is_Sequence(s):
result=[]
for e in s:
result.append(self.fs.File(e, *args, **kw))
@@ -2139,11 +2157,11 @@ class Base(SubstitutionEnvironment):
return SCons.Node.FS.find_file(file, tuple(nodes))
def Flatten(self, sequence):
- return SCons.Util.flatten(sequence)
+ return flatten(sequence)
def GetBuildPath(self, files):
result = list(map(str, self.arg2nodes(files, self.fs.Entry)))
- if SCons.Util.is_List(files):
+ if is_List(files):
return result
else:
return result[0]
@@ -2207,7 +2225,7 @@ class Base(SubstitutionEnvironment):
def Scanner(self, *args, **kw):
nargs = []
for arg in args:
- if SCons.Util.is_String(arg):
+ if is_String(arg):
arg = self.subst(arg)
nargs.append(arg)
nkw = self.subst_kw(kw)
@@ -2255,9 +2273,9 @@ class Base(SubstitutionEnvironment):
In all cases, the function returns a list of Nodes and strings."""
- if SCons.Util.is_List(arg):
+ if is_List(arg):
return list(map(self.subst, arg))
- elif SCons.Util.is_String(arg):
+ elif is_String(arg):
return self.subst(arg).split()
else:
return [self.subst(arg)]
@@ -2301,7 +2319,7 @@ class Base(SubstitutionEnvironment):
"""
from SCons.Tool import install
if install._UNIQUE_INSTALLED_FILES is None:
- install._UNIQUE_INSTALLED_FILES = SCons.Util.uniquer_hashables(install._INSTALLED_FILES)
+ install._UNIQUE_INSTALLED_FILES = uniquer_hashables(install._INSTALLED_FILES)
return install._UNIQUE_INSTALLED_FILES