summaryrefslogtreecommitdiff
path: root/SConstruct
diff options
context:
space:
mode:
authorAndrew Morrow <acm@mongodb.com>2018-07-01 17:15:13 -0400
committerAndrew Morrow <acm@mongodb.com>2018-09-12 16:10:41 -0400
commit47ab234e910a04cb2bee4114170b042d47586c35 (patch)
treea4f8976a00af0076646daf92b56c36744e87b54d /SConstruct
parent7ff69910209132acaa6abf6237f0f2d36ce518c2 (diff)
downloadmongo-47ab234e910a04cb2bee4114170b042d47586c35.tar.gz
SERVER-33911 Implement collapsed library builds under a new link model
Diffstat (limited to 'SConstruct')
-rw-r--r--SConstruct39
1 files changed, 32 insertions, 7 deletions
diff --git a/SConstruct b/SConstruct
index 032aec64024..62df588ff23 100644
--- a/SConstruct
+++ b/SConstruct
@@ -469,7 +469,7 @@ add_option('variables-files',
help="Specify variables files to load",
)
-link_model_choices = ['auto', 'object', 'static', 'dynamic', 'dynamic-strict']
+link_model_choices = ['auto', 'object', 'static', 'dynamic', 'dynamic-strict', 'dynamic-sdk']
add_option('link-model',
choices=link_model_choices,
default='auto',
@@ -609,7 +609,6 @@ def variable_tools_converter(val):
"gziptool",
'idl_tool',
"jsheader",
- "mergelib",
"mongo_benchmark",
"mongo_integrationtest",
"mongo_unittest",
@@ -1282,8 +1281,8 @@ if link_model == "auto":
# Windows can't currently support anything other than 'object' or 'static', until
# we have both hygienic builds and have annotated functions for export.
-if env.TargetOSIs('windows') and link_model not in ['object', 'static']:
- env.FatalError("Windows builds must use the 'object' or 'static' link models");
+if env.TargetOSIs('windows') and link_model not in ['object', 'static', 'dynamic-sdk']:
+ env.FatalError("Windows builds must use the 'object', 'dynamic-sdk', 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.
@@ -1292,11 +1291,24 @@ env['_LIBDEPS'] = '$_LIBDEPS_OBJS' if link_model == "object" else '$_LIBDEPS_LIB
env['BUILDERS']['ProgramObject'] = env['BUILDERS']['StaticObject']
env['BUILDERS']['LibraryObject'] = env['BUILDERS']['StaticObject']
+env['SHARPREFIX'] = '$LIBPREFIX'
+env['SHARSUFFIX'] = '${SHLIBSUFFIX}${LIBSUFFIX}'
+env['BUILDERS']['SharedArchive'] = SCons.Builder.Builder(
+ action=env['BUILDERS']['StaticLibrary'].action,
+ emitter='$SHAREMITTER',
+ prefix='$SHARPREFIX',
+ suffix='$SHARSUFFIX',
+ src_suffix=env['BUILDERS']['SharedLibrary'].src_suffix,
+)
+
if link_model.startswith("dynamic"):
- # Redirect the 'Library' target, which we always use instead of 'StaticLibrary' for things
- # that can be built in either mode, to point to SharedLibrary.
- env['BUILDERS']['Library'] = env['BUILDERS']['SharedLibrary']
+ def library(env, target, source, *args, **kwargs):
+ sharedLibrary = env.SharedLibrary(target, source, *args, **kwargs)
+ sharedArchive = env.SharedArchive(target, source=sharedLibrary[0].sources, *args, **kwargs)
+ return (sharedLibrary, sharedArchive)
+
+ env['BUILDERS']['Library'] = library
env['BUILDERS']['LibraryObject'] = env['BUILDERS']['SharedObject']
# TODO: Ideally, the conditions below should be based on a
@@ -1365,6 +1377,19 @@ if link_model.startswith("dynamic"):
return ["-Wl,-undefined,dynamic_lookup"]
return []
env['LIBDEPS_TAG_EXPANSIONS'].append(libdeps_tags_expand_incomplete)
+ elif env.TargetOSIs('windows'):
+ if link_model == "dynamic-strict":
+ # Windows is strict by default
+ pass
+ else:
+ def libdeps_tags_expand_incomplete(source, target, env, for_signature):
+ # On windows, since it is strict by default, we need to add a flag
+ # when libraries are tagged incomplete.
+ if ('illegal_cyclic_or_unresolved_dependencies_whitelisted'
+ in target[0].get_env().get("LIBDEPS_TAGS", [])):
+ return ["/FORCE:UNRESOLVED"]
+ return []
+ env['LIBDEPS_TAG_EXPANSIONS'].append(libdeps_tags_expand_incomplete)
else:
env.AppendUnique(LINKFLAGS=["-Wl,--no-as-needed"])