[Numpy-svn] r4405 - in branches/numpy.scons/numpy: distutils/scons distutils/scons/checkers distutils/scons/core distutils/scons/doc scons_fake/checklib scons_fake/ctypesext

numpy-svn@scip... numpy-svn@scip...
Tue Nov 6 05:01:21 CST 2007


Author: cdavid
Date: 2007-11-06 05:01:09 -0600 (Tue, 06 Nov 2007)
New Revision: 4405

Modified:
   branches/numpy.scons/numpy/distutils/scons/__init__.py
   branches/numpy.scons/numpy/distutils/scons/checkers/perflib.py
   branches/numpy.scons/numpy/distutils/scons/core/libinfo.py
   branches/numpy.scons/numpy/distutils/scons/core/libinfo_scons.py
   branches/numpy.scons/numpy/distutils/scons/doc/TODO
   branches/numpy.scons/numpy/scons_fake/checklib/SConstruct
   branches/numpy.scons/numpy/scons_fake/ctypesext/SConstruct
Log:
A generic lib and header check is now available

Modified: branches/numpy.scons/numpy/distutils/scons/__init__.py
===================================================================
--- branches/numpy.scons/numpy/distutils/scons/__init__.py	2007-11-06 09:24:01 UTC (rev 4404)
+++ branches/numpy.scons/numpy/distutils/scons/__init__.py	2007-11-06 11:01:09 UTC (rev 4405)
@@ -1,5 +1,5 @@
 from core.numpyenv import GetNumpyEnvironment, GetNumpyOptions
-from core.libinfo_scons import NumpyCheckLib
+from core.libinfo_scons import NumpyCheckLibAndHeader
 from core.libinfo import get_paths as scons_get_paths
 from core.extension import get_python_inc, get_pythonlib_dir
 from core.utils import isstring, rsplit

Modified: branches/numpy.scons/numpy/distutils/scons/checkers/perflib.py
===================================================================
--- branches/numpy.scons/numpy/distutils/scons/checkers/perflib.py	2007-11-06 09:24:01 UTC (rev 4404)
+++ branches/numpy.scons/numpy/distutils/scons/checkers/perflib.py	2007-11-06 11:01:09 UTC (rev 4405)
@@ -42,6 +42,8 @@
     (cpppath, libs, libpath), found = get_config_from_section(siteconfig, section)
     if found:
         opts = ConfigOpts(cpppath = cpppath, libpath = libpath, libs = libs)
+        if len(libs) == 1 and len(libs[0]) == 0:
+            opts['libs'] = defopts['libs']
     else:
         opts = defopts
 
@@ -52,8 +54,9 @@
     # Check whether the header is available (CheckHeader-like checker)
     saved = save_and_set(env, opts)
     try:
-        # XXX: add dep vars in code
-        src = '\n'.join([r'#include <%s>' % h for h in headers_to_check])
+        src_code = [r'#include <%s>' % h for h in headers_to_check]
+        src_code.extend([r'#if 0', str(opts), r'#endif', '\n'])
+        src = '\n'.join(src_code)
         st = context.TryCompile(src, '.c')
     finally:
         restore(env, saved)
@@ -67,8 +70,8 @@
     saved = save_and_set(env, opts)
     try:
         for sym in funcs_to_check:
-            # XXX: add dep vars in code
-            st = check_symbol(context, headers_to_check, sym)
+            extra = [r'#if 0', str(opts), r'#endif', '\n']
+            st = check_symbol(context, headers_to_check, sym, '\n'.join(extra))
             if not st:
                 break
     finally:

Modified: branches/numpy.scons/numpy/distutils/scons/core/libinfo.py
===================================================================
--- branches/numpy.scons/numpy/distutils/scons/core/libinfo.py	2007-11-06 09:24:01 UTC (rev 4404)
+++ branches/numpy.scons/numpy/distutils/scons/core/libinfo.py	2007-11-06 11:01:09 UTC (rev 4405)
@@ -1,5 +1,5 @@
 #! /usr/bin/env python
-# Last Change: Mon Oct 29 03:00 PM 2007 J
+# Last Change: Tue Nov 06 06:00 PM 2007 J
 
 # Module for support to look for external code (replacement of
 # numpy.distutils.system_info). KEEP THIS INDEPENDANT OF SCONS !
@@ -71,17 +71,17 @@
     if siteconfig.has_section(section):
         try:
             libpath = get_paths(siteconfig.get(section, 'library_dirs'))
-        except ConfigParser.NoSectionError, e:
+        except ConfigParser.NoOptionError, e:
             libpath = []
 
         try:
             cpppath = get_paths(siteconfig.get(section, 'include_dirs'))
-        except ConfigParser.NoSectionError, e:
+        except ConfigParser.NoOptionError, e:
             cpppath = []
 
         try:
             libs = parse_config_param(siteconfig.get(section, 'libraries'))
-        except ConfigParser.NoSectionError, e:
+        except ConfigParser.NoOptionError, e:
             libs = []
         return (cpppath, libs, libpath), 1
     else:

Modified: branches/numpy.scons/numpy/distutils/scons/core/libinfo_scons.py
===================================================================
--- branches/numpy.scons/numpy/distutils/scons/core/libinfo_scons.py	2007-11-06 09:24:01 UTC (rev 4404)
+++ branches/numpy.scons/numpy/distutils/scons/core/libinfo_scons.py	2007-11-06 11:01:09 UTC (rev 4405)
@@ -1,11 +1,16 @@
 #! /usr/bin/env python
-# Last Change: Fri Oct 26 04:00 PM 2007 J
+# Last Change: Tue Nov 06 07:00 PM 2007 J
 
 # Module for support to look for external code (replacement of
 # numpy.distutils.system_info). scons dependant code.
 import ConfigParser
 from copy import deepcopy
 
+import os
+from numpy.distutils.scons.core.libinfo import get_config_from_section, get_config
+from numpy.distutils.scons.checkers.support import ConfigOpts, save_and_set, \
+                                                   restore, check_symbol
+
 from libinfo import get_config, get_paths, parse_config_param
 from utils import get_empty
 
@@ -22,106 +27,16 @@
     return 0;
 }\n """
 
-def _CheckLib(context, libs, symbols, header, language, section, siteconfig, 
-              libpath, cpppath, verbose):
-    """Implementation for checking a list of symbols, with libs.
-    
-    Assumes that libs, symbol, header, libpath and cpppath are sequences (list
-    or tuples). DO NOT USE DIRECTLY IN SCONSCRIPT !!!"""
-    # XXX: sanitize API for section/siteconfig option: if section is not given,
-    # can we just say to ignore the sitecfg ?
-    if not siteconfig:
-        siteconfig, cfgfiles = get_config()
+def NumpyCheckLibAndHeader(context, libs, symbols = None, headers = None,
+        language = None, section = None, name = None,
+        autoadd = 1):
+    # XXX: would be nice for each extension to add an option to
+    # command line.
 
-    def get_descr():
-        try:
-            descr = siteconfig.items(section)
-        except ConfigParser.NoSectionError:
-            descr = ""
-        sdescr = ""
-        for i in descr:
-            sdescr += str(i) + '\n'
-        return sdescr
-        
-    # Generate the source string of the conftest
-    src = ""
-    callstr = ""
-
-    if symbols:
-        for s in symbols:
-            # XXX: should put undef here (ala autoconf)
-            src += _SYMBOL_DEF_STR % s
-            callstr += "%s();" % s
-
-    src += _MAIN_CALL_CENTER % callstr
-    # HUGE HACK: we want this test to depend on site.cfg files obviously, since
-    # a change in them can change the libraries tested. But Depends does not
-    # seem to work in configuration context, and I don't see any simple way to
-    # have the same functionality. So I put the configuration we got from
-    # get_config into the source code, such as a change in site.cfg will change
-    # the source file, and thus taken into account to decide whether to rebuild
-    # from tjhe SconfTaskMaster point of view.
-
-    # XXX: I put the content between #if 0 / #endif, which is the most portable
-    # way I am aware of for multilines comments in C and C++ (this is also
-    # recommended in C++ portability guide of mozilla for nested comments,
-    # which may happen here). This is also the most robust, since it seems
-    # unlikely to have any #endif somewhere in the return value of get_descr.
-    src += "#if 0\n"
-    src += get_descr()
-    src += "\n#endif\n"
-
-    # XXX: handle autoadd
-    # XXX: handle extension 
-    extension = '.c'
-
-    if section and siteconfig:
-        #print "Checking %s from section %s" % (libs[0], section)
-        res = _check_lib_section(context, siteconfig, section, src, libs,
-                                 libpath, cpppath)
-    else:
-        oldLIBS = context.env.has_key('LIBS') and deepcopy(context.env['LIBS'])
-        context.env.Append(LIBS = libs)
-        res = context.TryLink(src, '.c')
-        if not res:
-            context.env.Replace(LIBS = oldLIBS) 
-
-    return res
-
-
-def NumpyCheckLib(context, libs, symbols = None, header = None, 
-                  language = None, section = None, siteconfig = None, name = None, verbose = None):
-    """Check for symbol in libs. 
-    
-    This is the general purpose replacement for numpy.distutils.system_info. It
-    uses the options in siteconfig so that search path can be overwritten in
-    *.cfg files (using section given by section argument). If siteconfig is
-    None, it does uses get_config function to get the configuration, which
-    gives the old numpy.distutils behaviour to get options.
-
-    
-    Convention: if the section has *dirs parameters, it will use them all in
-    one pass, e.g if library_dirs is ['/usr/local/lib', '/usr/local/mylib'], it
-    will try to link the given libraries by appending both directories to the
-    LIBPATH."""
-    #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-    # This is really preliminary, and needs a lot of love before being in good
-    # shape !!!!!
-    #
-    # Biggest problem: how to show information about found libraries ? Since
-    # they are found implicitely through build tools (compiler and linker), we
-    # can not give explicit information. IMHO (David Cournapeau), it is better
-    # to find them implicitely because it is much more robust. But for the info...
-    # 
-    # This needs testing, too.
-    #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     from SCons.Util import is_List
 
     env = context.env
 
-    # XXX: would be nice for each extension to add an option to
-    # command line.
-    # XXX: handle env var
     # XXX: handle language
     if language:
         raise NotImplementedError("FIXME: language selection not implemented yet !")
@@ -131,66 +46,78 @@
         libs = [libs]
     if symbols and not is_List(symbols):
         symbols = [symbols]
+    if headers and not is_List(headers):
+        headers = [headers]
 
     if not name:
         name = libs[0]
 
+    # Get site.cfg customization if any
+    siteconfig, cfgfiles = get_config()
+    (cus_cpppath, cus_libs, cus_libpath), found = \
+        get_config_from_section(siteconfig, section)
+    if found:
+        opts = ConfigOpts(cpppath = cus_cpppath, libpath = cus_libpath, 
+                          libs = cus_libs)
+        # XXX: fix this
+        if len(cus_libs) == 1 and len(cus_libs[0]) == 0:
+            opts['libs'] = libs
+    else:
+        opts = ConfigOpts(libs = libs)
+    
     # Display message
     if symbols:
         sbstr = ', '.join(symbols)
-        context.Message('Checking for symbol(s) %s in %s... ' % (sbstr, name))
+        msg = 'Checking for symbol(s) %s in %s... ' % (sbstr, name)
+        if found:
+            msg += '(customized from site.cfg) '
     else:
-        context.Message('Checking for %s... ' % name)
+        msg = 'Checking for %s... ' % name
+        if found:
+            msg += '(customized from site.cfg) '
+    context.Message(msg)
 
-    # Call the implementation
-    libpath = None
-    cpppath = None
-    res = _CheckLib(context, libs, symbols, header, language, section,
-                    siteconfig, libpath, cpppath, verbose)
-    context.Result(res)
-    return res
-
-def _check_lib_section(context, siteconfig, section, src, libs, libpath, cpppath):
-    # Convention: if an option is found in site.cfg for the given
-    # section, it takes precedence on the arguments libs, libpath,
-    # cpppath.
-    res = 1
-
-    # XXX: refactor this mess
+    # Disable from environment if name=None is in it
     try:
-        newLIBPATH = get_paths(siteconfig.get(section, 'library_dirs'))
-    except ConfigParser.NoSectionError, e:
-        if libpath:
-            newLIBPATH = libpath
-        else:
-            newLIBPATH = []
+        value = os.environ[name]
+        if value == 'None':
+            return context.Result('Disabled from env through var %s !' % name), {}
+    except KeyError:
+        pass
 
+    # Check whether the header is available (CheckHeader-like checker)
+    saved = save_and_set(env, opts)
     try:
-        newCPPPATH = get_paths(siteconfig.get(section, 'include_dirs'))
-    except ConfigParser.NoSectionError, e:
-        if cpppath:
-            newCPPPATH = cpppath
-        else:
-            newCPPPATH = []
+        src_code = [r'#include <%s>' % h for h in headers]
+        src_code.extend([r'#if 0', str(opts), r'#endif', '\n'])
+        src = '\n'.join(src_code)
+        st = context.TryCompile(src, '.c')
+    finally:
+        restore(env, saved)
 
-    try:
-        newLIBS = parse_config_param(siteconfig.get(section, 'libraries'))
-    except ConfigParser.NoSectionError, e:
-        if libs:
-            newLIBS = libs
-        else:
-            newLIBS = []
+    if not st:
+        context.Result('Failed (could not check header(s) : check config.log '\
+                       'in %s for more details)' % env['build_dir'])
+        return st
 
-    lastLIBPATH = get_empty(context.env,'LIBPATH')
-    lastLIBS = get_empty(context.env,'LIBS')
-    lastCPPPATH = get_empty(context.env,'CPPPATH')
-    context.env.Append(LIBPATH = newLIBPATH)
-    context.env.Append(LIBS = newLIBS)
-    context.env.Append(CPPPATH = newCPPPATH)
-    res *= context.TryLink(src, '.c')
-    if not res:
-        context.env.Replace(LIBS = lastLIBS, 
-                            LIBPATH = lastLIBPATH, 
-                            CPPPATH = lastCPPPATH)
-
-    return res
+    # Check whether the library is available (CheckLib-like checker)
+    saved = save_and_set(env, opts)
+    try:
+        for sym in symbols:
+            # Add opts at the end of the source code to force dependency of
+            # check from options.
+            extra = [r'#if 0', str(opts), r'#endif', '\n']
+            st = check_symbol(context, None, sym, '\n'.join(extra))
+            if not st:
+                break
+    finally:
+        if st == 0 or autoadd == 0:
+            restore(env, saved)
+        
+    if not st:
+        context.Result('Failed (could not check symbol %s : check config.log '\
+                       'in %s for more details))' % (sym, env['build_dir']))
+        return st
+        
+    context.Result(st)
+    return st

Modified: branches/numpy.scons/numpy/distutils/scons/doc/TODO
===================================================================
--- branches/numpy.scons/numpy/distutils/scons/doc/TODO	2007-11-06 09:24:01 UTC (rev 4404)
+++ branches/numpy.scons/numpy/distutils/scons/doc/TODO	2007-11-06 11:01:09 UTC (rev 4405)
@@ -1,9 +1,9 @@
 Before second alpha (in order of priority):
     - CheckHeader and CheckLib ala scons, with site.cfg support.
-    - support environments wo fortran compilers
 
 Before first beta:
     - f2py and scipy interoperability: N hours ?
+    - support environments wo fortran compilers
 
 Design questions:
     - improve BrokenMathlib and Mathlib in core, and make them available to

Modified: branches/numpy.scons/numpy/scons_fake/checklib/SConstruct
===================================================================
--- branches/numpy.scons/numpy/scons_fake/checklib/SConstruct	2007-11-06 09:24:01 UTC (rev 4404)
+++ branches/numpy.scons/numpy/scons_fake/checklib/SConstruct	2007-11-06 11:01:09 UTC (rev 4405)
@@ -1,9 +1,9 @@
 # vim:syntax=python
-from numpy.distutils.scons import GetNumpyEnvironment, NumpyCheckLib
+from numpy.distutils.scons import GetNumpyEnvironment, NumpyCheckLibAndHeader
 
 env = GetNumpyEnvironment(ARGUMENTS)
 
-config = env.NumpyConfigure(custom_tests = {'NumpyCheckLib' : NumpyCheckLib})
-if not config.NumpyCheckLib('sndfile', 'sf_open', section = 'sndfile'):
+config = env.NumpyConfigure(custom_tests = {'NumpyCheckLibAndHeader' : NumpyCheckLibAndHeader})
+if not config.NumpyCheckLibAndHeader('sndfile', 'sf_open', 'sndfile.h', section = 'sndfile'):
     print "sndfile not found, this package cannot work without sndfile !"
 config.Finish()

Modified: branches/numpy.scons/numpy/scons_fake/ctypesext/SConstruct
===================================================================
--- branches/numpy.scons/numpy/scons_fake/ctypesext/SConstruct	2007-11-06 09:24:01 UTC (rev 4404)
+++ branches/numpy.scons/numpy/scons_fake/ctypesext/SConstruct	2007-11-06 11:01:09 UTC (rev 4405)
@@ -1,5 +1,5 @@
 # vim:syntax=python
-from numpy.distutils.scons import GetNumpyEnvironment, NumpyCheckLib
+from numpy.distutils.scons import GetNumpyEnvironment
 
 env = GetNumpyEnvironment(ARGUMENTS)
 



More information about the Numpy-svn mailing list