X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=SConstruct;h=60683ef60788ec0cb049e9c37ab14248fc02e69e;hb=d9143facc7806e2c03ee357fd9697ea9a1277377;hp=62d7d2f812f54b3f8dfcaa1eb97d524d2c7a5a38;hpb=5ceb63a298ed229780e2b5b7638b1efc1f03c337;p=senf.git diff --git a/SConstruct b/SConstruct index 62d7d2f..60683ef 100644 --- a/SConstruct +++ b/SConstruct @@ -1,20 +1,15 @@ # -*- python -*- -import sys, glob, os.path, fnmatch +import sys, os.path, fnmatch import SENFSCons, senfutil -# Fix for SCons 0.97 compatibility -try: - BoolVariable -except NameError: - BoolVariable = BoolOption - ########################################################################### # Load utilities and setup libraries and configure build env = Environment() env.Decider('MD5-timestamp') +env.EnsureSConsVersion(1,2) # Load all the local SCons tools env.Tool('Doxygen') @@ -26,35 +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 +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') }, + ENV = { 'PATH' : os.environ.get('PATH'), 'HOME' : os.environ.get('HOME') }, 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,10 +97,13 @@ env.Append( ) env.SetDefault( - LIBSENF = "senf", - final = False, - debug = False, - syslayout = False + LIBSENF = "senf", + LCOV = "lcov", + GENHTML = "genhtml", + 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 @@ -116,12 +118,12 @@ Export('env') # Create Doxyfile.local otherwise doxygen will barf on this non-existent file # Create it even when cleaning, to silence the doxygen builder warnings -if not os.path.exists("Doxyfile.local"): - Execute(Touch("Doxyfile.local")) +if not os.path.exists("doclib/Doxyfile.local"): + Execute(Touch("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 @@ -129,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") @@ -137,23 +142,6 @@ SConscript("doclib/SConscript") ########################################################################### # Define build targets -#### doc -env.Depends(SENFSCons.Doxygen(env), env.Value(env['ENV']['REVISION'])) - -#### 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', @@ -171,29 +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=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 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('linklint')) # env.Dir to disambiguate from linklint PhonyTarget -env.Clean('all', env.Dir('dist')) +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"))