[cig-commits] commit:

Mercurial hg at geodynamics.org
Mon Nov 24 11:58:34 PST 2008


changeset:   53:4633c82149c9
user:        LukeHodkinson
date:        Thu Mar 06 07:09:16 2008 +0000
files:       config/SConfig/Package.py config/SConfig/packages/BlasLapack.py config/SConfig/packages/MPI.py config/SConfig/packages/PETSc.py config/SConfig/packages/PICellerator.py config/SConfig/packages/StGermain.py config/SConfig/packages/StgDomain.py config/SConfig/packages/StgFEM.py config/SConfig/packages/__init__.py config/SConfig/packages/cmath.py config/SConfig/packages/libXML2.py
description:
Inserting include path setup.


diff -r 00278c6acbdc -r 4633c82149c9 config/SConfig/Package.py
--- a/config/SConfig/Package.py	Thu Mar 06 07:08:53 2008 +0000
+++ b/config/SConfig/Package.py	Thu Mar 06 07:09:16 2008 +0000
@@ -1,11 +1,15 @@ import os, platform, glob
 import os, platform, glob
 import SCons.Script
+import SConfig
 
 class Package(object):
     def __init__(self, env, options=None, required=True):
         # Construct this package's name.
         self.name = self.__module__.split('.')[-1]
         self.option_name = self.name.lower()
+        self.environ_name = self.name.upper()
+        self.command_options = {}
+        self.environ_options = {}
 
         # Setup some system specific information.
         self.system = platform.system()
@@ -16,9 +20,6 @@ class Package(object):
 
         # Is this package essential?
         self.required          = required
-
-        # Dependency list.
-        self.dependencies      = [] #[<module>]
 
         # Language options.
         self.language          = 'C' # 'C' | 'CXX' | 'F77'
@@ -31,18 +32,17 @@ class Package(object):
         self.header_sub_dir    = ''
 
         # Header options.
-        self.headers            = [] #['']
-        self.dependency_headers = [] # ['']
+        self.headers            = [[]] #[['']]
 
         # Library options.
         self.libraries         = [] #[['']]
         self.require_shared    = False
-        self.use_rpath         = False
-        self.symbols           = [([], '')] # [([''], '')]
+        self.use_rpath         = True
+        self.symbols           = [([], '')] #[([''], '')]
         self.symbol_setup      = ''
         self.symbol_teardown   = ''
-        self.symbol_prototypes = [] # ['']
-        self.symbol_calls      = [] # ['']
+        self.symbol_prototypes = [] #['']
+        self.symbol_calls      = [] #['']
 
         # Framework options.
         self.frameworks        = [] #[['']]
@@ -55,10 +55,11 @@ class Package(object):
 
         # Once configured, these values will be set.
         self.configured = False
-        self.result = (0, '', '')
+        self.result = [0, '', '']
         self.cpp_defines = []
         self.base_dir = ''
         self.hdr_dirs = []
+        self.hdrs = []
         self.lib_dirs = []
         self.libs = []
         self.have_shared = None
@@ -66,23 +67,19 @@ class Package(object):
         self.state = {}
 
         # Private stuff.
-        self.sconf = None
         self.env = env
         self.opts = options
+        self.deps = []
+
+        self.setup_search_defaults()
+        self.setup_options()
 
     def setup_search_defaults(self):
         # Set common defaults of Darwin and Linux.
         if self.system in ['Darwin', 'Linux']:
             self.base_dirs = ['/usr', '/usr/local']
             self.sub_dirs = [[['include'], ['lib']]]
-            if self.header_sub_dir:
-                self.sub_dirs += [[[os.path.join('include', self.header_sub_dir)], ['lib']]]
             if self.bits == 64:
-                if self.header_sub_dir:
-                    self.sub_dirs = [[[os.path.join('include', self.header_sub_dir)],
-                                      ['lib64']],
-                                     [[os.path.join('include', self.header_sub_dir)],
-                                      [os.path.join('lib', '64')]]] + self.sub_dirs
                 self.sub_dirs = [[['include'], ['lib64']],
                                  [['include'], [os.path.join('lib', '64')]]] + self.sub_dirs
 
@@ -97,6 +94,16 @@ class Package(object):
     def setup_options(self):
         if not self.opts:
             return
+        self.command_options = [self.option_name + 'Dir',
+                                self.option_name + 'IncDir',
+                                self.option_name + 'LibDir',
+                                self.option_name + 'Lib',
+                                self.option_name + 'Framework']
+        self.environ_options = {self.option_name + 'Dir': self.environ_name + '_DIR',
+                                self.option_name + 'IncDir': self.environ_name + '_INC_DIR',
+                                self.option_name + 'LibDir': self.environ_name + '_LIB_DIR',
+                                self.option_name + 'Lib': self.environ_name + '_LIB',
+                                self.option_name + 'Framework': self.environ_name + '_FRAMEWORK'}
         self.opts.AddOptions(
             SCons.Script.PathOption(self.option_name + 'Dir',
                                     '%s installation path' % self.name,
@@ -131,8 +138,16 @@ class Package(object):
         self.ctx = configure_context
         self.configured = True
 
+        # If we have shared libraries enabled, we must ensure the dynamic loader
+        # package is included.
+        if self.require_shared:
+            self.pkg_dl = self.require(SConfig.packages.dl)
+
         # Process dependencies first.
         self.process_dependencies()
+
+        # Process options.
+        self.process_options()
 
         # Perfrom actual configuration.
         for check in self.checks:
@@ -142,6 +157,15 @@ class Package(object):
 
         # Required?
         if self.required and not result[0]:
+            self.ctx.Display('\nThe required package ' + self.name + ' could not be found.\n')
+            self.ctx.Display('The printouts above should provide some information on what went wrong,\n')
+            self.ctx.Display('To see further details, please read the \'config.log\' file.\n')
+            if len(self.command_options):
+                self.ctx.Display('You can directly specify search parameters for this package via\n')
+                self.ctx.Display('the following command line options:\n\n')
+                for opt in self.command_options:
+                    self.ctx.Display('  ' + opt + '\n')
+                self.ctx.Display('\nRun \'scons help\' for more details on these options.\n\n')
             self.env.Exit()
 
         # If we succeeded, store the resulting environment.
@@ -153,19 +177,29 @@ class Package(object):
 
         return result
 
-    def setup_dependencies(self):
-        # If the package doesn't yet exist, create it.
-        for pkg_module in self.dependencies:
-            if pkg_module not in self.env.packages:
-                self.env.Package(pkg_module, self.opts)
+    def require(self, package_module):
+        pkg = self.env.Package(package_module, self.opts)
+        self.deps += [pkg]
+        return pkg
 
     def process_dependencies(self):
         """Ensure all dependencies have been configured before this package."""
-        for pkg_module in self.dependencies:
-            # Configure the dependency now.
-            pkg = self.env.packages[pkg_module]
-            pkg.sconf = self.sconf
+        for pkg in self.deps:
             pkg.configure(self.ctx)
+
+    def process_options(self):
+        """Do any initial option processing, including importing any values from
+        the environment and validating that all options are consistent."""
+        cmd_opts = False
+        for opt in self.command_options:
+            if opt in self.opts.args:
+                cmd_opts = True
+                break
+        if cmd_opts:
+            return
+        for cmd, env in self.environ_options.iteritems():
+            if cmd not in self.opts.args and env in self.env['ENV']:
+                self.env[cmd] = self.env['ENV'][env]
 
     def find_package(self):
         # Search for package locations.
@@ -225,11 +259,18 @@ class Package(object):
     def check_headers(self, location):
         """Determine if the required headers are available with the current construction
         environment settings."""
-        src = self.get_header_source()
-        result = self.run_scons_cmd(self.ctx.TryCompile, src, '.c')
-        msg = self.get_headers_error_message(result[1])
-        if not msg:
-            msg = 'Failed to locate headers.'
+        for hdrs in self.headers:
+            src = self.get_header_source(hdrs)
+            result = self.run_scons_cmd(self.ctx.TryCompile, src, '.c')
+            if result[0]:
+                self.hdrs = list(hdrs)
+                break
+        if not result[0]:
+            msg = self.get_headers_error_message(result[1])
+            if not msg:
+                msg = 'Failed to locate headers.'
+        else:
+            msg = ''
         return [result[0], '', msg]
 
     def check_libs(self, location, libs):
@@ -277,8 +318,25 @@ class Package(object):
 
     def check_shared(self, location, libs):
         """Confirm that there are shared versions of this package's libraries available."""
-        # TODO
-        return [1, '', '']
+        if not self.pkg_dl.result[0]:
+            return [0, '', 'No dynamic loader found (libdl).']
+
+        # Build a binary to try and dynamically open the library.
+        result = [1, '', '']
+        for l in libs:
+            src = self.get_header_source()
+            src += '#include<dlfcn.h>\n'
+            src += """
+int main(int argc, char* argv[]) {
+  void* lib;
+  lib = dlopen("%s", RTLD_LAZY);
+  return lib ? 0 : 1;
+}
+""" % self.env.subst('${SHLIBPREFIX}' + l + '${SHLIBSUFFIX}')
+            result = self.run_source(src)
+            if not result[0]:
+                break
+        return result
 
     def run_source(self, source):
         """At this point we know all our construction environment has been set up,
@@ -346,6 +404,8 @@ class Package(object):
                 if os.path.exists(dir) and os.path.isdir(dir):
                     for hdr, lib in self.combine_sub_dirs(dir):
                         yield [dir, list(hdr), list(lib), list(fw)]
+                        for sub in self.combine_header_sub_dir(dir, hdr):
+                            yield [dir, list(sub), list(lib), list(fw)]
 
     def combine_sub_dirs(self, base_dir):
         """Take a base directory and combine it with the set of header and library
@@ -376,6 +436,16 @@ class Package(object):
                 continue
 
             yield (hdr_dirs, lib_dirs)
+
+    def combine_header_sub_dir(self, base_dir, hdr_dirs):
+        if not self.header_sub_dir or not hdr_dirs:
+            return
+        cand = [os.path.join(h, self.header_sub_dir) for h in hdr_dirs if h]
+        for d in cand:
+            path = os.path.join(base_dir, d)
+            if not (os.path.exists(path) and os.path.isdir(path)):
+                return
+        yield cand
 
     def join_sub_dir(self, base_dir, sub_dir):
         if os.path.isabs(sub_dir):
@@ -452,9 +522,22 @@ class Package(object):
     def pop_state(self, old):
         self.env.Replace(**old)
 
-    def get_header_source(self):
+    def get_all_headers(self, headers):
+        if not self.result[0]:
+            return
+        headers += [h for h in self.hdrs if h not in headers]
+        for d in self.deps:
+            d.get_all_headers(headers)
+
+    def get_header_source(self, headers=None):
         src = '#include<stdlib.h>\n#include<stdio.h>\n#include<string.h>\n'
-        for h in self.dependency_headers + self.headers:
+        if headers is None:
+            hdrs = list(self.hdrs)
+        else:
+            hdrs = list(headers)
+        for d in self.deps:
+            d.get_all_headers(hdrs)
+        for h in hdrs:
             src += '#include<' + h + '>\n'
         return src
 
diff -r 00278c6acbdc -r 4633c82149c9 config/SConfig/packages/BlasLapack.py
--- a/config/SConfig/packages/BlasLapack.py	Thu Mar 06 07:08:53 2008 +0000
+++ b/config/SConfig/packages/BlasLapack.py	Thu Mar 06 07:09:16 2008 +0000
@@ -4,8 +4,7 @@ class BlasLapack(SConfig.Package):
 class BlasLapack(SConfig.Package):
     def __init__(self, env, options):
         SConfig.Package.__init__(self, env, options)
-        self.setup_search_defaults()
-        self.setup_options()
+        self.cmath = self.require(SConfig.packages.cmath)
         self.libraries = [['blas', 'lapack'],
                           ['cblas', 'clapack'],
                           ['mkl', 'mkl_lapack']]
diff -r 00278c6acbdc -r 4633c82149c9 config/SConfig/packages/MPI.py
--- a/config/SConfig/packages/MPI.py	Thu Mar 06 07:08:53 2008 +0000
+++ b/config/SConfig/packages/MPI.py	Thu Mar 06 07:09:16 2008 +0000
@@ -4,11 +4,9 @@ class MPI(SConfig.Package):
 class MPI(SConfig.Package):
     def __init__(self, env, options):
         SConfig.Package.__init__(self, env, options)
+        self.base_patterns = ['mpich*', 'MPICH*']
         self.header_sub_dir = 'mpi'
-        self.setup_search_defaults()
-        self.setup_options()
-        self.base_patterns = ['mpich*', 'MPICH*']
-        self.headers = ['mpi.h']
+        self.headers = [['mpi.h']]
         self.libraries = [['mpich'],
                           ['mpich', 'pmpich'],
                           ['mpich', 'rt'],
@@ -16,3 +14,11 @@ class MPI(SConfig.Package):
                           ['mpi']]
         self.require_shared = True
         self.use_rpath = True
+
+    def validate_location(self, location):
+        for lib_dir in location[2]:
+            shared_dir = os.path.join(lib_dir, 'shared')
+            path = os.path.join(location[0], shared_dir)
+            if os.path.exists(path):
+                location[2] += [shared_dir]
+        return [1, '', '']
diff -r 00278c6acbdc -r 4633c82149c9 config/SConfig/packages/PETSc.py
--- a/config/SConfig/packages/PETSc.py	Thu Mar 06 07:08:53 2008 +0000
+++ b/config/SConfig/packages/PETSc.py	Thu Mar 06 07:09:16 2008 +0000
@@ -4,17 +4,15 @@ class PETSc(SConfig.Package):
 class PETSc(SConfig.Package):
     def __init__(self, env, options):
         SConfig.Package.__init__(self, env, options)
+        self.require(SConfig.packages.MPI)
+        self.base_patterns = ['petsc*', 'PETSC*', 'PETSc*']
         self.header_sub_dir = 'petsc'
-        self.setup_search_defaults()
-        self.setup_options()
-        self.dependencies = [SConfig.packages.MPI]
-        self.base_patterns = ['petsc*', 'PETSC*', 'PETSc*']
-        self.headers = ['petsc.h',
-                        'petscvec.h', 'petscmat.h',
-                        'petscksp.h', 'petscsnes.h']
-        self.libraries = [['petsc', 'petscdm',
-                           'petscvec', 'petscmat',
-                           'petscksp', 'petscsnes']]
+        self.headers = [['petsc.h',
+                         'petscvec.h', 'petscmat.h',
+                         'petscksp.h', 'petscsnes.h']]
+        self.libraries = [['petscsnes', 'petscksp',
+                           'petscmat', 'petscvec',
+                           'petscdm', 'petsc',]]
         self.require_shared = True
         self.use_rpath = True
         self.have_define = 'HAVE_PETSC'
diff -r 00278c6acbdc -r 4633c82149c9 config/SConfig/packages/PICellerator.py
--- a/config/SConfig/packages/PICellerator.py	Thu Mar 06 07:08:53 2008 +0000
+++ b/config/SConfig/packages/PICellerator.py	Thu Mar 06 07:09:16 2008 +0000
@@ -4,14 +4,11 @@ class PICellerator(SConfig.Package):
 class PICellerator(SConfig.Package):
     def __init__(self, env, options):
         SConfig.Package.__init__(self, env, options)
-        self.setup_search_defaults()
-        self.setup_options()
-        self.dependencies = [SConfig.packages.StGermain]
+        self.require(SConfig.packages.StGermain)
+        self.require(SConfig.packages.StgDomain)
+        self.require(SConfig.packages.StgFEM)
         self.base_patterns = ['PICellerator*']
-        self.headers = [os.path.join('PICellerator', 'PICellerator.h')]
-        self.dependency_headers = [os.path.join('StGermain', 'StGermain.h'),
-                                   os.path.join('StgDomain', 'StgDomain.h'),
-                                   os.path.join('StgFEM', 'StgFEM.h')]
+        self.headers = [[os.path.join('PICellerator', 'PICellerator.h')]]
         self.libraries = [['PICellerator']]
         self.symbols = [(['PICellerator_Init', 'PICellerator_Finalise'], '')]
         self.symbol_setup = '''MPI_Init(&argc, &argv);
diff -r 00278c6acbdc -r 4633c82149c9 config/SConfig/packages/StGermain.py
--- a/config/SConfig/packages/StGermain.py	Thu Mar 06 07:08:53 2008 +0000
+++ b/config/SConfig/packages/StGermain.py	Thu Mar 06 07:09:16 2008 +0000
@@ -4,13 +4,11 @@ class StGermain(SConfig.Package):
 class StGermain(SConfig.Package):
     def __init__(self, env, options):
         SConfig.Package.__init__(self, env, options)
-        self.setup_search_defaults()
-        self.setup_options()
-        self.dependencies = [SConfig.packages.cmath,
-                             SConfig.packages.libXML2,
-                             SConfig.packages.MPI]
+        self.require(SConfig.packages.cmath)
+        self.require(SConfig.packages.libXML2)
+        self.require(SConfig.packages.MPI)
         self.base_patterns = ['StGermain*']
-        self.headers = [os.path.join('StGermain', 'StGermain.h')]
+        self.headers = [[os.path.join('StGermain', 'StGermain.h')]]
         self.libraries = [['StGermain']]
         self.symbols = [(['StGermain_Init', 'StGermain_Finalise'], '')]
         self.symbol_setup = 'MPI_Init(&argc, &argv);'
diff -r 00278c6acbdc -r 4633c82149c9 config/SConfig/packages/StgDomain.py
--- a/config/SConfig/packages/StgDomain.py	Thu Mar 06 07:08:53 2008 +0000
+++ b/config/SConfig/packages/StgDomain.py	Thu Mar 06 07:09:16 2008 +0000
@@ -4,12 +4,9 @@ class StgDomain(SConfig.Package):
 class StgDomain(SConfig.Package):
     def __init__(self, env, options):
         SConfig.Package.__init__(self, env, options)
-        self.setup_search_defaults()
-        self.setup_options()
-        self.dependencies = [SConfig.packages.StGermain]
+        self.require(SConfig.packages.StGermain)
         self.base_patterns = ['StgDomain*']
-        self.headers = [os.path.join('StgDomain', 'StgDomain.h')]
-        self.dependency_headers = [os.path.join('StGermain', 'StGermain.h')]
+        self.headers = [[os.path.join('StgDomain', 'StgDomain.h')]]
         self.libraries = [['StgDomain']]
         self.symbols = [(['StgDomain_Init', 'StgDomain_Finalise'], '')]
         self.symbol_setup = '''MPI_Init(&argc, &argv);
diff -r 00278c6acbdc -r 4633c82149c9 config/SConfig/packages/StgFEM.py
--- a/config/SConfig/packages/StgFEM.py	Thu Mar 06 07:08:53 2008 +0000
+++ b/config/SConfig/packages/StgFEM.py	Thu Mar 06 07:09:16 2008 +0000
@@ -4,13 +4,10 @@ class StgFEM(SConfig.Package):
 class StgFEM(SConfig.Package):
     def __init__(self, env, options):
         SConfig.Package.__init__(self, env, options)
-        self.setup_search_defaults()
-        self.setup_options()
-        self.dependencies = [SConfig.packages.StGermain]
+        self.require(SConfig.packages.StGermain)
+        self.require(SConfig.packages.StgDomain)
         self.base_patterns = ['StgFEM*']
-        self.headers = [os.path.join('StgFEM', 'StgFEM.h')]
-        self.dependency_headers = [os.path.join('StGermain', 'StGermain.h'),
-                                   os.path.join('StgDomain', 'StgDomain.h')]
+        self.headers = [[os.path.join('StgFEM', 'StgFEM.h')]]
         self.libraries = [['StgFEM']]
         self.symbols = [(['StgFEM_Init', 'StgFEM_Finalise'], '')]
         self.symbol_setup = '''MPI_Init(&argc, &argv);
diff -r 00278c6acbdc -r 4633c82149c9 config/SConfig/packages/__init__.py
--- a/config/SConfig/packages/__init__.py	Thu Mar 06 07:08:53 2008 +0000
+++ b/config/SConfig/packages/__init__.py	Thu Mar 06 07:09:16 2008 +0000
@@ -8,3 +8,5 @@ from StgDomain import StgDomain
 from StgDomain import StgDomain
 from StgFEM import StgFEM
 from PICellerator import PICellerator
+from dl import dl
+from OpenGL import OpenGL
diff -r 00278c6acbdc -r 4633c82149c9 config/SConfig/packages/cmath.py
--- a/config/SConfig/packages/cmath.py	Thu Mar 06 07:08:53 2008 +0000
+++ b/config/SConfig/packages/cmath.py	Thu Mar 06 07:09:16 2008 +0000
@@ -4,5 +4,4 @@ class cmath(SConfig.Package):
 class cmath(SConfig.Package):
     def __init__(self, env, options):
         SConfig.Package.__init__(self, env, options)
-        self.setup_options()
         self.libraries = [['m']]
diff -r 00278c6acbdc -r 4633c82149c9 config/SConfig/packages/libXML2.py
--- a/config/SConfig/packages/libXML2.py	Thu Mar 06 07:08:53 2008 +0000
+++ b/config/SConfig/packages/libXML2.py	Thu Mar 06 07:09:16 2008 +0000
@@ -5,7 +5,5 @@ class libXML2(SConfig.Package):
     def __init__(self, env, options):
         SConfig.Package.__init__(self, env, options)
         self.header_sub_dir = 'libxml2'
-        self.setup_search_defaults()
-        self.setup_options()
-        self.headers = [os.path.join('libxml', 'parser.h')]
+        self.headers = [[os.path.join('libxml', 'parser.h')]]
         self.libraries = [['xml2']]



More information about the CIG-COMMITS mailing list