diff options
author | Andrew Morrow <acm@10gen.com> | 2013-12-22 10:30:25 -0500 |
---|---|---|
committer | Andrew Morrow <acm@mongodb.com> | 2014-04-11 15:52:35 -0400 |
commit | 911bbc14a87ded7d53066d9e23ca9cd942107da4 (patch) | |
tree | dc7cb92deb8fa5876df653115b6ba749bbf7875b /SConstruct | |
parent | d53521c9534d579d44582bb06cb37d73ffeab931 (diff) | |
download | mongo-911bbc14a87ded7d53066d9e23ca9cd942107da4.tar.gz |
SERVER-12189 Enable libstdc++ debugging features for debug builds when possible
Diffstat (limited to 'SConstruct')
-rw-r--r-- | SConstruct | 70 |
1 files changed, 51 insertions, 19 deletions
diff --git a/SConstruct b/SConstruct index 448e45bd15b..7ad147677ee 100644 --- a/SConstruct +++ b/SConstruct @@ -131,6 +131,13 @@ def has_option( name ): def use_system_version_of_library(name): return has_option('use-system-all') or has_option('use-system-' + name) +# Returns true if we have been configured to use a system version of any C++ library. If you +# add a new C++ library dependency that may be shimmed out to the system, add it to the below +# list. +def using_system_version_of_cxx_libraries(): + cxx_library_names = ["tcmalloc", "boost", "v8"] + return True in [use_system_version_of_library(x) for x in cxx_library_names] + def get_variant_dir(): if has_option('variant-dir'): return "#build/" + get_option('variant-dir') @@ -1228,6 +1235,7 @@ def doConfigure(myenv): Exit(1) myenv.AppendUnique(LINKFLAGS=[min_version_flag]) + usingLibStdCxx = False if has_option('libc++'): if not using_clang(): print( 'libc++ is currently only supported for clang') @@ -1239,29 +1247,46 @@ def doConfigure(myenv): else: print( 'libc++ requested, but compiler does not support -stdlib=libc++' ) Exit(1) + else: + def CheckLibStdCxx(context): + test_body = """ + #include <vector> + #if !defined(__GLIBCXX__) + #error + #endif + """ - # Check to see if we are trying to use an outdated libstdc++ in C++11 mode. This is - # primarly to help people using clang in C++11 mode on OS X but forgetting to use - # --libc++. We would, ideally, check the __GLIBCXX__ version, but for various reasons this - # is not workable. Instead, we switch on the fact that std::is_nothrow_constructible wasn't - # introduced until libstdc++ 4.6.0. Earlier versions of libstdc++ than 4.6 are unlikely to - # work well anyway. - if has_option('c++11') and not has_option('libc++'): + context.Message('Checking if we are using libstdc++... ') + ret = context.TryCompile(textwrap.dedent(test_body), ".cpp") + context.Result(ret) + return ret + + conf = Configure(myenv, help=False, custom_tests = { + 'CheckLibStdCxx' : CheckLibStdCxx, + }) + usingLibStdCxx = conf.CheckLibStdCxx() + conf.Finish() + + # Check to see if we are trying to use an elderly libstdc++, which we arbitrarily define as + # 4.6.0. This is primarly to help people using clang in C++11 mode on OS X but forgetting + # to use --libc++. We also use it to decide if we trust the libstdc++ debug mode. We would, + # ideally, check the __GLIBCXX__ version, but for various reasons this is not + # workable. Instead, we switch on the fact that _GLIBCXX_BEGIN_NAMESPACE_VERSION wasn't + # introduced until libstdc++ 4.6.0. + + haveGoodLibStdCxx = False + if usingLibStdCxx: def CheckModernLibStdCxx(context): test_body = """ #include <vector> - #include <cstdlib> - #if defined(__GLIBCXX__) - #include <type_traits> - int main() { - return std::is_nothrow_constructible<int>::value ? EXIT_SUCCESS : EXIT_FAILURE; - } + #if !defined(_GLIBCXX_BEGIN_NAMESPACE_VERSION) + #error libstdcxx older than 4.6.0 #endif """ - context.Message('Checking for libstdc++ 4.6.0 or better (for C++11 support)... ') + context.Message('Checking for libstdc++ 4.6.0 or better... ') ret = context.TryCompile(textwrap.dedent(test_body), ".cpp") context.Result(ret) return ret @@ -1272,11 +1297,18 @@ def doConfigure(myenv): haveGoodLibStdCxx = conf.CheckModernLibStdCxx() conf.Finish() - if not haveGoodLibStdCxx: - print( 'Detected libstdc++ is too old to support C++11 mode' ) - if darwin: - print( 'Try building with --libc++ and --osx-version-min=10.7 or higher' ) - Exit(1) + if has_option('c++11') and usingLibStdCxx and not haveGoodLibStdCxx: + print( 'Detected libstdc++ is too old to support C++11 mode' ) + if darwin: + print( 'Try building with --libc++ and --osx-version-min=10.7 or higher' ) + Exit(1) + + # If we are using a modern libstdc++ and this is a debug build and we control all C++ + # dependencies, then turn on the debugging features in libstdc++. + if debugBuild and usingLibStdCxx and haveGoodLibStdCxx: + # We can't do this if we are using any system C++ libraries. + if (not using_system_version_of_cxx_libraries()): + myenv.Append(CPPDEFINES=["_GLIBCXX_DEBUG"]); if has_option('sanitize'): if not (using_clang() or using_gcc()): |