summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--SConstruct22
-rw-r--r--site_scons/libdeps.py29
-rw-r--r--src/mongo/util/SConscript3
-rw-r--r--src/third_party/IntelRDFPMathLib20U1/SConscript3
4 files changed, 44 insertions, 13 deletions
diff --git a/SConstruct b/SConstruct
index 3fe03bade85..effbf43cf04 100644
--- a/SConstruct
+++ b/SConstruct
@@ -1181,8 +1181,8 @@ elif has_option("release") and link_model != "object":
# The only link model currently supported on Windows is 'object', since there is no equivalent
# to --whole-archive.
-if env.TargetOSIs('windows') and link_model != 'object':
- env.FatalError("Windows builds must use the 'object' link model");
+if env.TargetOSIs('windows') and link_model not in ['object', 'static']:
+ env.FatalError("Windows builds must use the 'object' or 'static' link models");
# The 'object' mode for libdeps is enabled by setting _LIBDEPS to $_LIBDEPS_OBJS. The other two
# modes operate in library mode, enabled by setting _LIBDEPS to $_LIBDEPS_LIBS.
@@ -1366,18 +1366,24 @@ libdeps.setup_environment(env, emitting_shared=(link_model.startswith("dynamic")
if env.TargetOSIs('linux', 'freebsd', 'openbsd'):
env['LINK_LIBGROUP_START'] = '-Wl,--start-group'
env['LINK_LIBGROUP_END'] = '-Wl,--end-group'
- env['LINK_WHOLE_ARCHIVE_START'] = '-Wl,--whole-archive'
- env['LINK_WHOLE_ARCHIVE_END'] = '-Wl,--no-whole-archive'
+ # NOTE: The leading and trailing spaces here are important. Do not remove them.
+ env['LINK_WHOLE_ARCHIVE_LIB_START'] = '-Wl,--whole-archive '
+ env['LINK_WHOLE_ARCHIVE_LIB_END'] = ' -Wl,--no-whole-archive'
elif env.TargetOSIs('darwin'):
env['LINK_LIBGROUP_START'] = ''
env['LINK_LIBGROUP_END'] = ''
- env['LINK_WHOLE_ARCHIVE_START'] = '-Wl,-all_load'
- env['LINK_WHOLE_ARCHIVE_END'] = '-Wl,-noall_load'
+ # NOTE: The trailing space here is important. Do not remove it.
+ env['LINK_WHOLE_ARCHIVE_LIB_START'] = '-force_load '
+ env['LINK_WHOLE_ARCHIVE_LIB_END'] = ''
elif env.TargetOSIs('solaris'):
env['LINK_LIBGROUP_START'] = '-z rescan-start'
env['LINK_LIBGROUP_END'] = '-z rescan-end'
- env['LINK_WHOLE_ARCHIVE_START'] = '-z allextract'
- env['LINK_WHOLE_ARCHIVE_END'] = '-z defaultextract'
+ # NOTE: The leading and trailing spaces here are important. Do not remove them.
+ env['LINK_WHOLE_ARCHIVE_LIB_START'] = '-z allextract '
+ env['LINK_WHOLE_ARCHIVE_LIB_END'] = ' -z defaultextract'
+elif env.TargetOSIs('windows'):
+ env['LINK_WHOLE_ARCHIVE_LIB_START'] = '/WHOLEARCHIVE:'
+ env['LINK_WHOLE_ARCHIVE_LIB_END'] = ''
# ---- other build setup -----
if debugBuild:
diff --git a/site_scons/libdeps.py b/site_scons/libdeps.py
index adba8dae77c..62ff3ba6cf6 100644
--- a/site_scons/libdeps.py
+++ b/site_scons/libdeps.py
@@ -350,25 +350,44 @@ def setup_environment(env, emitting_shared=False):
env['_LIBDEPS'] = '$_LIBDEPS_LIBS'
env['_LIBDEPS_TAGS'] = expand_libdeps_tags
-
- env['_LIBDEPS_LIBS'] = get_libdeps
-
+ env['_LIBDEPS_GET_LIBS'] = get_libdeps
env['_LIBDEPS_OBJS'] = get_libdeps_objs
env['_SYSLIBDEPS'] = get_syslibdeps
- env['_SHLIBDEPS'] = '$SHLIBDEP_GROUP_START ${_concat(SHLIBDEPPREFIX, __env__.subst(_LIBDEPS, target=TARGET, source=SOURCE), SHLIBDEPSUFFIX, __env__, target=TARGET, source=SOURCE)} $SHLIBDEP_GROUP_END'
env[libdeps_env_var] = SCons.Util.CLVar()
env[syslibdeps_env_var] = SCons.Util.CLVar()
+
env.Append(LIBEMITTER=libdeps_emitter)
if emitting_shared:
+ env['_LIBDEPS_LIBS'] = '$_LIBDEPS_GET_LIBS'
env.Append(
PROGEMITTER=shlibdeps_emitter,
SHLIBEMITTER=shlibdeps_emitter)
else:
+
+ 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'] = ('$LINK_WHOLE_ARCHIVE_START '
+ '$LINK_LIBGROUP_START '
+ '$_LIBDEPS_LIBS_WITH_TAGS '
+ '$LINK_LIBGROUP_END '
+ '$LINK_WHOLE_ARCHIVE_END')
env.Append(
PROGEMITTER=libdeps_emitter,
SHLIBEMITTER=libdeps_emitter)
- env.Prepend(_LIBFLAGS=' $_LIBDEPS_TAGS $LINK_WHOLE_ARCHIVE_START $LINK_LIBGROUP_START $_LIBDEPS $LINK_LIBGROUP_END $LINK_WHOLE_ARCHIVE_END $_SYSLIBDEPS ')
+ env.Prepend(_LIBFLAGS='$_LIBDEPS_TAGS $_LIBDEPS $_SYSLIBDEPS ')
for builder_name in ('Program', 'SharedLibrary', 'LoadableModule'):
try:
update_scanner(env['BUILDERS'][builder_name])
diff --git a/src/mongo/util/SConscript b/src/mongo/util/SConscript
index ebe9ae87d3d..ddff3ed9005 100644
--- a/src/mongo/util/SConscript
+++ b/src/mongo/util/SConscript
@@ -51,6 +51,9 @@ debuggerEnv.Library(
LIBDEPS=[
# NOTE: You *must not* add any library dependencies to the debugger library
],
+ LIBDEPS_TAGS=[
+ 'init-no-global-side-effects',
+ ]
)
env.Library(
diff --git a/src/third_party/IntelRDFPMathLib20U1/SConscript b/src/third_party/IntelRDFPMathLib20U1/SConscript
index c2c60cdb93c..6f56caf45db 100644
--- a/src/third_party/IntelRDFPMathLib20U1/SConscript
+++ b/src/third_party/IntelRDFPMathLib20U1/SConscript
@@ -340,6 +340,9 @@ env.Library(
target='intel_decimal128',
source=source_files,
LIBS=libs,
+ LIBDEPS_TAGS=[
+ 'init-no-global-side-effects',
+ ]
)
readtest = env.Program(