Update SENF to compile using g++ 4.3.2 (Ubuntu 8.10)
[senf.git] / senfscons / SENFSCons.py
index b6703ed..7f08d0b 100644 (file)
@@ -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
@@ -153,6 +155,7 @@ def FinalizeBoost(env):
     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']
 
     env.Append(LIBPATH = [ '$BOOST_LIBDIR' ],
                CPPPATH = [ '$BOOST_INCLUDES' ])
@@ -241,18 +244,17 @@ 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']:
-        env.Append(CXXFLAGS = [ '-O3' ],
-                   CPPDEFINES = [ 'SENF_NO_DEBUG' ])
+        env.Append(CXXFLAGS = [ '-O3' ])
     else:
-        env.Append(CXXFLAGS = [ '-O0', '-g', '-fno-inline' ],
-    # The boost-regex library is not compiled with _GLIBCXX_DEBUG so this fails.
-    #               CPPDEFINES = [ '_GLIBCXX_DEBUG' ],
-                   LINKFLAGS = [ '-g' ])
+        # The boost-regex library is not compiled with _GLIBCXX_DEBUG so this fails:
+        #          CPPDEFINES = [ '_GLIBCXX_DEBUG' ],
+        env.Append(CXXFLAGS = [ '-O0', '-g' ],
+                   CPPDEFINES = { 'SENF_DEBUG': ''},
+                   LINKFLAGS = [ '-g', '-rdynamic' ])
 
     env.Append(CPPDEFINES = [ '$EXTRA_DEFINES' ],
                LIBS = [ '$EXTRA_LIBS' ],
@@ -300,7 +302,24 @@ def GlobalTargets(env):
 
 ## \brief Return path of a built library within $LOCALLIBDIR
 # \internal
-def LibPath(lib): return '$LOCALLIBDIR/lib%s.a' % lib
+def LibPath(lib): return '${LOCALLIBDIR}/${LIBPREFIX}%s${LIBADDSUFFIX}${LIBSUFFIX}' % lib
+
+def Test(env, sources, LIBS = [], OBJECTS = []):
+    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 ]) ]
+    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.Command(env.File('test'), test, [])
+    #env.Alias(env.File('test'), test)
+    
 
 ## \brief Build object files
 #
@@ -330,26 +349,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 = LIBS,
+            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
 
@@ -430,6 +454,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)[:]
@@ -463,13 +489,12 @@ def Doxygen(env, doxyfile = "Doxyfile", extra_sources = []):
             docs,
             SCons.Action.Action(("for html in %s/*.html; do " +
                         "    echo $$html;" +
-                        "    sed -e 's/id=\"current\"/class=\"current\"/' $${html}" +
-                        "        | tidy -ascii -q --show-warnings no --fix-uri no " +
-                        "        | xsltproc --nonet --html --stringparam topdir %s -o $${html}.new %s - 2>&1" +
-                        "        | grep '^-'" +
-                        "        | grep -v 'ID .* already defined';" +
-                        "    mv $${html}.new $${html}; " +
-                        "done")
+                        "    mv $${html} $${html}.orig;" +
+                        "    sed -e 's/id=\"current\"/class=\"current\"/' $${html}.orig" +
+                        "        | tidy -ascii -q --wrap 0 --show-warnings no --fix-uri no " +
+                        "        | sed -e 's/name=\"\([^\"]*\)\"\([^>]*\) id=\"\\1\"/name=\"\\1\"\\2/g'" +
+                        "        | xsltproc --novalid --nonet --html --stringparam topdir %s -o $${html} %s -;"
+                        "done; true")
                        % (htmlnode.dir.abspath, reltopdir, xslfile.abspath)))
         for doc in docs:
             env.Depends(doc, xslfile)
@@ -609,7 +634,7 @@ def Object(env, target, sources, testSources = None, LIBS = [], OBJECTS = [], no
     objects = Objects(env,sources,testSources,LIBS=LIBS,OBJECTS=OBJECTS)
     ob = None
     if objects:
-        ob = env.Command(target+".o", objects, "ld -r -o $TARGET $SOURCES")
+        ob = env.Command(target+"${OBJADDSUFFIX}${OBJSUFFIX}", objects, "ld -r -o $TARGET $SOURCES")
         env.Default(ob)
         env.Alias('default', ob)
         InstallWithSources(env, ob, '$OBJINSTALLDIR', sources, testSources, no_includes)
@@ -629,8 +654,8 @@ 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.Prepend(LIBS = LIBS)
+        progEnv = env.Clone()
+        progEnv.Prepend(LIBS = [ x + '$LIBADDSUFFIX' for x in LIBS ])
         program = progEnv.ProgramNoScan(target=binary,source=objects+OBJECTS)
         env.Default(program)
         env.Depends(program, [ env.File(LibPath(x)) for x in LIBS ])