summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathew Robinson <mathew.robinson@mongodb.com>2020-01-17 20:53:55 +0000
committerA. Jesse Jiryu Davis <jesse@mongodb.com>2020-01-27 15:40:40 -0500
commit08ee09d1c1cee70ac4e92082cd65787bdef66a13 (patch)
tree0926e803e24da6d117441a301bca71bb490ce5de
parentcd61bf2787151f13d87cd45f3e6f690562f3acab (diff)
downloadmongo-08ee09d1c1cee70ac4e92082cd65787bdef66a13.tar.gz
SERVER-45041 Remove extraneous calls to env.Entry in libdeps.py
-rw-r--r--site_scons/libdeps.py105
1 files changed, 53 insertions, 52 deletions
diff --git a/site_scons/libdeps.py b/site_scons/libdeps.py
index e3f05f6aa7b..fb447487f28 100644
--- a/site_scons/libdeps.py
+++ b/site_scons/libdeps.py
@@ -108,49 +108,48 @@ def __get_sorted_direct_libdeps(node):
return direct_sorted
-def __get_libdeps(node):
- """Given a SCons Node, return its library dependencies, topologically sorted.
+def __libdeps_visit(n, marked, tsorted, walking):
+ if n.target_node in marked:
+ return
- Computes the dependencies if they're not already cached.
- """
+ if n.target_node in walking:
+ raise DependencyCycleError(n.target_node)
- cached_var_name = libdeps_env_var + "_cached"
+ walking.add(n.target_node)
- if hasattr(node.attributes, cached_var_name):
- return getattr(node.attributes, cached_var_name)
+ try:
+ for child in __get_sorted_direct_libdeps(n.target_node):
+ if child.dependency_type != dependency.Private:
+ __libdeps_visit(child, marked, tsorted, walking=walking)
- tsorted = []
- marked = set()
+ marked.add(n.target_node)
+ tsorted.append(n.target_node)
- def visit(n):
- if getattr(n.target_node.attributes, "libdeps_exploring", False):
- raise DependencyCycleError(n.target_node)
+ 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
- n.target_node.attributes.libdeps_exploring = True
- try:
- if n.target_node in marked:
- return
+def __get_libdeps(node):
+ """Given a SCons Node, return its library dependencies, topologically sorted.
- try:
- for child in __get_sorted_direct_libdeps(n.target_node):
- if child.dependency_type != dependency.Private:
- visit(child)
+ Computes the dependencies if they're not already cached.
+ """
- marked.add(n.target_node)
- tsorted.append(n.target_node)
+ cached_var_name = libdeps_env_var + "_cached"
- 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
+ cache = getattr(node.attributes, cached_var_name, None)
+ if cache is not None:
+ return cache
- finally:
- n.target_node.attributes.libdeps_exploring = False
+ tsorted = []
+ marked = set()
+ walking = set()
for child in __get_sorted_direct_libdeps(node):
if child.dependency_type != dependency.Interface:
- visit(child)
+ __libdeps_visit(child, marked, tsorted, walking)
tsorted.reverse()
setattr(node.attributes, cached_var_name, tsorted)
@@ -164,26 +163,28 @@ def __get_syslibdeps(node):
These are the depencencies listed with SYSLIBDEPS, and are linked using -l.
"""
cached_var_name = syslibdeps_env_var + "_cached"
- if not hasattr(node.attributes, cached_var_name):
- syslibdeps = node.get_env().Flatten(node.get_env().get(syslibdeps_env_var, []))
- 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) 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) :])
- )
- )
- node.get_env().Exit(1)
- syslibdeps.append(syslib)
- setattr(node.attributes, cached_var_name, syslibdeps)
- return getattr(node.attributes, cached_var_name)
+ result = getattr(node.attributes, cached_var_name, None)
+ if result is not None:
+ return result
+
+ result = node.get_env().Flatten(node.get_env().get(syslibdeps_env_var, []))
+ for lib in __get_libdeps(node):
+ for syslib in lib.get_env().get(syslibdeps_env_var, []):
+ if not syslib:
+ continue
+
+ if type(syslib) is str and syslib.startswith(missing_syslibdep):
+ print(
+ "Target '{}' depends on the availability of a "
+ "system provided library for '{}', "
+ "but no suitable library was found during configuration.".format(str(node), syslib[len(missing_syslibdep) :])
+ )
+ node.get_env().Exit(1)
+
+ result.append(syslib)
+
+ setattr(node.attributes, cached_var_name, result)
+ return result
def __missing_syslib(name):
@@ -378,12 +379,12 @@ def expand_libdeps_with_extraction_flags(source, target, env, for_signature):
for lib in libs:
if isinstance(lib, (str, SCons.Node.FS.File, SCons.Node.FS.Entry)):
lib_target = str(lib)
+ lib_tags = lib.get_env().get("LIBDEPS_TAGS", [])
else:
lib_target = env.subst("$TARGET", target=lib)
+ lib_tags = env.File(lib).get_env().get("LIBDEPS_TAGS", [])
- if "init-no-global-side-effects" in env.Entry(lib).get_env().get(
- "LIBDEPS_TAGS", []
- ):
+ if "init-no-global-side-effects" in lib_tags:
result.append(lib_target)
else:
whole_archive_flag = "{}{}{}".format(