X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senfscons%2FSENFSCons.py;h=90a04ffb72f617ee5d1ab669b5945f3f86d7f4ae;hb=e8217e1c096910e4cace3d22dbce9a257093ed18;hp=d31c844aaad47d6558cb77c7c0c2e7574938b8cc;hpb=8ec0b7ed2df36144b52df5aa40497fc5409c31f7;p=senf.git diff --git a/senfscons/SENFSCons.py b/senfscons/SENFSCons.py index d31c844..90a04ff 100644 --- a/senfscons/SENFSCons.py +++ b/senfscons/SENFSCons.py @@ -25,6 +25,7 @@ import os.path, glob import SCons.Options, SCons.Environment, SCons.Script.SConscript, SCons.Node.FS import SCons.Defaults, SCons.Action +from SCons.Script import * ## \defgroup use Predefined Framework Configurators # @@ -52,6 +53,7 @@ SCONS_TOOLS = [ "CopyToDir", "InstallIncludes", "ProgramNoScan", + "CompileCheck", ] opts = None @@ -70,6 +72,7 @@ def InitOpts(): opts.Add('EXTRA_DEFINES', 'Additional preprocessor defines', '') opts.Add('EXTRA_LIBS', 'Additional libraries to link against', '') opts.Add(SCons.Options.BoolOption('final','Enable optimization',0)) + opts.Add(SCons.Options.BoolOption('debug','Enable debug symbols in binaries',0)) opts.Add('PREFIX', 'Installation prefix', '/usr/local') opts.Add('LIBINSTALLDIR', 'Library install dir', '$PREFIX/lib') opts.Add('BININSTALLDIR', 'Executable install dir', '$PREFIX/bin') @@ -135,6 +138,8 @@ def UseBoost(): opts.Add('BOOST_RUNTIME', 'The boost runtime to use', '') opts.Add('BOOST_DEBUG_RUNTIME', 'The boost debug runtime to use', '') opts.Add('BOOST_LIBDIR', 'The directory of the boost libraries', '') + opts.Add('BOOST_PREFIX', 'The prefix into which boost is installed', '') + opts.Add('BOOST_VERSION', 'The version of boost to use', '') Finalizer(FinalizeBoost) ## \brief Finalize Boost environment @@ -150,14 +155,26 @@ def FinalizeBoost(env): if runtime: runtime = "-" + runtime env['BOOST_VARIANT'] = "-" + env['BOOST_TOOLSET'] + runtime + if env['BOOST_VARIANT'] and env['BOOST_VERSION']: + env['BOOST_VARIANT'] = env['BOOST_VARIANT'] + '-%s' % env['BOOST_VERSION'].replace('.','_') + env['BOOSTTESTLIB'] = 'boost_unit_test_framework' + env['BOOST_VARIANT'] env['BOOSTREGEXLIB'] = 'boost_regex' + env['BOOST_VARIANT'] env['BOOSTFSLIB'] = 'boost_filesystem' + env['BOOST_VARIANT'] env['BOOSTIOSTREAMSLIB'] = 'boost_iostreams' + env['BOOST_VARIANT'] + if env['BOOST_PREFIX']: + env['BOOST_LIBDIR'] = os.path.join(env['BOOST_PREFIX'], 'lib') + env['BOOST_INCLUDES'] = os.path.join(env['BOOST_PREFIX'], + 'include/boost-%s' + % env['BOOST_VERSION'].replace('.','_')) + env.Append(LIBPATH = [ '$BOOST_LIBDIR' ], CPPPATH = [ '$BOOST_INCLUDES' ]) + if env['BOOST_LIBDIR']: + env.Append(ENV = { 'LD_LIBRARY_PATH': env['BOOST_LIBDIR'] }) + ## \brief Use STLPort as STL replacement if available # # Use STLPort as a replacement @@ -242,8 +259,7 @@ def MakeEnvironment(): # These are the default compilation parameters. We should probably # make these configurable - env.Append(CXXFLAGS = [ '-Wall', '-Woverloaded-virtual', '-Wno-long-long' ], - LOCALLIBDIR = [ '#' ], + env.Append(LOCALLIBDIR = [ '#' ], LIBPATH = [ '$LOCALLIBDIR' ]) if env['final']: @@ -251,9 +267,12 @@ def MakeEnvironment(): else: # The boost-regex library is not compiled with _GLIBCXX_DEBUG so this fails: # CPPDEFINES = [ '_GLIBCXX_DEBUG' ], - env.Append(CXXFLAGS = [ '-O0', '-g', '-fno-inline' ], - CPPDEFINES = [ 'SENF_DEBUG' ], - LINKFLAGS = [ '-g', '-rdynamic' ]) + env.Append(CXXFLAGS = [ '-O0', '-g' ], + CPPDEFINES = { 'SENF_DEBUG': ''}) + if env['debug']: + env.Append(LINKFLAGS = [ '-g', '-rdynamic' ]) + else: + env.Append(LINKFLAGS = [ '-Wl,-S', '-rdynamic' ]) env.Append(CPPDEFINES = [ '$EXTRA_DEFINES' ], LIBS = [ '$EXTRA_LIBS' ], @@ -304,15 +323,20 @@ def GlobalTargets(env): def LibPath(lib): return '${LOCALLIBDIR}/${LIBPREFIX}%s${LIBADDSUFFIX}${LIBSUFFIX}' % lib def Test(env, sources, LIBS = [], OBJECTS = []): - test = env.BoostUnitTests( + test = [ env.BoostUnitTests( target = 'test', objects = [], test_sources = sources, LIBS = [ x + '$LIBADDSUFFIX' for x in LIBS ], OBJECTS = OBJECTS, - DEPENDS = [ env.File(LibPath(x)) for x in LIBS ]) + DEPENDS = [ env.File(LibPath(x)) for x in LIBS ]) ] + compileTestSources = [ src for src in sources + if 'COMPILE_CHECK' in file(src).read() ] + if compileTestSources: + test.extend(env.CompileCheck(source = compileTestSources)) env.Alias('all_tests', test) - env.Alias(env.File('test'), test) + env.Command(env.File('test'), test, []) + #env.Alias(env.File('test'), test) ## \brief Build object files @@ -343,26 +367,31 @@ def Objects(env, sources, testSources = None, LIBS = [], OBJECTS = [], no_includ if sources: obsources = [ source for source in sources - if not str(source).endswith('.o') ] + if type(source) is type('') and not source.endswith('.o') ] objects = [ source for source in sources - if str(source).endswith('.o') ] + if type(source) is not type('') or source.endswith('.o') ] if obsources: objects += env.Object(obsources) if testSources: - test = env.BoostUnitTests( + test = [ env.BoostUnitTests( target = 'test', objects = objects, test_sources = testSources, LIBS = [ x + '$LIBADDSUFFIX' for x in LIBS ], OBJECTS = OBJECTS, - DEPENDS = [ env.File(LibPath(x)) for x in LIBS ]) + DEPENDS = [ env.File(LibPath(x)) for x in LIBS ]) ] + compileTestSources = [ src for src in testSources + if 'COMPILE_CHECK' in file(src).read() ] + if compileTestSources: + test.extend(env.CompileCheck(source = compileTestSources)) env.Alias('all_tests', test) # Hmm ... here I'd like to use an Alias instead of a file # however the alias does not seem to live in the subdirectory # which breaks 'scons -u test' - env.Alias(env.File('test'), test) + env.Command(env.File('test'), test, []) + #env.Alias(env.File('test'), test) return objects @@ -443,6 +472,8 @@ def InstallWithSources(env, targets, dir, sources, testSources = [], no_includes # # \ingroup target def Doxygen(env, doxyfile = "Doxyfile", extra_sources = []): + if not 'all' in BUILD_TARGETS and not 'doc' in BUILD_TARGETS and not 'all_docs' in BUILD_TARGETS: + return [] # ARGHHH !!! without the [:] we are changing the target list # ||| WITHIN THE DOXYGEN BUILDER docs = env.Doxygen(doxyfile)[:] @@ -641,7 +672,7 @@ def Binary(env, binary, sources, testSources = None, LIBS = [], OBJECTS = [], no objects = Objects(env,sources,testSources,LIBS=LIBS,OBJECTS=OBJECTS) program = None if objects: - progEnv = env.Copy() + progEnv = env.Clone() progEnv.Prepend(LIBS = [ x + '$LIBADDSUFFIX' for x in LIBS ]) program = progEnv.ProgramNoScan(target=binary,source=objects+OBJECTS) env.Default(program)