172 lines
7.5 KiB
Text
172 lines
7.5 KiB
Text
Index: site_scons/libdeps.py
|
|
--- site_scons/libdeps.py.orig
|
|
+++ site_scons/libdeps.py
|
|
@@ -61,7 +61,7 @@ syslibdeps_env_var = 'SYSLIBDEPS'
|
|
missing_syslibdep = 'MISSING_LIBDEP_'
|
|
|
|
class dependency(object):
|
|
- Public, Private, Interface = range(3)
|
|
+ Public, Private, Interface = list(range(3))
|
|
|
|
def __init__(self, value, dynamic, deptype):
|
|
self.target_node = value
|
|
@@ -74,7 +74,7 @@ class dependency(object):
|
|
class DependencyCycleError(SCons.Errors.UserError):
|
|
"""Exception representing a cycle discovered in library dependencies."""
|
|
|
|
- def __init__(self, first_node ):
|
|
+ def __init__(self, first_node):
|
|
super(DependencyCycleError, self).__init__()
|
|
self.cycle_nodes = [first_node]
|
|
|
|
@@ -89,8 +89,8 @@ def __get_sorted_direct_libdeps(node):
|
|
setattr(node.attributes, "libdeps_direct_sorted", direct_sorted)
|
|
return direct_sorted
|
|
|
|
-def __get_libdeps(node):
|
|
|
|
+def __get_libdeps(node):
|
|
"""Given a SCons Node, return its library dependencies, topologically sorted.
|
|
|
|
Computes the dependencies if they're not already cached.
|
|
@@ -122,7 +122,7 @@ def __get_libdeps(node):
|
|
marked.add(n.target_node)
|
|
tsorted.append(n.target_node)
|
|
|
|
- except DependencyCycleError, e:
|
|
+ except DependencyCycleError as e:
|
|
if len(e.cycle_nodes) == 1 or e.cycle_nodes[0] != e.cycle_nodes[-1]:
|
|
e.cycle_nodes.insert(0, n.target_node)
|
|
raise
|
|
@@ -139,6 +139,7 @@ def __get_libdeps(node):
|
|
|
|
return tsorted
|
|
|
|
+
|
|
def __get_syslibdeps(node):
|
|
""" Given a SCons Node, return its system library dependencies.
|
|
|
|
@@ -150,11 +151,11 @@ def __get_syslibdeps(node):
|
|
for lib in __get_libdeps(node):
|
|
for syslib in node.get_env().Flatten(lib.get_env().get(syslibdeps_env_var, [])):
|
|
if syslib:
|
|
- if type(syslib) in (str, unicode) and syslib.startswith(missing_syslibdep):
|
|
- print("Target '%s' depends on the availability of a "
|
|
+ if type(syslib) is str and syslib.startswith(missing_syslibdep):
|
|
+ print(("Target '%s' depends on the availability of a "
|
|
"system provided library for '%s', "
|
|
"but no suitable library was found during configuration." %
|
|
- (str(node), syslib[len(missing_syslibdep):]))
|
|
+ (str(node), syslib[len(missing_syslibdep):])))
|
|
node.get_env().Exit(1)
|
|
syslibdeps.append(syslib)
|
|
setattr(node.attributes, cached_var_name, syslibdeps)
|
|
@@ -170,18 +171,21 @@ def update_scanner(builder):
|
|
|
|
if old_scanner:
|
|
path_function = old_scanner.path_function
|
|
+
|
|
def new_scanner(node, env, path=()):
|
|
result = old_scanner.function(node, env, path)
|
|
result.extend(__get_libdeps(node))
|
|
return result
|
|
else:
|
|
path_function = None
|
|
+
|
|
def new_scanner(node, env, path=()):
|
|
return __get_libdeps(node)
|
|
|
|
builder.target_scanner = SCons.Scanner.Scanner(function=new_scanner,
|
|
- path_function=path_function)
|
|
+ path_function=path_function)
|
|
|
|
+
|
|
def get_libdeps(source, target, env, for_signature):
|
|
"""Implementation of the special _LIBDEPS environment variable.
|
|
|
|
@@ -191,6 +195,7 @@ def get_libdeps(source, target, env, for_signature):
|
|
target = env.Flatten([target])
|
|
return __get_libdeps(target[0])
|
|
|
|
+
|
|
def get_libdeps_objs(source, target, env, for_signature):
|
|
objs = []
|
|
for lib in get_libdeps(source, target, env, for_signature):
|
|
@@ -198,6 +203,7 @@ def get_libdeps_objs(source, target, env, for_signatur
|
|
objs.extend(lib.sources)
|
|
return objs
|
|
|
|
+
|
|
def get_syslibdeps(source, target, env, for_signature):
|
|
deps = __get_syslibdeps(target[0])
|
|
lib_link_prefix = env.subst('$LIBLINKPREFIX')
|
|
@@ -209,7 +215,7 @@ def get_syslibdeps(source, target, env, for_signature)
|
|
# they're believed to represent library short names, that should be prefixed with -l
|
|
# or the compiler-specific equivalent. I.e., 'm' becomes '-lm', but 'File("m.a") is passed
|
|
# through whole cloth.
|
|
- if type(d) in (str, unicode):
|
|
+ if type(d) is str:
|
|
result.append('%s%s%s' % (lib_link_prefix, d, lib_link_suffix))
|
|
else:
|
|
result.append(d)
|
|
@@ -252,8 +258,8 @@ def libdeps_emitter(target, source, env):
|
|
prereqs.extend(dependency(l, False, dependency.Private) for l in env.get(libdeps_env_var + '_PRIVATE', []) if l)
|
|
|
|
for prereq in prereqs:
|
|
- prereqWithIxes = SCons.Util.adjustixes(
|
|
- prereq.target_node, lib_builder.get_prefix(env), lib_builder.get_suffix(env))
|
|
+ prereqWithIxes = SCons.Util.adjustixes(prereq.target_node, lib_builder.get_prefix(env),
|
|
+ lib_builder.get_suffix(env))
|
|
prereq.target_node = lib_node_factory(prereqWithIxes)
|
|
|
|
for t in target:
|
|
@@ -264,16 +270,16 @@ def libdeps_emitter(target, source, env):
|
|
for dependent in env.get('LIBDEPS_DEPENDENTS', []):
|
|
if dependent is None:
|
|
continue
|
|
- dependentWithIxes = SCons.Util.adjustixes(
|
|
- dependent, lib_builder.get_prefix(env), lib_builder.get_suffix(env))
|
|
+ dependentWithIxes = SCons.Util.adjustixes(dependent, lib_builder.get_prefix(env),
|
|
+ lib_builder.get_suffix(env))
|
|
dependentNode = lib_node_factory(dependentWithIxes)
|
|
__append_direct_libdeps(dependentNode, [dependency(target[0], False, dependency.Public)])
|
|
|
|
for dependent in env.get('PROGDEPS_DEPENDENTS', []):
|
|
if dependent is None:
|
|
continue
|
|
- dependentWithIxes = SCons.Util.adjustixes(
|
|
- dependent, prog_builder.get_prefix(env), prog_builder.get_suffix(env))
|
|
+ dependentWithIxes = SCons.Util.adjustixes(dependent, prog_builder.get_prefix(env),
|
|
+ prog_builder.get_suffix(env))
|
|
dependentNode = prog_node_factory(dependentWithIxes)
|
|
__append_direct_libdeps(dependentNode, [dependency(target[0], False, dependency.Public)])
|
|
|
|
@@ -372,9 +378,11 @@ def setup_environment(env, emitting_shared=False):
|
|
if 'init-no-global-side-effects' in env.Entry(lib).get_env().get('LIBDEPS_TAGS', []):
|
|
result.append(str(lib))
|
|
else:
|
|
- result.extend(env.subst('$LINK_WHOLE_ARCHIVE_LIB_START'
|
|
- '$TARGET'
|
|
- '$LINK_WHOLE_ARCHIVE_LIB_END', target=lib).split())
|
|
+ result.extend(
|
|
+ env.subst(
|
|
+ '$LINK_WHOLE_ARCHIVE_LIB_START'
|
|
+ '$TARGET'
|
|
+ '$LINK_WHOLE_ARCHIVE_LIB_END', target=lib).split())
|
|
return result
|
|
|
|
env['_LIBDEPS_LIBS_WITH_TAGS'] = expand_libdeps_with_extraction_flags
|
|
@@ -394,6 +402,7 @@ def setup_environment(env, emitting_shared=False):
|
|
except KeyError:
|
|
pass
|
|
|
|
+
|
|
def setup_conftests(conf):
|
|
def FindSysLibDep(context, name, libs, **kwargs):
|
|
var = "LIBDEPS_" + name.upper() + "_SYSLIBDEP"
|
|
@@ -406,4 +415,5 @@ def setup_conftests(conf):
|
|
return context.Result(result)
|
|
context.env[var] = __missing_syslib(name)
|
|
return context.Result(result)
|
|
+
|
|
conf.AddTest('FindSysLibDep', FindSysLibDep)
|