Write _templates/SConscript sample file
[senf.git] / SConstruct
index ebb1fab..291a94e 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,19 +9,21 @@ 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('CompileCheck', [ 'senfscons' ])
-env.Tool('Boost', [ 'senfscons' ])
-env.Tool('BoostUnitTest', [ 'senfscons' ])
-env.Tool('InstallSubdir', [ '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.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
@@ -44,23 +44,27 @@ class BuildTypeOptions:
         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*', '.sconsign' ],
 
-   CPPPATH                = [ '#/include' ],
+   CPPPATH                = [ '#' ],
    LOCALLIBDIR            = '#',
    LIBPATH                = [ '$LOCALLIBDIR' ],
-   LIBS                   = [ 'rt', '$BOOSTREGEXLIB', '$BOOSTIOSTREAMSLIB', '$BOOSTSIGNALSLIB',
-                              '$BOOSTFSLIB' ], 
-   TEST_EXTRA_LIBS        = [ '$LIBSENF$LIBADDSUFFIX' ],
-
-   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          = '$LIBINSTALLDIR${syslayout and "/$LIBINSTALLDIR/senf" or ""',
+   DOCINSTALLDIR          = '$PREFIX/docs',
    CPP_INCLUDE_EXTENSIONS = [ '.h', '.hh', '.ih', '.mpp', '.cci', '.ct', '.cti' ],
    CPP_EXCLUDE_EXTENSIONS = [ '.test.hh' ],
 
@@ -94,9 +98,10 @@ env.Append(
 )
 
 env.SetDefault(
-    LIBSENF = "senf",
-    final   = 0,
-    debug   = 0,
+    LIBSENF   = "senf",
+    final     = 0,
+    debug     = 0,
+    syslayout = 0
 )
 
 # Set variables from command line
@@ -109,58 +114,44 @@ 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",
-]
 
-SConscript(initSConscripts)
+# Load SConscripts
 
-if os.path.exists('SConscript.local'):
-    SConscript('SConscript.local')
+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")
 
-SConscript(list(set(glob.glob("*/SConscript")) - set(initSConscripts)))
-
-# Define the main targets
-env.Alias('all', [ 'default', 'all_tests', 'all_docs' ])
+###########################################################################
+# Define build targets
 
+#### doc
 env.Depends(SENFSCons.Doxygen(env), env.Value(env['ENV']['REVISION']))
 
-libsenf = env.Library(env.subst("$LIBSENF$LIBADDSUFFIX"), env['ALLOBJECTS'])
+#### libsenf.a
+libsenf = env.Library("$LOCALLIBDIR/${LIBSENF}${LIBADDSUFFIX}", env['ALLOBJECTS'])
 env.Default(libsenf)
-env.Clean('all', libsenf)
-env.Alias('default', libsenf)
-
-env.InstallSubdir(target = '$INCLUDEINSTALLDIR', source = [ 'config.hh' ])
 
-env.Alias('install_all', env.Install('$LIBINSTALLDIR', libsenf))
+env.Install('$LIBINSTALLDIR', libsenf)
 
-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) ])
+#### install_all, default, all_tests, all
+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;
@@ -170,7 +161,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"))