summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Morrow <acm@mongodb.com>2018-03-03 08:08:08 -0500
committerAndrew Morrow <acm@mongodb.com>2018-03-06 09:57:57 -0500
commit5dfa372b25b1a26bb12e09fdb029ff219b0f5343 (patch)
tree2c23324cb72eae116c4a03a72141d0a9716884d8
parent80625c63d47a1d9306958d7ea95154d12c10cade (diff)
downloadmongo-5dfa372b25b1a26bb12e09fdb029ff219b0f5343.tar.gz
SERVER-32117 Minimal hygienic build to support mobile dev
-rw-r--r--SConstruct35
-rw-r--r--site_scons/site_tools/auto_install_binaries.py83
-rw-r--r--src/mongo/SConscript133
-rw-r--r--src/mongo/client/embedded/SConscript14
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)