X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=SConstruct;h=60683ef60788ec0cb049e9c37ab14248fc02e69e;hb=d9143facc7806e2c03ee357fd9697ea9a1277377;hp=ad342c9b0d0ca3b76552052103322953389d7153;hpb=a5d6a20ef608461a1932b4983139e8a3c1facada;p=senf.git diff --git a/SConstruct b/SConstruct index ad342c9..60683ef 100644 --- a/SConstruct +++ b/SConstruct @@ -1,6 +1,6 @@ # -*- python -*- -import sys, glob, os.path, fnmatch +import sys, os.path, fnmatch import SENFSCons, senfutil ########################################################################### @@ -21,37 +21,39 @@ env.Tool('Boost') env.Tool('CombinedObject') env.Tool('PhonyTarget') env.Tool('InstallDir') +env.Tool('CreateFile') env.Help(""" Additional top-level build targets: -prepare Create all target files not part of the repository -default Build all default targets (like calling scons with no arguments) -examples Build all examples -all_tests Build and run unit tests for all modules -all_docs Build documentation for all modules -all Build everything -install_all Install SENF into $$PREFIX -deb Build debian source and binary package -debsrc Build debian source package -debbin Build debian binary package -linklint Check links of doxygen documentation with 'linklint' -fixlinks Fix broken links in doxygen documentation -valgrind Run all tests under valgrind/memcheck -lcov Generate test coverage output in doc/lcov and lcov.info +prepare Create all target files not part of the repository +default Build all default targets (like calling scons with no arguments) +examples Build all examples +all_tests Build and run unit tests for all modules +all_docs Build documentation for all modules +all Build everything +install_all Install SENF into $$PREFIX +deb Build debian source and binary package +debsrc Build debian source package +debbin Build debian binary package +linklint Check links of doxygen documentation with 'linklint' +fixlinks Fix broken links in doxygen documentation +all_valgrinds Run all tests under valgrind/memcheck +lcov Generate test coverage output in doc/lcov and lcov.info """) env.Append( ENV = { 'PATH' : os.environ.get('PATH'), 'HOME' : os.environ.get('HOME') }, - CLEAN_PATTERNS = [ '*~', '#*#', '*.pyc', 'semantic.cache', '.sconsign*', - '*.gcno', '*.gcda', '*.gcov' ], + CLEAN_PATTERNS = [ '*~', '#*#', '*.pyc', 'semantic.cache', '.sconsign*' ], - CPPPATH = [ '#' ], - LOCALLIBDIR = '#', + BUILDDIR = '#', + CPPPATH = [ '$BUILDDIR', '#' ], + LOCALLIBDIR = '$BUILDDIR', LIBPATH = [ '$LOCALLIBDIR' ], LIBS = [ '$LIBSENF$LIBADDSUFFIX', 'rt', '$BOOSTREGEXLIB', '$BOOSTIOSTREAMSLIB', '$BOOSTSIGNALSLIB', '$BOOSTFSLIB' ], TEST_EXTRA_LIBS = [ ], + VALGRINDARGS = [ '--num-callers=50' ], PREFIX = '#/dist', LIBINSTALLDIR = '$PREFIX${syslayout and "/lib" or ""}', @@ -98,8 +100,10 @@ env.SetDefault( LIBSENF = "senf", LCOV = "lcov", GENHTML = "genhtml", - SCONS = "./tools/scons -j$CONCURRENCY_LEVEL", + SCONSBIN = env.File("#/tools/scons"), + SCONS = "@$SCONSBIN -Q -j$CONCURRENCY_LEVEL", CONCURRENCY_LEVEL = env.GetOption('num_jobs') or 1, + TOPDIR = env.Dir('#').abspath, ) # Set variables from command line @@ -119,7 +123,7 @@ if not os.path.exists("doclib/Doxyfile.local"): if not env.GetOption('clean') and not os.path.exists(".prepare-stamp") \ and not os.environ.get("SCONS") and COMMAND_LINE_TARGETS != [ 'prepare' ]: - env.Execute([ "scons prepare" ]) + env.Execute([ "$SCONS prepare" ]) # Load SConscripts @@ -127,7 +131,10 @@ SConscriptChdir(0) SConscript("debian/SConscript") SConscriptChdir(1) if os.path.exists('SConscript.local') : SConscript('SConscript.local') -SConscript("senf/SConscript") +if env['BUILDDIR'] == '#': + SConscript("SConscript") +else: + SConscript("SConscript", variant_dir=env['BUILDDIR'], src_dir='#', duplicate=False) SConscript("Examples/SConscript") SConscript("HowTos/SConscript") SConscript("doclib/SConscript") @@ -135,20 +142,6 @@ SConscript("doclib/SConscript") ########################################################################### # Define build targets -#### libsenf.a -libsenf = env.Library("$LOCALLIBDIR/${LIBSENF}${LIBADDSUFFIX}", env['ALLOBJECTS']) -env.Default(libsenf) -env.Install('$LIBINSTALLDIR', libsenf) - -def create(target, source, env): - file(str(target[0]), 'w').write(source[0].get_contents()+"\n") -env['BUILDERS']['CreateFile'] = Builder(action = create) - -conf = env.CreateFile("${LOCALLIBDIR}/${LIBSENF}${LIBADDSUFFIX}.conf", - env.Value(env.subst("$_CPPDEFFLAGS"))) -env.Default(conf) -env.Install('$CONFINSTALLDIR', conf) - #### install_all, default, all_tests, all env.Install('${SCONSINSTALLDIR}', [ 'site_scons/__init__.py', 'site_scons/senfutil.py', @@ -166,37 +159,45 @@ env.Alias('all', [ 'default', 'all_tests', 'examples', 'all_docs' ]) env.PhonyTarget('prepare', [], []) #### valgrind -env.PhonyTarget('valgrind', [ 'all_tests' ], [ """ - find -name .test.bin - | while read test; do - echo; - echo "Running $$test"; - echo; - valgrind --tool=memcheck --error-exitcode=99 --suppressions=tools/valgrind.sup - $$test $BOOSTTESTARGS; - [ $$? -ne 99 ] || exit 1; - done -""".replace("\n"," ") ]) +for test in env.FindAllBoostUnitTests(): + stamp = env.Command(test[0].dir.File('.test-valgrind.stamp'), + [ test[0].dir.File('.test.bin'), 'tools/valgrind.sup' ], + [ """valgrind --tool=memcheck + --error-exitcode=99 + --suppressions=${SOURCES[1]} + $VALGRINDARGS + ${SOURCES[0]} $BOOSTTESTARGS; + [ $$? -ne 99 ] || exit 1""".replace("\n"," "), + Touch("$TARGET") ]) + alias = env.Command(test[0].dir.File('valgrind'), stamp, [ env.NopAction() ]) + env.Alias('all_valgrinds', alias) ### lcov env.PhonyTarget('lcov', [], [ - '$SCONS debug=1 CCFLAGS+="-fprofile-arcs -ftest-coverage" LIBS+="gcov" all_tests', - '$LCOV --directory . --capture --output-file /tmp/senf_lcov.info --base-directory .', - '$LCOV --output-file ${TARGETS[1]} --remove /tmp/senf_lcov.info \\*/include/\\*', - '$GENHTML --output-directory ${TARGETS[0]} --title all_tests ${TARGETS[1]}', + '$SCONS debug=1 BUILDDIR="#/lcov-build" CCFLAGS+="-fprofile-arcs -ftest-coverage" LIBS+="gcov" all_tests', + '$LCOV --follow --directory $TOPDIR/lcov-build/senf --capture --output-file /tmp/senf_lcov.info --base-directory $TOPDIR', + '$LCOV --output-file lcov.info --remove /tmp/senf_lcov.info "*/include/*" "*/boost/*" "*.test.*" ', + '$GENHTML --output-directory doc/lcov --title all_tests lcov.info', 'rm /tmp/senf_lcov.info' ]) - +if env.GetOption('clean'): + env.Clean('lcov', [ os.path.join(path,f) + for path, subdirs, files in os.walk('.') + for pattern in ('*.gcno', '*.gcda', '*.gcov') + for f in fnmatch.filter(files,pattern) ] + + [ 'lcov.info', env.Dir('doc/lcov'), env.Dir('lcov-build') ]) + #### clean -env.Clean('all', '.prepare-stamp') -env.Clean('all', libsenf) -env.Clean('all', env.Dir('dist')) -env.Clean('all', 'lcov.info') +env.Clean('all', ('.prepare-stamp', env.Dir('dist'))) +if env.GetOption('clean') : env.Depends('all', ('lcov', 'all_valgrinds')) -if env.GetOption('clean'): +if env.GetOption('clean') and 'all' in BUILD_TARGETS: env.Clean('all', [ os.path.join(path,f) for path, subdirs, files in os.walk('.') for pattern in env['CLEAN_PATTERNS'] for f in fnmatch.filter(files,pattern) ]) + # Disable writing to the deleted .sconsign file + import SCons.SConsign + SCons.SConsign.write = lambda : None if not env.GetOption('clean') and not os.path.exists(".prepare-stamp"): Execute(Touch(".prepare-stamp"))