summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--SConstruct3
-rw-r--r--site_scons/libdeps.py49
2 files changed, 32 insertions, 20 deletions
diff --git a/SConstruct b/SConstruct
index d57c41a2217..d4ec5f0bdb2 100644
--- a/SConstruct
+++ b/SConstruct
@@ -1660,7 +1660,8 @@ elif env.TargetOSIs('solaris'):
env['LINK_WHOLE_ARCHIVE_LIB_START'] = '-Wl,-z,allextract '
env['LINK_WHOLE_ARCHIVE_LIB_END'] = ' -Wl,-z,defaultextract'
elif env.TargetOSIs('windows'):
- env['LINK_WHOLE_ARCHIVE_LIB_START'] = '/WHOLEARCHIVE:'
+ env['LINK_WHOLE_ARCHIVE_LIB_START'] = '/WHOLEARCHIVE'
+ env['LINK_WHOLE_ARCHIVE_SEP'] = ':'
env['LINK_WHOLE_ARCHIVE_LIB_END'] = ''
# ---- other build setup -----
diff --git a/site_scons/libdeps.py b/site_scons/libdeps.py
index 4dc818cb3d6..e3f05f6aa7b 100644
--- a/site_scons/libdeps.py
+++ b/site_scons/libdeps.py
@@ -369,6 +369,36 @@ def expand_libdeps_tags(source, target, env, for_signature):
return results
+def expand_libdeps_with_extraction_flags(source, target, env, for_signature):
+ result = []
+ libs = get_libdeps(source, target, env, for_signature)
+ whole_archive_start = env.subst("$LINK_WHOLE_ARCHIVE_LIB_START")
+ whole_archive_end = env.subst("$LINK_WHOLE_ARCHIVE_LIB_END")
+ whole_archive_separator = env.get("LINK_WHOLE_ARCHIVE_SEP", " ")
+ for lib in libs:
+ if isinstance(lib, (str, SCons.Node.FS.File, SCons.Node.FS.Entry)):
+ lib_target = str(lib)
+ else:
+ lib_target = env.subst("$TARGET", target=lib)
+
+ if "init-no-global-side-effects" in env.Entry(lib).get_env().get(
+ "LIBDEPS_TAGS", []
+ ):
+ result.append(lib_target)
+ else:
+ whole_archive_flag = "{}{}{}".format(
+ whole_archive_start, whole_archive_separator, lib_target
+ )
+ if whole_archive_end:
+ whole_archive_flag += "{}{}".format(
+ whole_archive_separator, whole_archive_end
+ )
+
+ result.extend(whole_archive_flag.split())
+
+ return result
+
+
def setup_environment(env, emitting_shared=False):
"""Set up the given build environment to do LIBDEPS tracking."""
@@ -412,25 +442,6 @@ def setup_environment(env, emitting_shared=False):
PROGEMITTER=make_indirect_emitter("LIBDEPS_PROGEMITTER"),
)
- def expand_libdeps_with_extraction_flags(source, target, env, for_signature):
- result = []
- libs = get_libdeps(source, target, env, for_signature)
- for lib in libs:
- 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()
- )
- return result
-
env["_LIBDEPS_LIBS_WITH_TAGS"] = expand_libdeps_with_extraction_flags
env["_LIBDEPS_LIBS"] = (