From 2b337e33b40752abdebb721837ada59e314001fb Mon Sep 17 00:00:00 2001 From: Nadav Har'El Date: Tue, 21 Jul 2015 00:05:28 +0300 Subject: [PATCH] build: strip all tests This patch saves almost 20 GB (!!) of disk space in Urchin's build directory, as well as a lot of memory during the link phase of the build (which can be noticable on low-memory machines which leads to slow swapping). Because of C++'s extremely lengthy mangled names, and extremely numerous functions, the debugging information generated for Seastar code is absurdly large, and added to every single executable we generate. This is most noticable in tests - we currently have over 30 tests (with hopefully much more to come), each compiled into a separate excutable with its own copy of all this debug information. Many of these executables are half a gigabyte, each! So this patch creates all test executables - whether debug or release mode - stripped. When a user encounters a failing test he wants debug information for (for gdb or the sanitizer), he can trivially relink it unstripped, with a command like: ninja build/release/tests/urchin/sstable_test_g note the added "_g". This links the already existing object files (which still have their debug information, which takes just a fraction of a second. On my machine, this patch reduces the Urchin built tests from about 27 GB to 8.1 GB. The build/release/tests directory drops from 10 GB to just 0.6 GB! The build/debug/tests directory is still huge (7.5 GB), although still smaller than what it was (17 GB). This remaining hugeness is not because of the debug information, but because of the undefined- behavior sanitizer (-fsanitize=undefined), which unfortunately adds a huge data segment to each executable and I still don't know how to improve on that. Nevertheless, it's still a significant reduction in space and will be even more important as we write more tests. Signed-off-by: Nadav Har'El --- configure.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/configure.py b/configure.py index 737b13f0e9..33f0bec20e 100755 --- a/configure.py +++ b/configure.py @@ -540,7 +540,7 @@ with open(buildfile, 'w') as f: description = LINK $out pool = link_pool rule link_stripped.{mode} - command = $cxx $cxxflags_{mode} -s $ldflags -o $out $in $libs $libs_{mode} + command = $cxx $cxxflags_{mode} -s $ldflags {seastar_libs} -o $out $in $libs $libs_{mode} description = LINK (stripped) $out pool = link_pool rule ar.{mode} @@ -587,8 +587,21 @@ with open(buildfile, 'w') as f: elif binary.endswith('.a'): f.write('build $builddir/{}/{}: ar.{} {}\n'.format(mode, binary, mode, str.join(' ', objs))) else: - f.write('build $builddir/{}/{}: link.{} {} {}\n'.format(mode, binary, mode, str.join(' ', objs), - 'seastar/build/{}/libseastar.a'.format(mode))) + if binary.startswith('tests/'): + # Our code's debugging information is huge, and multiplied + # by many tests yields ridiculous amounts of disk space. + # So we strip the tests by default; The user can very + # quickly re-link the test unstripped by adding a "_g" + # to the test name, e.g., "ninja build/release/testname_g" + f.write('build $builddir/{}/{}: link_stripped.{} {} {}\n'.format(mode, binary, mode, str.join(' ', objs), + 'seastar/build/{}/libseastar.a'.format(mode))) + if has_thrift: + f.write(' libs = -lthrift -lboost_system $libs\n') + f.write('build $builddir/{}/{}_g: link.{} {} {}\n'.format(mode, binary, mode, str.join(' ', objs), + 'seastar/build/{}/libseastar.a'.format(mode))) + else: + f.write('build $builddir/{}/{}: link.{} {} {}\n'.format(mode, binary, mode, str.join(' ', objs), + 'seastar/build/{}/libseastar.a'.format(mode))) if has_thrift: f.write(' libs = -lthrift -lboost_system $libs\n') for src in srcs: