PPI/MultiConnectorMixin: added test to demonstrate bug when connection multiple multi...
[senf.git] / SConstruct
index cca03b8..f56ce4f 100644 (file)
@@ -1,8 +1,6 @@
 # -*- python -*-
 
-import sys, glob, os.path, datetime, pwd, time, fnmatch, string
-sys.path.append(Dir('#/senfscons').abspath)
-sys.path.append(Dir('#/doclib').abspath)
+import sys, glob, os.path, fnmatch
 import SENFSCons, senfutil
 
 ###########################################################################
@@ -11,62 +9,67 @@ import SENFSCons, senfutil
 env = Environment()
 
 # Load all the local SCons tools
-env.Tool('Doxygen', [ 'senfscons' ])
-env.Tool('Dia2Png', [ 'senfscons' ])
-env.Tool('PkgDraw', [ 'senfscons' ])
-env.Tool('CopyToDir', [ 'senfscons' ])
-env.Tool('ProgramNoScan', [ 'senfscons' ])
-env.Tool('CompileCheck', [ 'senfscons' ])
-env.Tool('Boost', [ 'senfscons' ])
-env.Tool('BoostUnitTests', [ 'senfscons' ])
+env.Tool('Doxygen')
+env.Tool('Dia2Png')
+env.Tool('PkgDraw')
+env.Tool('InstallSubdir')
+env.Tool('CopyToDir')
+env.Tool('Boost')
+env.Tool('CombinedObject')
+env.Tool('PhonyTarget')
+env.Tool('InstallDir')
 
 env.Help("""
 Additional top-level build targets:
 
-prepare      Create all source files not part of the repository
+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
+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
-""")
 
-# Compile options
+Build parameters:
 
-# Options used to debug inlining:
-#
-# BEWARE: You need lots of ram to compile with these settings (approx 1G)
+final=1      Build optimized library without debug symbols
+debug=1      Link all binaries with debug symbols (slow!)
+syslayout=1  Install into system layout directories ($$PREFIX/lib, $$PREFIX/include etc)
 
-class BuildTypeOptions:
-    def __init__(self, var):
-        self._var = var
+additionally, any construction environment variable may be set from the scons
+command line (see SConstruct file and SCons documentation for a list of variables).
+""")
 
-    def __call__(self, source, target, env, for_signature):
-        type = env['final'] and "final" or env['debug'] and "debug" or "normal"
-        return env[self._var + "_" + type]
+env.Replace(
+   PKGDRAW                = 'doclib/pkgdraw',
+)
 
 env.Append(
    ENV                    = { 'PATH' : os.environ.get('PATH') },
-   CLEAN_PATTERNS         = [ '*~', '#*#', '*.pyc', 'semantic.cache', '.sconsign*' ],
+   CLEAN_PATTERNS         = [ '*~', '#*#', '*.pyc', 'semantic.cache', '.sconsign*', '.sconsign' ],
 
-   CPPPATH                = [ '#/include' ],
+   CPPPATH                = [ '#' ],
    LOCALLIBDIR            = '#',
    LIBPATH                = [ '$LOCALLIBDIR' ],
-   LIBS                   = [ 'rt', '$BOOSTREGEXLIB', '$BOOSTIOSTREAMSLIB', '$BOOSTSIGNALSLIB',
-                              '$BOOSTFSLIB' ], 
-   TEST_EXTRA_LIBS        = [ ],
-
-   PREFIX                 = '/usr/local',
-   LIBINSTALLDIR          = '$PREFIX/lib',
-   BININSTALLDIR          = '$PREFIX/bin',
-   INCLUDEINSTALLDIR      = '$PREFIX/include',
-   OBJINSTALLDIR          = '$LIBINSTALLDIR',
-   DOCINSTALLDIR          = '$PREFIX/doc',
+   LIBS                   = [ '$LIBSENF$LIBADDSUFFIX', 'rt', '$BOOSTREGEXLIB', 
+                              '$BOOSTIOSTREAMSLIB', '$BOOSTSIGNALSLIB', '$BOOSTFSLIB' ], 
+   TEST_EXTRA_LIBS        = [  ],
+
+   PREFIX                 = '#/dist',
+   LIBINSTALLDIR          = '$PREFIX${syslayout and "/lib" or ""}',
+   BININSTALLDIR          = '$PREFIX${syslayout and "/bin" or ""}',
+   INCLUDEINSTALLDIR      = '$PREFIX${syslayout and "/include" or ""}',
+   OBJINSTALLDIR          = '${syslayout and "$LIBINSTALLDIR/senf" or "$PREFIX"}',
+   DOCINSTALLDIR          = '$PREFIX/manual',
+   SCONSINSTALLDIR        = '${syslayout and "$LIBINSTALLDIR/senf" or "$PREFIX"}/site_scons',
+   CONFINSTALLDIR         = '$OBJINSTALLDIR',
+
    CPP_INCLUDE_EXTENSIONS = [ '.h', '.hh', '.ih', '.mpp', '.cci', '.ct', '.cti' ],
    CPP_EXCLUDE_EXTENSIONS = [ '.test.hh' ],
 
@@ -80,29 +83,30 @@ env.Append(
    INLINE_OPTS            = [ '$INLINE_OPTS_NORMAL' ],
    CXXFLAGS               = [ '-Wall', '-Woverloaded-virtual', '-Wno-long-long', '$INLINE_OPTS',
                               '$CXXFLAGS_' ],
-   CXXFLAGS_              = BuildTypeOptions('CXXFLAGS'),
+   CXXFLAGS_              = senfutil.BuildTypeOptions('CXXFLAGS'),
    CXXFLAGS_final         = [ '-O3' ],
    CXXFLAGS_normal        = [ '-O0', '-g' ],
    CXXFLAGS_debug         = [ '$CXXFLAGS_normal' ],
 
    CPPDEFINES             = [ '$expandLogOption', '$CPPDEFINES_' ],
    expandLogOption        = senfutil.expandLogOption,
-   CPPDEFINES_            = BuildTypeOptions('CPPDEFINES'),
+   CPPDEFINES_            = senfutil.BuildTypeOptions('CPPDEFINES'),
    CPPDEFINES_final       = [ ],
    CPPDEFINES_normal      = [ 'SENF_DEBUG' ],
    CPPDEFINES_debug       = [ '$CPPDEFINES_normal' ],
 
    LINKFLAGS              = [ '-rdynamic', '$LINKFLAGS_' ],
-   LINKFLAGS_             = BuildTypeOptions('LINKFLAGS'),
+   LINKFLAGS_             = senfutil.BuildTypeOptions('LINKFLAGS'),
    LINKFLAGS_final        = [ ],
    LINKFLAGS_normal       = [ '-Wl,-S' ],
    LINKFLAGS_debug        = [ ],
 )
 
 env.SetDefault(
-    LIBSENF = "senf",
-    final   = 0,
-    debug   = 0,
+    LIBSENF   = "senf",
+    final     = 0,
+    debug     = 0,
+    syslayout = 0
 )
 
 # Set variables from command line
@@ -115,58 +119,54 @@ Export('env')
 if not os.path.exists("Doxyfile.local"):
     Execute(Touch("Doxyfile.local"))
 
-# Create local_config.h
-if not env.GetOption('clean') and not os.path.exists("local_config.hh"):
-    Execute(Touch("local_config.hh"))
-
-###########################################################################
-# Define build targets
-
-# Before defining any targets, check wether this is the first build in
-# pristine directory tree. If so, call 'scons prepare' so the dependencies
-# created later are correct (yes, this is a hack :-( )
-
 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.Clean('all', '.prepare-stamp')
 
-# Load SConscripts. Need to load some first (they change the global environment)
-initSConscripts = [ 
-    "debian/SConscript",
-    "doclib/SConscript",
-]
+# Load SConscripts
 
-SConscript(initSConscripts)
+SConscriptChdir(0)
+SConscript("debian/SConscript")
+SConscriptChdir(1)
+if os.path.exists('SConscript.local') : SConscript('SConscript.local')
+SConscript("senf/SConscript")
+SConscript("Examples/SConscript")
+SConscript("HowTos/SConscript")
+SConscript("doclib/SConscript")
 
-if os.path.exists('SConscript.local'):
-    SConscript('SConscript.local')
+###########################################################################
+# Define build targets
 
-SConscript(list(set(glob.glob("*/SConscript")) - set(initSConscripts)))
+#### doc
+env.Depends(SENFSCons.Doxygen(env), env.Value(env['ENV']['REVISION']))
 
-# Define the main targets
-SENFSCons.StandardTargets(env)
-SENFSCons.GlobalTargets(env)
+#### libsenf.a
+libsenf = env.Library("$LOCALLIBDIR/${LIBSENF}${LIBADDSUFFIX}", env['ALLOBJECTS'])
+env.Default(libsenf)
+env.Install('$LIBINSTALLDIR', libsenf)
 
-env.Depends( SENFSCons.Doxygen(env), env.Value(env['ENV']['REVISION']) )
+def create(target, source, env): 
+    file(str(target[0]), 'w').write(source[0].get_contents()+"\n")
+env['BUILDERS']['CreateFile'] = Builder(action = create)
 
-libsenf = env.Library(env.subst("$LIBSENF$LIBADDSUFFIX"), env['ALLOBJECTS'])
-env.Default(libsenf)
-env.Clean('all', libsenf)
-env.Alias('default', libsenf)
+conf = env.CreateFile("${LOCALLIBDIR}/${LIBSENF}${LIBADDSUFFIX}.conf", 
+                      env.Value(env.subst("$_CPPDEFFLAGS")))
+env.Default(conf)
+env.Install('$CONFINSTALLDIR', conf)
 
-SENFSCons.InstallIncludeFiles(env, [ 'config.hh' ])
-env.Alias('install_all', env.Install('$LIBINSTALLDIR', libsenf))
+#### install_all, default, all_tests, all
+env.Install('${SCONSINSTALLDIR}', 'site_scons/senfutil.py')
 
-if env.GetOption('clean'):
-    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) ])
+env.Alias('install_all', env.FindInstalledFiles())
+env.Alias('default', DEFAULT_TARGETS)
+env.Alias('all_tests', env.FindAllBoostUnitTests())
+env.Alias('all', [ 'default', 'all_tests', 'examples', 'all_docs' ])
 
-SENFSCons.PhonyTarget(env, 'prepare', [ 'true' ])
+#### prepare
+env.PhonyTarget('prepare', [], [])
 
-SENFSCons.PhonyTarget(env, 'valgrind', [ """
+#### valgrind
+env.PhonyTarget('valgrind', [ 'all_tests' ], [ """
     find -name .test.bin 
         | while read test; do
             echo;
@@ -176,7 +176,18 @@ SENFSCons.PhonyTarget(env, 'valgrind', [ """
                 $$test $BOOSTTESTARGS;
             [ $$? -ne 99 ] || exit 1;
         done
-""".replace("\n"," ") ], [ 'all_tests' ])
+""".replace("\n"," ") ])
+
+#### clean
+env.Clean('all', '.prepare-stamp')
+env.Clean('all', libsenf)
+env.Clean('all', env.Dir('linklint')) # env.Dir to disambiguate from linklint PhonyTarget
+
+if env.GetOption('clean'):
+    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) ])
 
 if not env.GetOption('clean') and not os.path.exists(".prepare-stamp"):
     Execute(Touch(".prepare-stamp"))