summaryrefslogtreecommitdiff
path: root/src/SConscript.client
diff options
context:
space:
mode:
Diffstat (limited to 'src/SConscript.client')
-rw-r--r--src/SConscript.client182
1 files changed, 156 insertions, 26 deletions
diff --git a/src/SConscript.client b/src/SConscript.client
index 74bd73c9c66..e30c73fcbb4 100644
--- a/src/SConscript.client
+++ b/src/SConscript.client
@@ -2,14 +2,19 @@
# This SConscript describes build and install rules for the Mongo C++ driver and associated exmaple
# programs.
+Import('env has_option installSetup use_system_version_of_library')
-Import('env clientEnv')
+Import('nix linux darwin windows')
+
+buildShared = False
+if has_option("sharedclient"):
+ buildShared = True
env.Command(['mongo/base/error_codes.h', 'mongo/base/error_codes.cpp',],
['mongo/base/generate_error_codes.py', 'mongo/base/error_codes.err'],
'$PYTHON $SOURCES $TARGETS')
-env.Command(['mongo/db/auth/action_type.h', 'mongo/db/auth/action_type.cpp'],
+env.Command(['mongo/db/auth/action_type.h', 'mongo/db/auth/action_type.cpp'],
['mongo/db/auth/generate_action_types.py', 'mongo/db/auth/action_types.txt'],
'$PYTHON $SOURCES $TARGETS')
@@ -37,7 +42,6 @@ clientSourceBasic = [
'mongo/client/dbclient.cpp',
'mongo/client/dbclient_rs.cpp',
'mongo/client/dbclientcursor.cpp',
- 'mongo/client/distlock.cpp',
'mongo/client/gridfs.cpp',
'mongo/client/model.cpp',
'mongo/client/sasl_client_authenticate.cpp',
@@ -60,6 +64,7 @@ clientSourceBasic = [
'mongo/util/concurrency/mutexdebugger.cpp',
'mongo/util/debug_util.cpp',
'mongo/util/stacktrace.cpp',
+ 'mongo/util/file.cpp',
'mongo/util/file_allocator.cpp',
'mongo/util/fail_point.cpp',
'mongo/util/fail_point_registry.cpp',
@@ -76,6 +81,8 @@ clientSourceBasic = [
'mongo/util/net/sock.cpp',
'mongo/util/net/ssl_manager.cpp',
'mongo/util/password.cpp',
+ 'mongo/util/processinfo.cpp',
+ env.File('mongo/util/processinfo_${PYSYSPLATFORM}.cpp'),
'mongo/util/ramlog.cpp',
'mongo/util/signal_handlers.cpp',
'mongo/util/stringutils.cpp',
@@ -85,14 +92,17 @@ clientSourceBasic = [
'mongo/util/trace.cpp',
'mongo/util/util.cpp',
'mongo/util/version.cpp',
+ 'third_party/murmurhash3/MurmurHash3.cpp',
]
clientSourceSasl = ['mongo/client/sasl_client_authenticate_impl.cpp',
- 'mongo/util/gsasl_session.cpp']
+ 'mongo/client/sasl_client_session.cpp']
clientSourceAll = clientSourceBasic + clientSourceSasl
-if env['MONGO_BUILD_SASL_CLIENT']:
+usingSasl = env['MONGO_BUILD_SASL_CLIENT']
+
+if usingSasl:
clientSource = clientSourceAll
else:
clientSource = clientSourceBasic
@@ -125,8 +135,8 @@ clientHeaderDirectories = [
"util/",
"util/concurrency/",
"util/mongoutils/",
- "util/net/",
- ""
+ "util/net/",
+ ""
]
clientHeaders = []
@@ -134,16 +144,145 @@ for path in clientHeaderDirectories:
clientHeaders.extend(Glob('mongo/%s/*.h' % path))
clientHeaders.extend(Glob('mongo/%s/*.hpp' % path))
-mongoclient_lib = env.Library('mongoclient', clientSource),
-mongoclient_install = env.Install('#/', [
- mongoclient_lib,
- #env.SharedLibrary('mongoclient', clientSource),
- ])
-env.Alias('mongoclient', mongoclient_install)
+# This relies on static and shared objects being the same, since we will link these object
+# files twice: once into a .a, and another time into a .so
+clientObjects = [env.Object(source) for source in clientSource]
+
+mongoClientLibs = []
+mongoClientLibDeps = []
+mongoClientSysLibDeps = []
+
+if usingSasl:
+ mongoClientSysLibDeps += ["sasl2"]
+
+if not use_system_version_of_library("boost"):
+ mongoClientLibDeps.append(['$BUILD_DIR/third_party/shim_boost'])
+
+mongoClientInstalls = []
+mongoClientPrefixInstalls = []
+
+if windows and buildShared:
+ print("Building the client driver as a DLL is not supported, see SERVER-5650")
+ Exit(1)
+
+staticLibEnv = env.Clone()
+staticLibEnv.AppendUnique(
+ LIBDEPS=mongoClientLibDeps,
+ SYSLIBDEPS=mongoClientSysLibDeps)
+
+mongoClientStaticLib = staticLibEnv.StaticLibrary(
+ 'mongoclient', clientObjects),
+mongoClientInstalls.append(staticLibEnv.Install('#/', mongoClientStaticLib))
+
+if installSetup.libraries:
+ mongoClientPrefixInstalls.append(env.Install("$INSTALL_DIR/lib", mongoClientStaticLib))
+
+mongoClientSharedLib = None
+
+if buildShared:
+
+ # TODO: When we are ready to set a SONAME for mongoclient, set SHLIBVERSION=x.y.z in this
+ # environment to enable SCons versioned shared library support, and then change the two
+ # 'Install' calls in this block to 'InstallVersionedLibrary'. SHLIBVERSION and
+ # InstallVersionedLibrary support is only stable in SCons > 2.3.0, so if you add support
+ # here, be sure to add an EnsuredSconsVersion here as well.
+ sharedLibEnv = env.Clone()
+ sharedLibEnv.AppendUnique(
+ LIBS=mongoClientLibs + mongoClientSysLibDeps,
+ # TODO: This currently causes the files for the libdep to get dragged into dependents
+ # of this shared library, incorrectly. We need to patch up libdeps to treat shared
+ # libraries as dependency terminals.
+ LIBDEPS=mongoClientLibDeps)
+
+ if linux:
+ sharedLibEnv.AppendUnique(SHLINKFLAGS=["-Wl,--as-needed", "-Wl,-zdefs"])
+
+ mongoClientSharedLib = sharedLibEnv.SharedLibrary('mongoclient', clientObjects)
+
+ mongoClientSharedLibInstall = sharedLibEnv.Install(
+ '#/sharedclient', mongoClientSharedLib)
+
+ if darwin:
+ # Set up the copy of the client library in #/sharedclient so that things that link
+ # against it record the local directory as the install_name.
+ sharedLibEnv.AddPostAction(
+ mongoClientSharedLibInstall,
+ "install_name_tool -id @executable_path/%s %s" % (
+ mongoClientSharedLibInstall[0].name,
+ mongoClientSharedLibInstall[0]
+ ))
+ mongoClientInstalls.append(mongoClientSharedLibInstall)
-clientTests = clientEnv.Install('#/', [
- clientEnv.Program(target,
- [source, mongoclient_lib]) for (target, source) in exampleSourceMap])
+ if installSetup.libraries:
+ mongoClientSharedLibPrefixInstall = sharedLibEnv.Install(
+ '$INSTALL_DIR/lib', mongoClientSharedLib)
+ if darwin:
+ sharedLibEnv.AddPostAction(
+ mongoClientSharedLibPrefixInstall,
+ "install_name_tool -id %s %s" % (
+ mongoClientSharedLibPrefixInstall[0],
+ mongoClientSharedLibPrefixInstall[0]
+ ))
+ mongoClientPrefixInstalls.append(mongoClientSharedLibPrefixInstall)
+
+env.Alias('mongoclient', mongoClientInstalls)
+
+if installSetup.headers:
+ for x in clientHeaderDirectories:
+ inst = env.Install("$INSTALL_DIR/include/mongo/" + x,
+ [Glob('mongo/%s*.h' % x), Glob('mongo/%s*.hpp' % x)])
+ env.AddPostAction(inst, Chmod('$TARGET', 0644))
+ mongoClientPrefixInstalls.append(inst)
+
+if installSetup.headers or installSetup.libraries:
+ env.Alias('install-mongoclient', mongoClientPrefixInstalls)
+
+clientEnv = env.Clone()
+clientEnv['CPPDEFINES'].remove('MONGO_EXPOSE_MACROS')
+
+# Compile the example files to .o so that we can link them twice: once statically, once shared.
+exampleObjMap = [(target, clientEnv.Object(source)) for (target, source) in exampleSourceMap]
+
+# Create an environment for linking the examples to the static library. For out of tree builds,
+# we need to use LIBS. For in-tree builds we need LIBDEPS.
+staticClientEnv = clientEnv.Clone()
+if '_LIBDEPS' in clientEnv:
+ staticClientEnv.PrependUnique(LIBDEPS=[mongoClientStaticLib])
+else:
+ # We need the mongo client library to preceed the boost libraries.
+ staticClientEnv.PrependUnique(LIBS=[mongoClientStaticLib])
+
+# Build each statically linked client program
+staticClientPrograms = [staticClientEnv.Program(target, obj) for (target, obj) in exampleObjMap]
+
+# Install them to the root, and append the install targets to the list of client tests
+clientTests = staticClientEnv.Install("#/", staticClientPrograms)
+
+# Do the same for the shared library case, if we are doing that.
+if buildShared:
+ sharedClientEnv = clientEnv.Clone()
+
+ # Arrange for the tests to link against the mongoclient in the #/sharedclient directory.
+ sharedClientEnv.PrependUnique(
+ LIBS=['mongoclient'],
+ LIBPATH=["#/sharedclient"]
+ )
+
+ # Deal with the different lookup models between regular UNIX and Darwin. For regular unix,
+ # we set $ORIGIN to pull the copy we run against from the current directory
+ # (#/sharedclient). On Darwin, the staged copy of the mongoclient dylib in #sharedclient
+ # has @executable path set as its install_name, so we pick up the same behavior that way.
+ if nix and not darwin:
+ sharedClientEnv.PrependUnique(
+ LINKFLAGS="-Wl,-z,origin",
+ RPATH=[sharedClientEnv.Literal("\\$$ORIGIN")])
+
+ sharedClientPrograms = [
+ sharedClientEnv.Program("sharedclient/" + target, obj) for (target, obj) in exampleObjMap]
+ env.Depends(sharedClientPrograms, mongoClientInstalls)
+
+ sharedClientProgramInstalls = sharedClientEnv.Install("#/sharedclient", sharedClientPrograms)
+ clientTests.append(sharedClientProgramInstalls)
clientTests.append(
clientEnv.Install('#/', clientEnv.Program('bsondemo', 'mongo/bson/bsondemo/bsondemo.cpp')))
@@ -161,6 +300,7 @@ env.Install(
'mongo/base/error_codes.err',
'mongo/db/auth/generate_action_types.py',
'mongo/db/auth/action_types.txt',
+ 'third_party/murmurhash3/MurmurHash3.h',
'#buildscripts/make_archive.py',
clientSourceAll,
clientHeaders,
@@ -173,13 +313,3 @@ env.Install(
'--transform distsrc/client=$CLIENT_DIST_BASENAME '
'--transform =$CLIENT_DIST_BASENAME/ '
'${TEMPFILE(SOURCES[1:])}'))
-
-# install
-prefix = GetOption("prefix")
-
-env.Install(prefix + "/lib", '${LIBPREFIX}mongoclient${LIBSUFFIX}')
-
-for x in clientHeaderDirectories:
- inst = env.Install(prefix + "/include/mongo/" + x,
- [Glob('mongo/%s*.h' % x), Glob('mongo/%s*.hpp' % x)])
- env.AddPostAction(inst, Chmod('$TARGET', 0644))