[cig-commits] commit: Big cleanup on the build system including the

Mercurial hg at geodynamics.org
Mon Nov 24 11:22:59 PST 2008


changeset:   66:460b079bd3bf
user:        LukeHodkinson
date:        Mon Apr 07 00:41:49 2008 +0000
files:       SConstruct StgSCons config/SConfig/Node.py config/SConfig/Package.py config/SConfig/Platform.py config/SConfig/Project.py config/SConfig/SConscript config/SConfig/__init__.py config/SConfig/packages/HDF5.py config/SConfig/packages/PETSc.py config/SConfig/packages/PICellerator.py config/SConfig/packages/SVNRevision.py config/SConfig/packages/StGermain.py config/SConfig/packages/StgDomain.py config/SConfig/packages/StgFEM.py config/SConfig/packages/__init__.py config/SConfig/packages/cobj.py config/SConfig/packages/dl.py config/SConfig/packages/pcu.py
description:
Big cleanup on the build system including the
following improvements:
  - We now properly parse PETSc's 'petscconf'
    file for additional libraries we need. This
    should help when PETSc has been configured
    with 'download' options.
  - I've included a 'Project' package that contains
    a subset (currently) of the usual configuration
    options associated with a project (debugging,
    shared/static libs, etc) which allows us to
    remove the extra package I had to create for
    each individual project (StGermain, StgDomain,
    etc).
  - The individual projects can now be built
    independantly outside of a virtual repo.
  - StGermain now has a python script which can
    be loaded to extend SCons' build functionality.
    It includes an SCons builder for use with
    converting .meta files to .c files and some
    helper utilities for globbing and building
    source files.
  - The new unit test framework now has it's own
    script for extending SCons, much like StGermain,
    which adds an SCons builder for creating a
    unit test suite runner automatically.  This is
    quite nice as we don't have to modify any C
    code (except for actually writing the test
    itself, of course) OR modify any of the build
    scripts in order to add a new unit test to the
    project.


diff -r ed5e676bedd9 -r 460b079bd3bf SConstruct
--- a/SConstruct	Fri Mar 28 04:51:16 2008 +0000
+++ b/SConstruct	Mon Apr 07 00:41:49 2008 +0000
@@ -1,66 +1,68 @@ import os, sys, platform
-import os, sys, platform
+import sys, os
 
-# Source the configuration scripts.
 sys.path.insert(0, os.path.abspath(os.path.join(os.getcwd(), 'config')))
+import SConfig
 SConscript('config/SConfig/SConscript')
 
-# Create our base construction environment.
-if platform.platform().find('ia64') != -1:
-    # Hack needed for APAC, damn it all!
-    env = Environment(ENV=os.environ, tools=['gcc', 'gnulink'])
-else:
-    env = Environment(ENV=os.environ)
-if 'CC' in env['ENV']:
-    env['CC'] = env['ENV']['CC']
+#
+# CUSTOMISE THE ENVIRONMENT HERE.
+#
 
-# Need to modify building shared libraries when on Mac OS X.
-if platform.system() == 'Darwin':
-    env.AppendUnique(SHLINKFLAGS=['-flat_namespace',
-                                  '-single_module',
-                                  '-undefined', 'suppress'])
-    import SCons.Util # And fix RPATHs.
-    env['LINKFLAGS'] = SCons.Util.CLVar('')
-    env['RPATHPREFIX'] = ''
-    env['RPATHSUFFIX'] = ''
-    env['_RPATH'] = ''
+env = Environment(ENV=os.environ)
+env['_abspath'] = lambda x: File(x).abspath # Needed by Darwin.
 
-# Configuring or building? Or helping?
+# Determine whether we are configuring, helping or building.
 if 'config' in COMMAND_LINE_TARGETS or 'help' in COMMAND_LINE_TARGETS:
-    import packages
-    opts = Options() # Create our options database.
 
-    # Setup all the packages we want configured.
-    env.Package(packages.stgMagma, opts, True)
+    #
+    # INSERT CONFIGURATION HERE.
+    #
 
-    # Displaying help?
-    if 'help' in COMMAND_LINE_TARGETS:
-        env.Alias('help', '.')
-        print opts.GenerateHelpText(env)
+    proj = env.Package(SConfig.Project)
+    proj.opts.AddOptions(
+        BoolOption('with_glucifer', 'Use gLucifer visualisation', 1)
+        )
+    proj.dependency(SConfig.packages.cmath)
+    proj.dependency(SConfig.packages.libXML2)
+    proj.dependency(SConfig.packages.MPI)
+    proj.dependency(SConfig.packages.SVNRevision)
+    proj.dependency(SConfig.packages.BlasLapack)
+    proj.dependency(SConfig.packages.HDF5)
+    petsc = proj.dependency(SConfig.packages.PETSc)
+    petsc.have_define = 'HAVE_PETSC'
+    proj.dependency(SConfig.packages.PETScExt)
+    if env['with_glucifer']:
+        proj.dependency(SConfig.packages.OpenGL)
+        proj.dependency(SConfig.packages.OSMesa, False)
+        proj.dependency(SConfig.packages.X11, False)
+        proj.dependency(SConfig.packages.SDL, False)
+        proj.dependency(SConfig.packages.libavcodec, False)
+        proj.dependency(SConfig.packages.libFAME, False)
+        proj.dependency(SConfig.packages.libPNG, False)
+        proj.dependency(SConfig.packages.libJPEG, False)
+        proj.dependency(SConfig.packages.libTIFF, False)
+    env.configure_packages()
 
-    # Or configuring?
-    else:
-        env.configure_packages(opts)
+    # Need to define the extension for shared libraries as well
+    # as the library directory.
+    ext = env['ESCAPE']('"' + env['SHLIBSUFFIX'][1:] + '"')
+    lib_dir = env['ESCAPE']('"' + os.path.abspath(env['build_dir']) + '/lib' + '"')
+    env.AppendUnique(CPPDEFINES=[('MODULE_EXT', ext), ('LIB_DIR', lib_dir)])
+
+    # Save results.
+    env.save_config()
 
 else:
-    # Prepare our construction environment.
-    env.load_config('config.cfg') # Load configuration.
-    SConscript('StgSCons', exports='env') # Setup our StG specific utils.
-    env.Default(env['buildPath']) # Needed for different build paths.
-    env.Append(CPPDEFINES=['HAVE_SCONS'])
+    # Load configuration.
+    env.load_config()
+    SConscript('StGermain/pcu/script/scons.py', exports='env')
+    SConscript('StGermain/script/scons.py', exports='env')
+    env.Append(CPPDEFINES=['HAVE_SCONS']) # Needed for old VMake.
 
-    # Another Mac OS X hack.
-    if platform.system() == 'Darwin':
-	env['_abspath'] = lambda x: File(x).abspath
-        env.Append(SHLINKFLAGS=['-install_name', '${_abspath(TARGET)}'])
+    #
+    # INSERT TARGETS HERE.
+    #
 
-    # Prepare library builders.
-    env.library_builders = []
-    if env['static_libraries']:
-        env.library_builders += [env.StaticLibrary]
-    if env['shared_libraries']:
-        env.library_builders += [env.SharedLibrary]
-
-    # Specify targets.
     SConscript('StGermain/SConscript', exports='env')
     env.Prepend(LIBS='StGermain')
     SConscript('StgDomain/SConscript', exports='env')
diff -r ed5e676bedd9 -r 460b079bd3bf StgSCons
--- a/StgSCons	Fri Mar 28 04:51:16 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,364 +0,0 @@
-import os, glob as pyglob, platform, pickle
-from SCons.Script.SConscript import SConsEnvironment
-
-#
-# Setup some basic path utilities.
-#
-
-# Globbing for hierarchical SCons scripts.
-def glob(env, ptrn):
-    if not os.path.isabs(ptrn):
-        old = os.getcwd()
-        os.chdir(Dir('.').srcnode().abspath)
-        res = pyglob.glob(ptrn)
-        os.chdir(old)
-    else:
-        res = pyglob.glob(ptrn)
-    return res
-
-def path_exists(env, path):
-    if not os.path.isabs(path):
-        old = os.getcwd()
-        os.chdir(Dir('.').srcnode().abspath)
-        res = os.path.exists(path)
-        os.chdir(old)
-    else:
-        res = os.path.exists(path)
-    return res
-
-# Normalise an SCons path to the project root.
-def norm_path(env, path):
-    cur_dir = env.Dir('.').srcnode().path
-    if path[0] != '#':
-        path = os.path.join(cur_dir, path)
-    else:
-        path = path[1:]
-    return path
-
-# Copy a file immediately.
-def copy_file(env, dst, src):
-    if env.GetOption('clean'):
-        return
-    dst = env.norm_path(dst)
-    old = os.getcwd()
-    os.chdir(env.GetLaunchDir())
-    src = env.norm_path(src)
-    src_sig = File(os.path.abspath(src)).get_csig()
-    dst_sig = File(os.path.abspath(dst)).get_csig()
-    if not os.path.exists(os.path.abspath(dst)) or src_sig != dst_sig:
-        dst_dir = os.path.dirname(dst)
-        if not os.path.exists(dst_dir):
-            Execute(Mkdir(dst_dir))
-        Execute(Copy(dst, src))
-        os.chdir(old)
-
-# Add to the SCons main class.
-SConsEnvironment.glob = glob
-SConsEnvironment.path_exists = path_exists
-SConsEnvironment.norm_path = norm_path
-SConsEnvironment.copy_file = copy_file
-
-#
-# Setup the hierarchical build stuff.
-#
-
-def hbuild(env, builder, hpath, store=True, *args, **kw):
-    nodes = builder(*args, **kw)
-    if store:
-        if builder not in env.hbuilders:
-            env.hbuilders.append(builder)
-        ind = env.hbuilders.index(builder)
-        if ind not in env.hnodes:
-            env.hnodes[ind] = {}
-        place = env.hnodes[ind]
-        if '.' not in place:
-            place['.'] = []
-        place['.'].append(nodes)
-        for h in hpath.split(os.path.sep):
-            if h not in place:
-                place[h] = {}
-            place = place[h]
-            if '.' not in place:
-                place['.'] = []
-            place['.'].append(nodes)
-    return nodes
-
-def get_hnodes(env, builder, hpath=None):
-    ind = env.hbuilders.index(builder)
-    place = env.hnodes[ind]
-    if hpath:
-        for h in hpath.split(os.path.sep):
-            place = place[h]
-    return place['.']
-
-def hclear(env):
-    env.hnodes = {}
-    env.hbuilders = []
-
-SConsEnvironment.hbuild = hbuild
-SConsEnvironment.get_hnodes = get_hnodes
-SConsEnvironment.hclear = hclear
-
-#
-# Helper functions.
-#
-
-def to_list(var):
-    if isinstance(var, list):
-        return var
-    else:
-        return [var]
-
-def copy_includes(env, files, dst, inc_nodes, force=False):
-    files = to_list(files)
-    dst = os.path.join(env['buildPath'], dst)
-    nodes = []
-    for i in files:
-        node = env.Install(dst, i)
-        nodes.append(node)
-        inc_nodes.append(node)
-        if force:
-            dst_path = os.path.join(dst, os.path.basename(i))
-            env.copy_file(dst_path, i)
-    return nodes
-
-#
-# Builder helpers.
-#
-
-def get_target_name(env, src, suffix='.c'):
-    return os.path.join(env['buildPath'], env.project_name, src[:-len(suffix)])
-
-def build_defines(env, files, dst):
-    copy_includes(env, files, os.path.join('include', dst),
-                  env.def_nodes, True)
-
-def build_headers(env, files, dst, force_copy=False):
-    return copy_includes(env, files, os.path.join('include', dst),
-                         env.hdr_nodes, force_copy)
-
-def build_xmls(env, files, dst, force_copy=False):
-    copy_includes(env, files, os.path.join('lib', dst),
-                  env.hdr_nodes, force_copy)
-
-def build_objects(env, files, hpath, store=True):
-    files = to_list(files)
-    nodes = []
-    name = env.project_name + ''.join(hpath.split(os.path.sep))
-    mod = [('CURR_MODULE_NAME', env['ESCAPE']('"' + name + '"'))]
-    for src in files:
-        tgt = get_target_name(env, src)
-        cur_node = env.hbuild(env.SharedObject, hpath, store,
-                              target=tgt, source=src,
-                              CPPDEFINES=env['CPPDEFINES'] + mod)
-        nodes.append(cur_node)
-    return nodes
-
-def build_metadata(env, files, hpath):
-    files = to_list(files)
-    nodes = []
-    for m in files:
-        tgt = get_target_name(env, m, '.meta')
-        src = env.Meta(target=tgt, source=m)
-        tgt = '#' + src[0].path[:-2]
-        cur_node = env.hbuild(env.SharedObject, hpath,
-                              target=tgt, source=src)
-        nodes.append(cur_node)
-    return nodes
-
-def build_library(env, objs, name, libs=[], force_name=False):
-    objs = to_list(objs)
-    dst = os.path.join(env['buildPath'], 'lib', name)
-    for b in env.library_builders:
-        if force_name:
-            cur_node = b(
-                dst, objs,
-                SHLIBPREFIX='',
-                LIBPREFIXES=[env['LIBPREFIXES']] + [''],
-                LIBS=libs + env.get('LIBS', []))
-        else:
-            cur_node = b(dst, objs, LIBS=libs + env.get('LIBS', []))
-    env.lib_nodes.insert(0, cur_node)
-
-def build_tests(env, files, name, sup_objs=[], libs=None):
-    if not libs:
-        libs = env.lib_nodes
-    files = to_list(files)
-    sup_objs = to_list(sup_objs)
-    nodes = env.test_nodes
-    mod = [('CURR_MODULE_NAME', env['ESCAPE']('"' + name + '"'))]
-    l = to_list(libs)
-    for src in files:
-        tgt = get_target_name(env, src)
-        obj_node = env.SharedObject(tgt, src,
-                                    CPPDEFINES=env.get('CPPDEFINES') + mod)
-        dst = os.path.join(env['buildPath'], 'tests',
-                           os.path.splitext(os.path.basename(src))[0])
-        cur_node = env.Program(dst, obj_node + sup_objs,
-                               LIBS=l + env.get('LIBS', []))
-        nodes.append(cur_node)
-
-def build_suites(env, sources):
-    sources = to_list(sources)
-    for src in sources:
-        tgt = get_target_name(env, src)
-        obj_node = env.SharedObject(tgt, src)
-        env.suite_nodes += obj_node
-
-def build_directory(env, dir, build_lib=False):
-    srcDir = os.path.join(dir, 'src')
-    tstDir = os.path.join(dir, 'tests')
-    hdrDir = os.path.join(env.project_name, dir)
-    mod = ''.join(hdrDir.split(os.path.sep))
-
-    env.build_defines(env.glob(os.path.join(srcDir, '*.def')), hdrDir)
-    env.build_headers(env.glob(os.path.join(srcDir, '*.h')), hdrDir)
-    env.build_metadata(env.glob(os.path.join(srcDir, '*.meta')), dir)
-    env.build_objects(env.glob(os.path.join(srcDir, '*.c')), dir)
-    if build_lib:
-        objs = env.get_hnodes(env.SharedObject, dir)
-        env.build_library(objs, mod)
-    if env.path_exists(tstDir):
-        tst_files = env.glob(os.path.join(tstDir, 'test*.c'))
-        suites = env.glob(os.path.join(tstDir, '*Suite.c'))
-        sup_gen = env.glob(os.path.join(tstDir, '*.c'))
-        sup_files = [f for f in sup_gen if f not in tst_files + suites]
-        sup = env.build_objects(sup_files, dir, False)
-        env.build_tests(tst_files, mod,
-                        sup_objs=sup,
-                        libs=[env.project_name])
-        if suites:
-            env.build_suites(suites)
-
-def build_plugin(env, dir, hpath, prefix=True):
-    name = hpath.split(os.path.sep)
-    if prefix:
-        name = [env.project_name] + name
-    name = '_'.join(name) + 'module'
-    hdr_dir = os.path.join(env.project_name, hpath.split(os.path.sep)[-1])
-
-    env.build_headers(env.glob(os.path.join(dir, '*.h')), hdr_dir)
-    objs = env.build_objects(env.glob(os.path.join(dir, '*.c')),
-                         hpath, False)
-    env.build_library(objs, name, [env.project_name], True)
-
-def build_suite_runner(env):
-    hdrs = ""
-    suites = ""
-    for node in env.suite_nodes:
-        name = node.path[node.path.rfind(os.path.sep) + 1:node.path.rfind('.')]
-        suites += "pcu_runner_addSuite( %s );\n" % name
-        name = node.path[len(env['buildPath']):node.path.rfind('.')]
-        hdrs += "#include \"%s.h\"" % name
-    src = """#include <stdlib.h>
-#include <mpi.h>
-#include "StGermain/pcu/pcu.h"
-%s
-
-int main( int argc, char* argv[] ) {
-   pcu_listener_t* lsnr;
-
-   MPI_Init( &argc, &argv );
-   StGermain_Init( &argc, &argv );
-   pcu_runner_init( argc, argv );
-
-   %s
-   lsnr = pcu_textoutput_create();
-   pcu_runner_run( lsnr );
-   pcu_runner_finalise();
-   pcu_textoutput_destroy( lsnr );
-   StGermain_Finalise();
-   MPI_Finalize();
-   return EXIT_SUCCESS;
-}
-""" % (hdrs, suites)
-    src_filename = os.path.join(env["buildPath"], env.project_name, 
-                                "test" + env.project_name + ".c")
-    if not os.path.exists(os.path.dirname(File(src_filename).abspath)):
-        os.makedirs(os.path.dirname(File(src_filename).abspath))
-    f = open(File(src_filename).abspath, "w")
-    f.write(src)
-    f.close()
-    bin_filename = os.path.join(env["buildPath"], "bin", "test" + env.project_name)
-    env.Program(bin_filename, [File(src_filename)] + env.suite_nodes,
-                CPPPATH=["#."] + env.get("CPPPATH", []),
-                LIBS=[env.project_name] + env.get("LIBS", []))
-
-def clear_all(env):
-    env.hclear()
-    env.def_nodes = []
-    env.hdr_nodes = []
-    env.lib_nodes = []
-    env.test_nodes = []
-    env.suite_nodes = []
-
-SConsEnvironment.build_defines = build_defines
-SConsEnvironment.build_headers = build_headers
-SConsEnvironment.build_xmls = build_xmls
-SConsEnvironment.build_objects = build_objects
-SConsEnvironment.build_metadata = build_metadata
-SConsEnvironment.build_library = build_library
-SConsEnvironment.build_tests = build_tests
-SConsEnvironment.build_suites = build_suites
-SConsEnvironment.build_directory = build_directory
-SConsEnvironment.build_plugin = build_plugin
-SConsEnvironment.build_suite_runner = build_suite_runner
-SConsEnvironment.clear_all = clear_all
-
-#
-# Custom builders.
-#
-
-# Builder for generating meta files (courtesy of Walter Landry).
-def create_meta(target, source, env):
-    output_file = file(str(target[0]),'wb')
-    output_file.write("#define XML_METADATA \"")
-    xml_file = file(str(source[0]))
-    xml_lines = xml_file.readlines()
-    for l in xml_lines:
-        output_file.write(l.replace('\"','\\\"')[:-1])
-    output_file.write("\"\n#define COMPONENT_NAME ")
-    for l in xml_lines:
-        start=l.find('<param name="Name">')
-        if start!=-1:
-            end=l.find('<',start+19)
-            if end==-1:
-                raise RunTimeError('Malformed XML file.  The file '
-                                   + str(source[0])
-                                   + ' does not close off <param name="Name"> on the same line.')
-            output_file.write(l[start+19:end])
-            output_file.write("\n")
-            break
-    output_file.write('''
-#define Stg_Component_Stringify( str ) #str
-
-/* Note: Two macros are used to resolve the the extra macro level */
-#define Stg_Component_Metadata_Create( name ) Stg_Component_Metadata_Create_Macro( name )
-#define Stg_Component_Metadata_Create_Macro( name ) \
-	const char* name ##_Meta = XML_METADATA; \
-	const char* name ##_Name = #name; \
-	const char* name ##_Version = VERSION; \
-	const char* name ##_Type_GetMetadata() { /* hack...won't be needed when hierarchy rollout is done */\
-		return name ##_Meta; \
-	} \
-	const char* name ##_GetMetadata() { \
-		return name ##_Meta; \
-	} \
-	const char* name ##_GetName() { \
-		return name ##_Name; \
-	} \
-	const char* name ##_GetVersion() { \
-		return name ##_Version; \
-	}
-
-#if defined(COMPONENT_NAME) && defined(VERSION) && defined(XML_METADATA)
-	Stg_Component_Metadata_Create( COMPONENT_NAME )
-#endif
-''')
-
-def gen_meta_suffix(env, sources):
-    return "-meta.c"
-
-Import('env')
-env['BUILDERS']['Meta']=Builder(action=create_meta,src_suffix="meta",
-                                suffix=gen_meta_suffix,single_source=True)
diff -r ed5e676bedd9 -r 460b079bd3bf config/SConfig/Node.py
--- a/config/SConfig/Node.py	Fri Mar 28 04:51:16 2008 +0000
+++ b/config/SConfig/Node.py	Mon Apr 07 00:41:49 2008 +0000
@@ -38,7 +38,7 @@ class Node(object):
         if self.configured:
             print 'Error: Cannot add a dependency during configuration.'
             self.env.Exit()
-        pkg = self.env.Package(package_module, self.opts, **kw)
+        pkg = self.env.Package(package_module, required, **kw)
         if pkg not in [d[0] for d in self.deps]:
             self.deps += [(pkg, required)]
         return pkg
diff -r ed5e676bedd9 -r 460b079bd3bf config/SConfig/Package.py
--- a/config/SConfig/Package.py	Fri Mar 28 04:51:16 2008 +0000
+++ b/config/SConfig/Package.py	Mon Apr 07 00:41:49 2008 +0000
@@ -7,7 +7,7 @@ class Package(SConfig.Node):
         SConfig.Node.__init__(self, scons_env, scons_opts, required)
 
         # This will be set in the preprocessor.
-        self.have_define         = 'HAVE_' + self.environ_name
+        self.have_define         = ''
 
         # Search options.
         self.base_dirs           = [] #['']
@@ -122,7 +122,7 @@ class Package(SConfig.Node):
 
     def find_package(self):
         """Basic check routine for locating the package."""
-        result = True
+        result = False
         self.ctx.Display('  Searching locations:\n')
         for loc in self.generate_locations():
             self.ctx.Display('    %s\n' % str(loc))
diff -r ed5e676bedd9 -r 460b079bd3bf config/SConfig/Platform.py
--- a/config/SConfig/Platform.py	Fri Mar 28 04:51:16 2008 +0000
+++ b/config/SConfig/Platform.py	Mon Apr 07 00:41:49 2008 +0000
@@ -1,10 +1,11 @@ import platform
-import platform
+import os, platform
 import SCons.Script
 import SConfig
 
 class Platform(SConfig.Node):
     def __init__(self, scons_env, scons_opts, required=False):
         SConfig.Node.__init__(self, scons_env, scons_opts, required)
+        self.checks = [self.print_results]
 
         # Will be set after successful configuration.
         self.system = ''
@@ -13,17 +14,35 @@ class Platform(SConfig.Node):
         # We need to do these now.
         self.check_system()
         self.check_bits()
+        self.check_CC()
 
     def setup_options(self):
         self.opts.AddOptions(
             SCons.Script.BoolOption('with_32bit', 'Generate 32bit code', 0),
-            SCons.Script.BoolOption('with_64bit', 'Generate 64bit code', 0)
+            SCons.Script.BoolOption('with_64bit', 'Generate 64bit code', 0),
             )
 
     def check_system(self):
         self.system = platform.system()
         if not self.system or self.system in ['Linux', 'Unix']:
             self.system = '*ix'
+
+        # Need to modify building shared libraries when on Mac OS X.
+        if self.system == 'Darwin':
+            self.env.AppendUnique(SHLINKFLAGS=['-flat_namespace',
+                                          '-single_module',
+                                          '-undefined', 'suppress'])
+            import SCons.Util # And fix RPATHs.
+            self.env['LINKFLAGS'] = SCons.Util.CLVar('')
+            self.env['RPATHPREFIX'] = ''
+            self.env['RPATHSUFFIX'] = ''
+            self.env['_RPATH'] = ''
+
+            # Use 'install_name' instead.
+            self.env.Append(SHLINKFLAGS=['-install_name', '${_abspath(TARGET)}'])
+
+            self.env.AppendUnique(CONFIGVARS=['SHLINKFLAGS', 'LINKFLAGS',
+                                              'RPATHPREFIX', 'RPATHSUFFIX', '_RPATH'])
 
     def check_bits(self):
         if (platform.platform().find('x86_64') != -1 or \
@@ -34,3 +53,15 @@ class Platform(SConfig.Node):
             self.bits = 64
         else:
             self.bits = 32
+
+    def check_CC(self):
+        if 'CC' in self.env['ENV']:
+            self.env['CC'] = self.env['ENV']['CC']
+            self.CC = self.env['CC']
+
+    def print_results(self):
+        self.ctx.Display("  Building on a %s platform\n" % self.system)
+        self.ctx.Display("  Building for %d bit architecture\n" % self.bits)
+        if hasattr(self, 'CC'):
+            self.ctx.Display("  Using environment specified C compiler: %s\n" % self.CC)
+        return True
diff -r ed5e676bedd9 -r 460b079bd3bf config/SConfig/Project.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/config/SConfig/Project.py	Mon Apr 07 00:41:49 2008 +0000
@@ -0,0 +1,63 @@
+import os
+import SCons.Script
+import SConfig
+
+class Project(SConfig.Node):
+    def __init__(self, scons_env, scons_opts, required=False):
+        SConfig.Node.__init__(self, scons_env, scons_opts, required)
+        self.checks += [self.check_libs, self.print_results]
+
+    def setup_options(self):
+        self.opts.AddOptions(
+            SCons.Script.BoolOption('with_debug',
+                                    'Generate debugging symbols', 1),
+            SCons.Script.BoolOption('static_libraries',
+                                    'Build static libraries', 1),
+            SCons.Script.BoolOption('shared_libraries',
+                                    'Build shared libraries', 1),
+            ('build_dir', 'Temporary build directory', 'build')
+            )
+
+    def check_libs(self):
+        if not self.env['static_libraries'] and not self.env['shared_libraries']:
+            self.ctx.Display("      Both static and shared libraries disabled!\n")
+            return False
+        return True
+
+    def print_results(self):
+        self.ctx.Display("  Static libraries: %s\n" % str(bool(self.env['static_libraries'])))
+        self.ctx.Display("  Shared libraries: %s\n" % str(bool(self.env['shared_libraries'])))
+        self.ctx.Display("  Using build directory: %s\n" % self.env['build_dir'])
+        self.ctx.Display("  Debugging symbols: %s\n" % str(bool(self.env['with_debug'])))
+        return True
+
+    def setup(self):
+        SConfig.Node.setup(self)
+        modified = []
+        if self.env['shared_libraries']:
+            for pkg in self.env.package_list:
+                if isinstance(pkg, SConfig.Package):
+                    pkg.require_shared = True
+                    modified += [pkg]
+        return modified
+
+    def enable(self, scons_env, old_state=None):
+        SConfig.Node.enable(self, scons_env, old_state)
+
+        # Setup debugging flags.
+        if self.env['with_debug']:
+            scons_env.MergeFlags('-g')
+
+        # Setup the include paths.
+        inc_dir = self.env.get_build_path('include')
+        self.backup_variable(scons_env, 'CPPPATH', old_state)
+        scons_env.PrependUnique(CPPPATH=[inc_dir])
+
+        # Setup LIB_DIR.
+        lib_dir = self.env.get_build_path('lib')
+        self.backup_variable(scons_env, 'LIBPATH', old_state)
+        scons_env.PrependUnique(LIBPATH=[lib_dir])
+
+        # Setup the RPATH.
+        self.backup_variable(scons_env, 'RPATH', old_state)
+        scons_env.PrependUnique(RPATH=[scons_env.Dir(lib_dir).abspath])
diff -r ed5e676bedd9 -r 460b079bd3bf config/SConfig/SConscript
--- a/config/SConfig/SConscript	Fri Mar 28 04:51:16 2008 +0000
+++ b/config/SConfig/SConscript	Mon Apr 07 00:41:49 2008 +0000
@@ -1,4 +1,5 @@ import os, sys
-import os, sys
+import os, sys, platform, pickle, shutil
+import glob as pyglob
 import SConfig
 from SCons.Script.SConscript import SConsEnvironment
 
@@ -6,13 +7,15 @@ from SCons.Script.SConscript import SCon
 # Setup the Package system.
 #
 
-def Package(env, pkg_module, options, required=False, **kw):
+def Package(env, pkg_module, required=True, **kw):
     """Create a new package to be configured."""
+    if not hasattr(env, 'package_options'):
+        env.package_options = Options()
     if not hasattr(env, 'packages'):
         env.packages = {}
         env.package_list = []
     if not pkg_module in env.packages:
-        pkg = pkg_module(env, options, required)
+        pkg = pkg_module(env, env.package_options, required)
         for attr, val in kw.iteritems():
             if not hasattr(pkg, attr):
                 print 'Package does not have attribute!'
@@ -26,15 +29,25 @@ def CheckPackages(ctx, pkg_list):
     for pkg in pkg_list:
         pkg.configure(ctx)
 
-def configure_packages(env, options=None, output='config.cfg'):
+def configure_packages(env):
+    # If we have 'help' given as a target, use that to generate help.
+    if 'help' in COMMAND_LINE_TARGETS:
+        env.Alias('help', '.')
+        print env.package_options.GenerateHelpText(env)
+        return
+
     # Get rid of the temporary directory to make sure we're building
     # from scratch.
     if os.path.exists('.sconsign.dblite'):
         os.remove('.sconsign.dblite')
 
     # Finish setting everything up.
-    for pkg in env.package_list:
-        pkg.setup()
+    pkgs_rem = list(env.package_list)
+    while len(pkgs_rem):
+        pkg = pkgs_rem.pop()
+        modified = pkg.setup()
+        if isinstance(modified, list):
+            pkgs_rem += [m for m in modified if m not in pkgs_rem]
 
     # Update dependencies and requirements.
     pkgs_rem = list(env.package_list)
@@ -51,25 +64,27 @@ def configure_packages(env, options=None
     sconf.CheckPackages(env.package_list)
     sconf.Finish()
 
-    # Dump results to our output file.
-    for pkg in env.package_list: # Put the results on this environment.
-        if pkg.result:
-            pkg.enable(env)
-    vars = ['CFLAGS', 'CCFLAGS',
-            'CPPPATH', 'CPPDEFINES',
-            'LIBPATH', 'LIBS', 'RPATH',
-            'FRAMEWORKS']
-    vars += options.keys()
-    env.save_config(output, vars)
-
     # Print out build message.
     print '\n*****************************************'
     print "* Now run 'scons' to build the project. *"
     print '*****************************************\n'
 
-def save_config(env, filename, vars):
+def save_config(env, filename='config.cfg'):
+    # Put the results on this environment.
+    for pkg in env.package_list: 
+        if pkg.result:
+            pkg.enable(env)
+
+    # Update config variables.
+    env.AppendUnique(CONFIGVARS=['CC', 'CFLAGS', 'CCFLAGS',
+                                 'CPPPATH', 'CPPDEFINES',
+                                 'LIBPATH', 'LIBS', 'RPATH',
+                                 'FRAMEWORKS'])
+    env.AppendUnique(CONFIGVARS=env.package_options.keys())
+
+    # Dump to file.
     d = {}
-    for a in vars:
+    for a in env['CONFIGVARS']:
         if a in env._dict:
             d[a] = env[a]
     f = file(filename, 'w')
@@ -77,7 +92,7 @@ def save_config(env, filename, vars):
     pickle.dump(d, f)
     f.close()
 
-def load_config(env, filename):
+def load_config(env, filename='config.cfg'):
     if not os.path.exists(filename):
         print "\nError: project hasn't been configured!"
         print '*******************************************************'
@@ -91,8 +106,81 @@ def load_config(env, filename):
     f.close()
     for k, v in d.iteritems():
         env[k] = v
+    for script in env.get('CONFIGSCRIPTS', []):
+        env.SConscript(script, 'env')
+    if 'build_dir' in env._dict:
+        env.Default(env['build_dir'])
 
 SConsEnvironment.Package = Package
 SConsEnvironment.configure_packages = configure_packages
 SConsEnvironment.save_config = save_config
 SConsEnvironment.load_config = load_config
+
+#
+# Useful utilities.
+#
+
+def copy_file(env, dst, src):
+    dst = File(dst).abspath
+    if os.path.exists(dst):
+        return
+    dst_dir = os.path.dirname(dst)
+    if not os.path.exists(dst_dir):
+        os.makedirs(dst_dir)
+    shutil.copy(src, dst)
+
+def get_build_path(env, prefix):
+    if os.path.isabs(env['build_dir']):
+        bld_dir = env['build_dir']
+    else:
+        bld_dir = '#' + env['build_dir']
+    if prefix:
+        return os.path.join(bld_dir, prefix)
+    else:
+        return bld_dir
+
+def get_target_name(env, source, extension=''):
+    """Return the destination name for a source file with suffix 'suffix'. This
+    is useful for building files into the correct build path. Returns the full
+    path to the built source without extension."""
+    if extension:
+        src = source[:-len(extension)]
+    else:
+        src = source
+    return env.get_build_path(src)
+
+def glob(env, pattern):
+    if not os.path.isabs(pattern):
+        old = os.getcwd()
+        os.chdir(Dir('.').srcnode().abspath)
+        res = pyglob.glob(pattern)
+        os.chdir(old)
+    else:
+        res = pyglob.glob(pattern)
+    return res
+
+def path_exists(env, path):
+    if not os.path.isabs(path):
+        old = os.getcwd()
+        os.chdir(Dir('.').srcnode().abspath)
+        res = os.path.exists(path)
+        os.chdir(old)
+    else:
+        res = os.path.exists(path)
+    return res
+
+def strip_dir(env, path, subdir):
+    offs = path.find(os.path.sep + subdir + os.path.sep)
+    if offs != -1:
+        return path[:offs] + path[offs + len(subdir) + 1:]
+    offs = path.find(os.path.sep + subdir)
+    if offs != -1:
+        return path[:-(len(subdir) + 1)]
+    return path
+
+SConsEnvironment.strip_dir = strip_dir
+SConsEnvironment.copy_file = copy_file
+SConsEnvironment.get_build_path = get_build_path
+SConsEnvironment.get_target_name = get_target_name
+SConsEnvironment.glob = glob
+SConsEnvironment.path_exists = path_exists
diff -r ed5e676bedd9 -r 460b079bd3bf config/SConfig/__init__.py
--- a/config/SConfig/__init__.py	Fri Mar 28 04:51:16 2008 +0000
+++ b/config/SConfig/__init__.py	Mon Apr 07 00:41:49 2008 +0000
@@ -1,4 +1,5 @@ from Node import Node
 from Node import Node
+from Package import Package
 from Platform import Platform
-from Package import Package
+from Project import Project
 import packages
diff -r ed5e676bedd9 -r 460b079bd3bf config/SConfig/packages/HDF5.py
--- a/config/SConfig/packages/HDF5.py	Fri Mar 28 04:51:16 2008 +0000
+++ b/config/SConfig/packages/HDF5.py	Mon Apr 07 00:41:49 2008 +0000
@@ -9,6 +9,7 @@ class HDF5(SConfig.Package):
         self.libraries = [["hdf5"]]
 
     def setup(self):
+        SConfig.Package.setup(self)
         if self.require_parallel:
             self.dependency(SConfig.packages.MPI)
             self.symbols = [(["H5Pset_dxpl_mpio", "H5Pset_fapl_mpio"], "")]
diff -r ed5e676bedd9 -r 460b079bd3bf config/SConfig/packages/PETSc.py
--- a/config/SConfig/packages/PETSc.py	Fri Mar 28 04:51:16 2008 +0000
+++ b/config/SConfig/packages/PETSc.py	Mon Apr 07 00:41:49 2008 +0000
@@ -1,4 +1,4 @@ import os
-import os
+import os, re
 import SConfig
 
 class PETSc(SConfig.Package):
@@ -26,7 +26,7 @@ class PETSc(SConfig.Package):
                 yield loc
                 continue
 
-            arch = self.get_petsc_arch(loc[0])
+            arch = self.get_arch(loc[0])
             if not arch:
                 yield loc
                 continue
@@ -48,9 +48,14 @@ class PETSc(SConfig.Package):
             if lib_dir not in loc[2]:
                 loc[2] += [lib_dir]
 
+            # Parse extra libraries.
+            extra_lib_dirs, extra_libs = self.get_extra_libraries(loc[0])
+            if extra_lib_dirs: loc[2] += extra_lib_dirs
+            if extra_libs: self.extra_libraries += extra_libs
+
             yield loc
 
-    def get_petsc_arch(self, base_dir):
+    def get_arch(self, base_dir):
         petscconf = os.path.join(base_dir, 'bmake',
                                  'petscconf')
         if not os.path.exists(petscconf):
@@ -60,6 +65,55 @@ class PETSc(SConfig.Package):
         f.close()
         return arch
 
+    def get_extra_libraries(self, base_dir):
+        petscconf = os.path.join(base_dir, 'bmake', self.arch, 'petscconf')
+        if not os.path.exists(petscconf): return ([], [])
+        f = file(petscconf, 'r')
+        line_dict = {}
+        for line in f.readlines():
+            sides = line.split('=')
+            line_dict[sides[0].strip()] = sides[1].strip()
+        f.close()
+        if 'PACKAGES_LIBS' not in line_dict: return ([], [])
+        lib_string = line_dict['PACKAGES_LIBS']
+        lib_string = self.subst(lib_string, line_dict)
+
+        extra_lib_dirs = []
+        extra_libs = []
+        for string in lib_string.split(' '):
+            if string[:len(self.env['LIBLINKPREFIX'])] == self.env['LIBLINKPREFIX']:
+                extra_libs += [string[len(self.env['LIBLINKPREFIX']):]]
+            elif string[:len(self.env['LIBDIRPREFIX'])] == self.env['LIBDIRPREFIX']:
+                extra_lib_dirs += [string[len(self.env['LIBDIRPREFIX']):]]
+        return (extra_lib_dirs, extra_libs)
+
+    def subst(self, line, line_dict):
+        inp = [w.strip() for w in line.split()]
+        out = []
+        while len(inp):
+            w = inp[0]
+            inp = inp[1:]
+            if self.is_macro(w):
+                new_line = self.expand_macro(w, line_dict)
+                new_words = [nw.strip() for nw in new_line.split()]
+                inp = new_words + inp
+            else:
+                out += [w]
+        return ' '.join(out)
+
+    def expand_macro(self, macro, line_dict):
+        if macro[:2] == '${' and macro[-1:] == '}':
+            macro = macro[2:-1]
+        elif macro[0] == '$':
+            macro = macro[1:]
+        if macro not in line_dict: return ''
+        return line_dict[macro]
+
+    def is_macro(self, word):
+        if (word[:2] == '${' and word[-1:] == '}') or word[0] == '$':
+            return True
+        return False
+
     def get_check_headers_fail_reason(self, fail_logs):
         for log in fail_logs:
             if log.find('MPI_') != -1:
diff -r ed5e676bedd9 -r 460b079bd3bf config/SConfig/packages/PICellerator.py
--- a/config/SConfig/packages/PICellerator.py	Fri Mar 28 04:51:16 2008 +0000
+++ b/config/SConfig/packages/PICellerator.py	Mon Apr 07 00:41:49 2008 +0000
@@ -2,10 +2,8 @@ import SConfig
 import SConfig
 
 class PICellerator(SConfig.Package):
-    def __init__(self, env, options):
-        SConfig.Package.__init__(self, env, options)
-        self.dependency(SConfig.packages.StGermain)
-        self.dependency(SConfig.packages.StgDomain)
+    def __init__(self, scons_env, scons_opts, required=False):
+        SConfig.Package.__init__(self, scons_env, scons_opts, required)
         self.dependency(SConfig.packages.StgFEM)
         self.base_patterns = ['PICellerator*']
         self.headers = [[os.path.join('PICellerator', 'PICellerator.h')]]
@@ -20,9 +18,3 @@ StGermain_Finalise();
 StGermain_Finalise();
 MPI_Finalize();'''
         self.symbol_calls = ['%s(&argc, &argv);', '%s();']
-        self.require_shared = True
-        self.use_rpath = True
-
-    def get_run_error_message(self, console):
-        if len(console):
-            return 'Incompatible libraries, check \'config.log\'.'
diff -r ed5e676bedd9 -r 460b079bd3bf config/SConfig/packages/SVNRevision.py
--- a/config/SConfig/packages/SVNRevision.py	Fri Mar 28 04:51:16 2008 +0000
+++ b/config/SConfig/packages/SVNRevision.py	Mon Apr 07 00:41:49 2008 +0000
@@ -27,3 +27,9 @@ class SVNRevision(SConfig.Node):
 
         self.revision = int(all_lines[3])
         return True
+
+    def enable(self, scons_env, old_state=None):
+        SConfig.Node.enable(self, scons_env, old_state)
+        self.backup_variable(scons_env, 'CPPDEFINES', old_state)
+        ver = scons_env['ESCAPE']('"' + str(self.revision) + '"')
+        scons_env.AppendUnique(CPPDEFINES=[(self.define_name, ver)])
diff -r ed5e676bedd9 -r 460b079bd3bf config/SConfig/packages/StGermain.py
--- a/config/SConfig/packages/StGermain.py	Fri Mar 28 04:51:16 2008 +0000
+++ b/config/SConfig/packages/StGermain.py	Mon Apr 07 00:41:49 2008 +0000
@@ -2,11 +2,12 @@ import SConfig
 import SConfig
 
 class StGermain(SConfig.Package):
-    def __init__(self, env, options):
-        SConfig.Package.__init__(self, env, options)
+    def __init__(self, scons_env, scons_opts, required=False):
+        SConfig.Package.__init__(self, scons_env, scons_opts, required)
         self.dependency(SConfig.packages.cmath)
         self.dependency(SConfig.packages.libXML2)
         self.dependency(SConfig.packages.MPI)
+        self.dependency(SConfig.packages.SVNRevision)
         self.base_patterns = ['StGermain*']
         self.headers = [[os.path.join('StGermain', 'StGermain.h')]]
         self.libraries = [['StGermain']]
@@ -14,9 +15,22 @@ class StGermain(SConfig.Package):
         self.symbol_setup = 'MPI_Init(&argc, &argv);'
         self.symbol_teardown = 'MPI_Finalize();'
         self.symbol_calls = ['%s(&argc, &argv);', '%s();']
-        self.require_shared = True
-        self.use_rpath = True
 
-    def get_run_error_message(self, console):
-        if len(console):
-            return 'Incompatible libraries, check \'config.log\'.'
+    def enable(self, scons_env, old_state=None):
+        SConfig.Package.enable(self, scons_env, old_state)
+        if self.base_dir:
+            script = os.path.join(self.base_dir, 'script', 'pcu', 'scons.py')
+            if os.path.exists(script):
+                self.backup_variable(scons_env, 'CONFIGSCRIPTS', old_state)
+                scons_env.AppendUnique(CONFIGVARS=['CONFIGSCRIPTS'])
+                scons_env.AppendUnique(CONFIGSCRIPTS=[script])
+                env = scons_env
+                scons_env.SConscript(script, 'env')
+
+            script = os.path.join(self.base_dir, 'script', 'StGermain', 'scons.py')
+            if os.path.exists(script):
+                self.backup_variable(scons_env, 'CONFIGSCRIPTS', old_state)
+                scons_env.AppendUnique(CONFIGVARS=['CONFIGSCRIPTS'])
+                scons_env.AppendUnique(CONFIGSCRIPTS=[script])
+                env = scons_env
+                scons_env.SConscript(script, 'env')
diff -r ed5e676bedd9 -r 460b079bd3bf config/SConfig/packages/StgDomain.py
--- a/config/SConfig/packages/StgDomain.py	Fri Mar 28 04:51:16 2008 +0000
+++ b/config/SConfig/packages/StgDomain.py	Mon Apr 07 00:41:49 2008 +0000
@@ -2,9 +2,11 @@ import SConfig
 import SConfig
 
 class StgDomain(SConfig.Package):
-    def __init__(self, env, options):
-        SConfig.Package.__init__(self, env, options)
+    def __init__(self, scons_env, scons_opts, required=False):
+        SConfig.Package.__init__(self, scons_env, scons_opts, required)
         self.dependency(SConfig.packages.StGermain)
+        self.dependency(SConfig.packages.BlasLapack)
+        self.dependency(SConfig.packages.HDF5, False)
         self.base_patterns = ['StgDomain*']
         self.headers = [[os.path.join('StgDomain', 'StgDomain.h')]]
         self.libraries = [['StgDomain']]
@@ -16,9 +18,3 @@ MPI_Finalize();
 MPI_Finalize();
 '''
         self.symbol_calls = ['%s(&argc, &argv);', '%s();']
-        self.require_shared = True
-        self.use_rpath = True
-
-    def get_run_error_message(self, console):
-        if len(console):
-            return 'Incompatible libraries, check \'config.log\'.'
diff -r ed5e676bedd9 -r 460b079bd3bf config/SConfig/packages/StgFEM.py
--- a/config/SConfig/packages/StgFEM.py	Fri Mar 28 04:51:16 2008 +0000
+++ b/config/SConfig/packages/StgFEM.py	Mon Apr 07 00:41:49 2008 +0000
@@ -2,10 +2,11 @@ import SConfig
 import SConfig
 
 class StgFEM(SConfig.Package):
-    def __init__(self, env, options):
-        SConfig.Package.__init__(self, env, options)
-        self.dependency(SConfig.packages.StGermain)
+    def __init__(self, scons_env, scons_opts, required=False):
+        SConfig.Package.__init__(self, scons_env, scons_opts, required)
         self.dependency(SConfig.packages.StgDomain)
+        petsc = self.dependency(SConfig.packages.PETSc)
+        petsc.have_define = 'HAVE_PETSC'
         self.base_patterns = ['StgFEM*']
         self.headers = [[os.path.join('StgFEM', 'StgFEM.h')]]
         self.libraries = [['StgFEM']]
@@ -17,9 +18,3 @@ StGermain_Finalise();
 StGermain_Finalise();
 MPI_Finalize();'''
         self.symbol_calls = ['%s(&argc, &argv);', '%s();']
-        self.require_shared = True
-        self.use_rpath = True
-
-    def get_run_error_message(self, console):
-        if len(console):
-            return 'Incompatible libraries, check \'config.log\'.'
diff -r ed5e676bedd9 -r 460b079bd3bf config/SConfig/packages/__init__.py
--- a/config/SConfig/packages/__init__.py	Fri Mar 28 04:51:16 2008 +0000
+++ b/config/SConfig/packages/__init__.py	Mon Apr 07 00:41:49 2008 +0000
@@ -21,3 +21,5 @@ from libavcodec import libavcodec
 from libavcodec import libavcodec
 from HDF5 import HDF5
 from X11 import X11
+from pcu import pcu
+from cobj import cobj
diff -r ed5e676bedd9 -r 460b079bd3bf config/SConfig/packages/cobj.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/config/SConfig/packages/cobj.py	Mon Apr 07 00:41:49 2008 +0000
@@ -0,0 +1,9 @@
+import os
+import SConfig
+
+class cobj(SConfig.Package):
+    def __init__(self, scons_env, scons_opts, required=False):
+        SConfig.Package.__init__(self, scons_env, scons_opts, required)
+        self.dependency(SConfig.packages.pcu)
+        self.headers = [[os.path.join('cobj', 'cobj.h')]]
+        self.libraries = [['cobj']]
diff -r ed5e676bedd9 -r 460b079bd3bf config/SConfig/packages/dl.py
--- a/config/SConfig/packages/dl.py	Fri Mar 28 04:51:16 2008 +0000
+++ b/config/SConfig/packages/dl.py	Mon Apr 07 00:41:49 2008 +0000
@@ -7,3 +7,6 @@ class dl(SConfig.Package):
         self.dependency(SConfig.packages.CompilerFlags)
         self.headers = [['dlfcn.h']]
         self.libraries = [['dl']]
+
+    def setup(self):
+        SConfig.Node.setup(self)
diff -r ed5e676bedd9 -r 460b079bd3bf config/SConfig/packages/pcu.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/config/SConfig/packages/pcu.py	Mon Apr 07 00:41:49 2008 +0000
@@ -0,0 +1,29 @@
+import os
+import SConfig
+
+class pcu(SConfig.Package):
+    def __init__(self, scons_env, scons_opts, required=False):
+        SConfig.Package.__init__(self, scons_env, scons_opts, required)
+        self.dependency(SConfig.packages.MPI)
+        self.headers = [[os.path.join('pcu', 'pcu.h')]]
+        self.libraries = [['pcu']]
+        self.checks += [self.check_scons_script]
+
+        self.scons_script = ''
+
+    def check_scons_script(self):
+        if self.base_dir:
+            script = os.path.join(self.base_dir, 'script', 'pcu', 'scons.py')
+            if os.path.exists(script):
+                self.scons_script = script
+                self.ctx.Display('      Found SCons builder script.\n')
+        return True
+
+    def enable(self, scons_env, old_state=None):
+        SConfig.Package.enable(self, scons_env, old_state)
+        if self.scons_script:
+            self.backup_variable(scons_env, 'CONFIGSCRIPTS', old_state)
+            scons_env.AppendUnique(CONFIGVARS=['CONFIGSCRIPTS'])
+            scons_env.AppendUnique(CONFIGSCRIPTS=[self.scons_script])
+            env = scons_env
+            scons_env.SConscript(self.scons_script, 'env')



More information about the CIG-COMMITS mailing list