diff options
author | Andrew Morrow <acm@mongodb.com> | 2018-03-03 08:08:08 -0500 |
---|---|---|
committer | Andrew Morrow <acm@mongodb.com> | 2018-03-06 09:57:57 -0500 |
commit | 5dfa372b25b1a26bb12e09fdb029ff219b0f5343 (patch) | |
tree | 2c23324cb72eae116c4a03a72141d0a9716884d8 | |
parent | 80625c63d47a1d9306958d7ea95154d12c10cade (diff) | |
download | mongo-5dfa372b25b1a26bb12e09fdb029ff219b0f5343.tar.gz |
SERVER-32117 Minimal hygienic build to support mobile dev
-rw-r--r-- | SConstruct | 35 | ||||
-rw-r--r-- | site_scons/site_tools/auto_install_binaries.py | 83 | ||||
-rw-r--r-- | src/mongo/SConscript | 133 | ||||
-rw-r--r-- | src/mongo/client/embedded/SConscript | 14 |
4 files changed, 202 insertions, 63 deletions
diff --git a/SConstruct b/SConstruct index a16d9aaa967..c32932bfe32 100644 --- a/SConstruct +++ b/SConstruct @@ -96,6 +96,14 @@ add_option('prefix', help='installation prefix', ) +add_option('install-mode', + choices=['legacy', 'hygienic'], + default='legacy', + help='select type of installation', + nargs=1, + type='choice', +) + add_option('nostrip', help='do not strip installed binaries', nargs=0, @@ -3151,6 +3159,33 @@ def doConfigure(myenv): env = doConfigure( env ) +# TODO: Later, this should live somewhere more graceful. +if get_option('install-mode') == 'hygienic': + env.Tool('auto_install_binaries') + if env['PLATFORM'] == 'posix': + env.AppendUnique( + RPATH=[ + env.Literal('\\$$ORIGIN/../lib') + ], + LINKFLAGS=[ + '-Wl,-z,origin', + '-Wl,--enable-new-dtags', + ], + SHLINKFLAGS=[ + # -h works for both the sun linker and the gnu linker. + "-Wl,-h,${TARGET.file}", + ] + ) + elif env['PLATFORM'] == 'darwin': + env.AppendUnique( + LINKFLAGS=[ + '-Wl,-rpath,@loader_path/../lib' + ], + SHLINKFLAGS=[ + "-Wl,-install_name,@loader_path/../lib/${TARGET.file}", + ], + ) + # Now that we are done with configure checks, enable icecream, if available. env.Tool('icecream') diff --git a/site_scons/site_tools/auto_install_binaries.py b/site_scons/site_tools/auto_install_binaries.py new file mode 100644 index 00000000000..6416a5214c5 --- /dev/null +++ b/site_scons/site_tools/auto_install_binaries.py @@ -0,0 +1,83 @@ +import SCons + +def exists(env): + return True + +def generate(env): + + env.Tool('install') + + suffix_map = { + '.dylib' : 'lib', + '.so' : 'lib', + } + + def tag_install(env, target, source, **kwargs): + prefixDir = env.Dir('$INSTALL_DIR') + + actions = [] + targetDir = prefixDir.Dir(target) + + actions = SCons.Script.Install( + target=targetDir, + source=source, + ) + for s in map(env.Entry, env.Flatten(source)): + setattr(s.attributes, "aib_install_actions", actions) + + tags = kwargs.get('INSTALL_ALIAS', []) + if tags: + env.Alias(tags, actions) + + return actions + + env.AddMethod(tag_install, 'Install') + + def auto_install_emitter(target, source, env): + for t in target: + tentry = env.Entry(t) + # We want to make sure that the executor information stays + # persisted for this node after it is built so that we can + # access it in our install emitter below. + tentry.attributes.keep_targetinfo = 1 + tsuf = tentry.get_suffix() + auto_install_location = suffix_map.get(tsuf) + if auto_install_location: + tentry_install_tags = env.get('INSTALL_ALIAS', []) + setattr(tentry.attributes, 'INSTALL_ALIAS', tentry_install_tags) + install = env.Install(auto_install_location, tentry, INSTALL_ALIAS=tentry_install_tags) + return (target, source) + + def add_emitter(builder): + base_emitter = builder.emitter + new_emitter = SCons.Builder.ListEmitter([base_emitter, auto_install_emitter]) + builder.emitter = new_emitter + + target_builders = ['Program', 'SharedLibrary', 'LoadableModule', 'StaticLibrary'] + for builder in target_builders: + builder = env['BUILDERS'][builder] + add_emitter(builder) + + def scan_for_transitive_install(node, env, path=()): + results = [] + install_sources = node.sources + for install_source in install_sources: + is_executor = install_source.get_executor() + is_targets = is_executor.get_all_targets() + for is_target in is_targets: + grandchildren = is_target.children() + for grandchild in grandchildren: + actions = getattr(grandchild.attributes, "aib_install_actions", None) + if actions: + results.extend(actions) + results = sorted(results, key=lambda t: str(t)) + return results + + from SCons.Tool import install + base_install_builder = install.BaseInstallBuilder + assert(base_install_builder.target_scanner == None) + + base_install_builder.target_scanner = SCons.Scanner.Scanner( + function=scan_for_transitive_install, + path_function=None, + ) diff --git a/src/mongo/SConscript b/src/mongo/SConscript index 454398de46f..9b01c14b267 100644 --- a/src/mongo/SConscript +++ b/src/mongo/SConscript @@ -358,26 +358,31 @@ mongod = env.Program( 'mongodmain', ], ) -env.Default(env.Install('#/', mongod)) + +hygienic = get_option('install-mode') == 'hygienic' + +if not hygienic: + env.Default(env.Install('#/', mongod)) # tools rewrittenTools = [ "mongodump", "mongorestore", "mongoexport", "mongoimport", "mongostat", "mongotop", "bsondump", "mongofiles" ] # mongoperf -env.Install( - '#/', - [ - env.Program("mongoperf", - [ - "client/examples/mongoperf.cpp", - ] + env.WindowsResourceFile("client/examples/mongoperf.rc"), - LIBDEPS=[ - "base", - "db/serveronly", - "db/storage/mmap_v1/logfile", - "db/storage/mmap_v1/mmap", - ]), - ]) +if not hygienic: + env.Install( + '#/', + [ + env.Program("mongoperf", + [ + "client/examples/mongoperf.cpp", + ] + env.WindowsResourceFile("client/examples/mongoperf.rc"), + LIBDEPS=[ + "base", + "db/serveronly", + "db/storage/mmap_v1/logfile", + "db/storage/mmap_v1/mmap", + ]), + ]) if env.TargetOSIs('windows'): generatedServerManifest = env.Substfile( @@ -394,43 +399,44 @@ if env.TargetOSIs('windows'): env.Depends("s/server.res", generatedServerManifest) # mongos -env.Install( - '#/', - env.Program( - target='mongos', - source=[ - 's/cluster_cursor_stats.cpp', - 's/mongos_options.cpp', - 's/mongos_options_init.cpp', - 's/s_sharding_server_status.cpp', - 's/server.cpp', - 's/service_entry_point_mongos.cpp', - 's/sharding_uptime_reporter.cpp', - 's/version_mongos.cpp', - ] + env.WindowsResourceFile("s/server.rc"), - LIBDEPS=[ - 'db/commands/core', - 'db/commands/server_status', - 'db/ftdc/ftdc_mongos', - 'db/logical_time_metadata_hook', - 'db/mongodandmongos', - 'db/server_options', - 'db/stats/counters', - 's/client/sharding_connection_hook', - 's/commands/cluster_commands', - 's/commands/shared_cluster_commands', - 's/coreshard', - 's/is_mongos', - 's/sharding_egress_metadata_hook_for_mongos', - 's/sharding_initialization', - 'transport/service_entry_point', - 'transport/transport_layer_manager', - 'util/clock_sources', - 'util/fail_point', - 'util/ntservice', - 'util/options_parser/options_parser_init', - 'util/version_impl', - ])) +if not hygienic: + env.Install( + '#/', + env.Program( + target='mongos', + source=[ + 's/cluster_cursor_stats.cpp', + 's/mongos_options.cpp', + 's/mongos_options_init.cpp', + 's/s_sharding_server_status.cpp', + 's/server.cpp', + 's/service_entry_point_mongos.cpp', + 's/sharding_uptime_reporter.cpp', + 's/version_mongos.cpp', + ] + env.WindowsResourceFile("s/server.rc"), + LIBDEPS=[ + 'db/commands/core', + 'db/commands/server_status', + 'db/ftdc/ftdc_mongos', + 'db/logical_time_metadata_hook', + 'db/mongodandmongos', + 'db/server_options', + 'db/stats/counters', + 's/client/sharding_connection_hook', + 's/commands/cluster_commands', + 's/commands/shared_cluster_commands', + 's/coreshard', + 's/is_mongos', + 's/sharding_egress_metadata_hook_for_mongos', + 's/sharding_initialization', + 'transport/service_entry_point', + 'transport/transport_layer_manager', + 'util/clock_sources', + 'util/fail_point', + 'util/ntservice', + 'util/options_parser/options_parser_init', + 'util/version_impl', + ])) env.Library("linenoise_utf8", source=[ @@ -518,7 +524,8 @@ if not has_option('noshell') and usemozjs: ] ) - shellEnv.Install( '#/', mongo_shell ) + if not hygienic: + shellEnv.Install( '#/', mongo_shell ) else: shellEnv = None @@ -560,7 +567,8 @@ def installBinary( e, name ): name, debug_sym_cmd ) - e.Install("#/", debug_sym) + if not hygienic: + e.Install("#/", debug_sym) e.Alias('debugsymbols', debug_sym) distDebugSymbols.append(debug_sym) @@ -574,10 +582,11 @@ def installBinary( e, name ): else: distBinaries.append(name) - inst = e.Install( "$INSTALL_DIR/bin", name ) + if not hygienic: + inst = e.Install( "$INSTALL_DIR/bin", name ) - if env.TargetOSIs('posix'): - e.AddPostAction( inst, 'chmod 755 $TARGET' ) + if env.TargetOSIs('posix'): + e.AddPostAction( inst, 'chmod 755 $TARGET' ) def installExternalBinary( e, name_str ): name = env.File("#/%s" % add_exe(name_str)) @@ -585,11 +594,12 @@ def installExternalBinary( e, name_str ): env.FatalError("ERROR: external binary not found: {0}", name) distBinaries.append(name) - inst = e.Install( "$INSTALL_DIR/bin", name ) - if env.TargetOSIs('posix'): - e.AddPostAction( inst, 'chmod 755 $TARGET' ) + if not hygienic: + inst = e.Install( "$INSTALL_DIR/bin", name ) + if env.TargetOSIs('posix'): + e.AddPostAction( inst, 'chmod 755 $TARGET' ) # "--use-new-tools" adds dependencies for rewritten (Go) tools # It is required for "dist" but optional for "install" @@ -723,4 +733,5 @@ debug_symbols_dist = env.Command( env.Alias('dist-debugsymbols', debug_symbols_dist) #final alias -env.Alias( "install", "$INSTALL_DIR" ) +if not hygienic: + env.Alias( "install", "$INSTALL_DIR" ) diff --git a/src/mongo/client/embedded/SConscript b/src/mongo/client/embedded/SConscript index 49878d86a70..48768719cf4 100644 --- a/src/mongo/client/embedded/SConscript +++ b/src/mongo/client/embedded/SConscript @@ -1,6 +1,7 @@ # -*- mode: python; -*- Import("env") +Import("get_option") env = env.Clone() @@ -105,11 +106,19 @@ capi = env.Library( '$BUILD_DIR/mongo/db/service_context', '$BUILD_DIR/mongo/transport/transport_layer_mock', 'embedded', - ] + ], + INSTALL_ALIAS='mobile-dev', ) env.Alias('embedded_capi', capi) +if get_option('install-mode') == 'hygienic': + env.Install( + 'include', + source=['libmongodbcapi.h'], + INSTALL_ALIAS='mobile-dev' + ) + capiTest = env.Program( target='mongo_embedded_capi_test', source=[ @@ -147,7 +156,8 @@ embeddedTransport = env.Library( SYSLIBDEPS=[ 'mongoc-1.0', 'bson-1.0', - ] + ], + INSTALL_ALIAS='mobile-dev' ) env.Alias('embedded_capi', embeddedTransport) |