[Numpy-svn] r4363 - in branches/numpy.scons/numpy: distutils/scons/checkers scons_fake/checkers

numpy-svn at scipy.org numpy-svn at scipy.org
Wed Oct 31 05:48:08 EDT 2007


Author: cdavid
Date: 2007-10-31 04:48:00 -0500 (Wed, 31 Oct 2007)
New Revision: 4363

Modified:
   branches/numpy.scons/numpy/distutils/scons/checkers/perflib.py
   branches/numpy.scons/numpy/distutils/scons/checkers/support.py
   branches/numpy.scons/numpy/scons_fake/checkers/SConstruct
Log:

More refactoring of libperf checkers: now mosly abstracted away (defining your
own is a few lines).



Modified: branches/numpy.scons/numpy/distutils/scons/checkers/perflib.py
===================================================================
--- branches/numpy.scons/numpy/distutils/scons/checkers/perflib.py	2007-10-31 07:20:40 UTC (rev 4362)
+++ branches/numpy.scons/numpy/distutils/scons/checkers/perflib.py	2007-10-31 09:48:00 UTC (rev 4363)
@@ -1,5 +1,5 @@
 #! /usr/bin/env python
-# Last Change: Tue Oct 30 09:00 PM 2007 J
+# Last Change: Wed Oct 31 06:00 PM 2007 J
 
 # This module defines checkers for performances libs providing standard API,
 # such as MKL (Intel), ATLAS, Sunperf (solaris and linux), Accelerate (Mac OS
@@ -7,104 +7,49 @@
 # using a library specific check if possible, or other heuristics.
 # Generally, you don't use those directly: they are used in 'meta' checkers,
 # such as BLAS, CBLAS, LAPACK checkers.
+import re
 
 from numpy.distutils.scons.libinfo import get_config_from_section, get_config
 from numpy.distutils.scons.testcode_snippets import cblas_sgemm as cblas_src, \
         c_sgemm as sunperf_src, lapack_sgesv
 
-from support import check_include_and_run, CheckOptions
+from support import check_include_and_run, check_symbol
+from support import save_and_set, restore, ConfigOpts
 
-#def CheckMKL(context, mkl_dir, nb):
-#    """mkl_lib is the root path of MKL (the one which contains include, lib,
-#    etc...). nb is 32, 64, emt, etc..."""
-#
-#    libs = ['mkl']
-#    cpppath = os.path.join(mkl_dir, 'include')
-#    libpath = os.path.join(mkl_dir, 'lib', nb)
-#
-#    return check_include_and_run(context, 'MKL', cpppath, ['mkl.h'],
-#                                  cblas_src, libs, libpath, [], [], autoadd)
+def _check(context, name, section, defopts, headers_to_check, funcs_to_check, 
+           check_version, version_checker, autoadd):
+    context.Message("Checking %s ... " % name)
 
-#     code = """
-# #include <stdio.h>
-# #include "mkl.h"
-# 
-# int main(void)
-# {
-#     MKLVersion ver;
-#     MKLGetVersion(&ver);
-# 
-#     printf("Major version:          %d\n",ver.MajorVersion);
-#     printf("Minor version:          %d\n",ver.MinorVersion);
-#     printf("Build number:           %d\n",ver.BuildNumber);
-#     printf("Full version: %d.%d.%d\n", 
-#            ver.MajorVersion,
-#            ver.MinorVersion,
-#            ver.BuildNumber);
-#     printf("Product status:         %s\n",ver.ProductStatus);
-#     printf("Build:                  %s\n",ver.Build);
-#     printf("Processor optimization: %s\n",ver.Processor);
-# 
-#     return 0;
-# }
-# """
-
-# def CheckMKL(context, autoadd = 1):
-#     """Check MKL is usable using a simple cblas example."""
-#     section = "mkl"
-#     siteconfig, cfgfiles = get_config()
-#     (cpppath, libs, libpath), found = get_config_from_section(siteconfig, section)
-#     if not found:
-#         # XXX: find exact options to use for the MKL
-#         libs.extend(['mkl', 'guide', 'm'])
-# 
-#     headers = ['mkl.h']
-# 
-#     return check_include_and_run(context, 'MKL', cpppath, headers,
-#                                   cblas_src, libs, libpath, [], [], autoadd)
-
-def _CheckATLASVersion(context):
-    pass
-
-from support import save_set, restore
-import re
-
-def CheckMKL(context, check_version = 1, autoadd = 1):
-    """Check whether mkl is usable in C."""
-    context.Message("Checking MKL ... ")
-
-    # XXX: take into account siteconfig
-    section = "mkl"
+    # Get site.cfg customization if any
     siteconfig, cfgfiles = get_config()
     (cpppath, libs, libpath), found = get_config_from_section(siteconfig, section)
-    if not found:
-        # XXX: find exact options to use for the MKL
-        libs.extend(['mkl', 'guide', 'm'])
-    opts = {'cpppath' : cpppath, 'libpath' : libpath, 'libs' : libs} 
+    if found:
+        opts = ConfigOpts(cpppath = cpppath, libpath = libpath, libs = libs)
+    else:
+        opts = defopts
 
     env = context.env
-    test_funcs = ['MKLGetVersion']
-    headers = ['mkl.h']
 
     # Check whether the header is available (CheckHeader-like checker)
-    saved = save_set(env, opts)
+    saved = save_and_set(env, opts)
     try:
         # XXX: add dep vars in code
-        src = '\n'.join([r'#include <%s>\n' % h for h in headers])
+        src = '\n'.join([r'#include <%s>\n' % h for h in headers_to_check])
         st = context.TryCompile(src, '.c')
     finally:
         restore(env, saved)
 
     if not st:
-        context.Result('Failed (could not check header(s))')
-        return st
+        context.Result('Failed (could not check header(s) : check config.log '\
+                       'in %s for more details)' % env['build_dir'])
+        return st, {}
 
     # Check whether the library is available (CheckLib-like checker)
-    saved = save_set(env, opts)
+    saved = save_and_set(env, opts)
     try:
-        for sym in test_funcs:
+        for sym in funcs_to_check:
             # XXX: add dep vars in code
-            st = check_symbol(context, headers, sym)
+            st = check_symbol(context, headers_to_check, sym)
             if not st:
                 break
     finally:
@@ -112,15 +57,34 @@
             restore(env, saved)
         
     if not st:
-        context.Result('Failed (could not check symbol %s)' % sym)
-        return 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)
 
     # Check version if requested
     if check_version:
-        saved = save_set(env, opts)
-        version_code = """
+        if version_checker:
+            vst, v = version_checker(env, opts)
+            if vst:
+                version = v
+            else:
+                version = 'Unknown (checking version failed)'
+        else:
+            version = 'Unkown (not implemented)'
+
+    return st, opts
+
+def CheckMKL(context, check_version = 0, autoadd = 1):
+    name = 'MKL'
+    section = 'mkl'
+    defopts = ConfigOpts(libs = ['mkl', 'guide', 'm'])
+    headers = ['mkl.h']
+    funcs = ['MKLGetVersion']
+
+    def mkl_version_checker(env, opts):
+        version_code = r"""
 #include <stdio.h>
 #include <mkl.h>
 
@@ -137,119 +101,193 @@
 }
 """
 
+        opts['rpath'] = libpath
+        saved = save_and_set(env, opts)
         try:
             vst, out = context.TryRun(version_code, '.c')
         finally:
             restore(env, saved)
 
-        if not vst:
-            version = r'?.?.? (could not get version)'
+        if vst and re.search(r'Full version: (\d+[.]\d+[.]\d+)', out):
+            version = m.group(1)
         else:
-            m = re.search(
-                    r'Full version: (\d+[.]\d+[.]\d+)',
-                    out)
-            if m:
-                version = m.group('version')
-            else:
-                version = r'?.?.? (could not get version)'
-        opts['version'] = version
+            version = ''
 
-    return st, opts
+        return vst, version
 
-def check_symbol(context, headers, sym, extra = r''):
-    # XXX: add dep vars in code
-    code = [r'#include <%s>' %h for h in headers]
-    code.append(r'''
-#undef %(func)s
-#ifdef __cplusplus
-extern "C" 
-#endif
-char %(func)s();
+    return _check(context, name, section, defopts, headers, funcs,
+                  check_version, mkl_version_checker, autoadd)
 
-int main()
-{
-return %(func)s();
-return 0;
-}
-''' % {'func' : sym})
-    code.append(extra)
-    return context.TryLink('\n'.join(code), '.c')
+#def CheckMKL(context, check_version = 0, autoadd = 1):
+#    """Check whether mkl is usable in C."""
+#    context.Message("Checking MKL ... ")
+#
+#    # XXX: take into account siteconfig
+#    section = "mkl"
+#    siteconfig, cfgfiles = get_config()
+#    (cpppath, libs, libpath), found = get_config_from_section(siteconfig, section)
+#    if not found:
+#        # XXX: find exact options to use for the MKL
+#        libs.extend(['mkl', 'guide', 'm'])
+#    opts = {'cpppath' : cpppath, 'libpath' : libpath, 'libs' : libs} 
+#
+#    env = context.env
+#    test_funcs = ['MKLGetVersion']
+#    headers = ['mkl.h']
+#
+#    # 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>\n' % h for h in headers])
+#        st = context.TryCompile(src, '.c')
+#    finally:
+#        restore(env, saved)
+#
+#    if not st:
+#        context.Result('Failed (could not check header(s) : check config.log '\
+#                       'in %s for more details)' % env['build_dir'])
+#        return st, opts
+#
+#    # Check whether the library is available (CheckLib-like checker)
+#    saved = save_and_set(env, opts)
+#    try:
+#        for sym in test_funcs:
+#            # XXX: add dep vars in code
+#            st = check_symbol(context, headers, sym)
+#            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, opts
+#        
+#    context.Result(st)
+#
+#    # Check version if requested
+#    if check_version:
+#        version_code = r"""
+##include <stdio.h>
+##include <mkl.h>
+#
+#int main(void)
+#{
+#    MKLVersion ver;
+#    MKLGetVersion(&ver);
+#
+#    printf("Full version: %d.%d.%d\n", ver.MajorVersion,
+#           ver.MinorVersion,
+#           ver.BuildNumber);
+#
+#    return 0;
+#}
+#"""
+#
+#        opts['rpath'] = libpath
+#        saved = save_and_set(env, opts)
+#        try:
+#            vst, out = context.TryRun(version_code, '.c')
+#        finally:
+#            restore(env, saved)
+#
+#        if not vst:
+#            version = r'?.?.? (could not get version)'
+#        else:
+#            m = re.search(r'Full version: (\d+[.]\d+[.]\d+)', out)
+#            if m:
+#                version = m.group(1)
+#            else:
+#                version = r'?.?.? (could not get version)'
+#        opts['version'] = version
+#
+#    return st, opts
 
 def CheckATLAS2(context, check_version = 1, autoadd = 1):
     """Check whether ATLAS is usable in C."""
-    context.Message("Checking ATLAS ... ")
-
-    section = "atlas"
-    siteconfig, cfgfiles = get_config()
-    (cpppath, libs, libpath), found = get_config_from_section(siteconfig, section)
-    if not found:
-        libs.extend(['atlas'])
-    opts = {'cpppath' : cpppath, 'libpath' : libpath, 'libs' : libs}
-
-    env = context.env
-    test_funcs = ['ATL_sgemm']
+    name    = 'ATLAS'
+    section = 'atlas'
+    defopts = ConfigOpts(libs = ['atlas'])
     headers = ['atlas_enum.h']
+    funcs   = ['ATL_sgemm']
+    return _check(context, name, section, defopts, headers, funcs,
+                  check_version, None, autoadd)
 
-    # Check whether the header is available (CheckHeader-like checker)
-    saved = save_set(env, opts)
-    try:
-        # XXX: add dep vars in code
-        src = '\n'.join([r'#include <%s>\n' % h for h in headers])
-        st = context.TryCompile(src, '.c')
-    finally:
-        restore(env, saved)
+#    context.Message("Checking ATLAS ... ")
+# 
+#    section = "atlas"
+#    siteconfig, cfgfiles = get_config()
+#    (cpppath, libs, libpath), found = get_config_from_section(siteconfig, section)
+#    if not found:
+#        libs.extend(['atlas'])
+#    opts = {'cpppath' : cpppath, 'libpath' : libpath, 'libs' : libs}
+#
+#    env = context.env
+#    test_funcs = ['ATL_sgemm']
+#    headers = ['atlas_enum.h']
+#
+#    # 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>\n' % h for h in headers])
+#        st = context.TryCompile(src, '.c')
+#    finally:
+#        restore(env, saved)
+#
+#    if not st:
+#        context.Result('Failed (could not check header(s))')
+#        return st
+#
+#    # Check whether the library is available (CheckLib-like checker)
+#    saved = save_and_set(env, opts)
+#    try:
+#        for sym in test_funcs:
+#            # XXX: add dep vars in code
+#            st = check_symbol(context, headers, sym)
+#            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)' % sym)
+#        return st
+#        
+#    context.Result(st)
+#
+#    # Check version if requested
+#    if check_version:
+#        saved = save_and_set(env, opts)
+#        version_code = """
+#void ATL_buildinfo(void);
+#int main(void) {
+#  ATL_buildinfo();
+#  return 0;
+#}
+#"""
+#        try:
+#            vst, out = context.TryRun(version_code, '.c')
+#        finally:
+#            restore(env, saved)
+#
+#        if not vst:
+#            version = r'?.?.? (could not get version)'
+#        else:
+#            m = re.search(
+#                    r'ATLAS version (?P<version>\d+[.]\d+[.]\d+)',
+#                    out)
+#            if m:
+#                version = m.group('version')
+#            else:
+#                version = r'?.?.? (could not get version)'
+#        opts['version'] = version
+#
+#    return st, opts
 
-    if not st:
-        context.Result('Failed (could not check header(s))')
-        return st
-
-    # Check whether the library is available (CheckLib-like checker)
-    saved = save_set(env, opts)
-    try:
-        for sym in test_funcs:
-            # XXX: add dep vars in code
-            st = check_symbol(context, headers, sym)
-            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)' % sym)
-        return st
-        
-    context.Result(st)
-
-    # Check version if requested
-    if check_version:
-        saved = save_set(env, opts)
-        version_code = """
-void ATL_buildinfo(void);
-int main(void) {
-  ATL_buildinfo();
-  return 0;
-}
-"""
-        try:
-            vst, out = context.TryRun(version_code, '.c')
-        finally:
-            restore(env, saved)
-
-        if not vst:
-            version = r'?.?.? (could not get version)'
-        else:
-            m = re.search(
-                    r'ATLAS version (?P<version>\d+[.]\d+[.]\d+)',
-                    out)
-            if m:
-                version = m.group('version')
-            else:
-                version = r'?.?.? (could not get version)'
-        opts['version'] = version
-
-    return st, opts
-
 def CheckATLAS(context, autoadd = 1):
     """Check whether ATLAS is usable in C."""
 

Modified: branches/numpy.scons/numpy/distutils/scons/checkers/support.py
===================================================================
--- branches/numpy.scons/numpy/distutils/scons/checkers/support.py	2007-10-31 07:20:40 UTC (rev 4362)
+++ branches/numpy.scons/numpy/distutils/scons/checkers/support.py	2007-10-31 09:48:00 UTC (rev 4363)
@@ -1,5 +1,5 @@
 #! /usr/bin/env python
-# Last Change: Tue Oct 30 09:00 PM 2007 J
+# Last Change: Wed Oct 31 06:00 PM 2007 J
 
 # This module defines some helper functions, to be used by high level checkers
 
@@ -9,17 +9,18 @@
             'cflags' : 'CFLAGS',
             'libpath' : 'LIBPATH',
             'libs' : 'LIBS',
-            'linkflags' : 'LINKFLAGS'}
+            'linkflags' : 'LINKFLAGS',
+            'rpath' : 'RPATH'}
 
-def save_set(env, opts):
+def save_and_set(env, opts):
     """keys given as config opts args."""
     saved_keys = {}
-    keys = opts.keys()
+    keys = opts.data.keys()
     for k in keys:
         saved_keys[k] = (env.has_key(_arg2env[k]) and\
                          deepcopy(env[_arg2env[k]])) or\
                         []
-    kw = zip([_arg2env[k] for k in keys], [opts[k] for k in keys])
+    kw = zip([_arg2env[k] for k in keys], [opts.data[k] for k in keys])
     kw = dict(kw)
     env.AppendUnique(**kw)
     return saved_keys
@@ -31,6 +32,78 @@
     kw = dict(kw)
     env.Replace(**kw)
 
+def check_symbol(context, headers, sym, extra = r''):
+    # XXX: add dep vars in code
+    #code = [r'#include <%s>' %h for h in headers]
+    code = []
+    code.append(r'''
+#undef %(func)s
+#ifdef __cplusplus
+extern "C" 
+#endif
+char %(func)s();
+
+int main()
+{
+return %(func)s();
+return 0;
+}
+''' % {'func' : sym})
+    code.append(extra)
+    return context.TryLink('\n'.join(code), '.c')
+
+class ConfigOpts:
+    _keys = ['cpppath', 'cflags', 'libpath', 'libs', 'linkflags', 'rpath']
+    def __init__(self, cpppath = None, cflags = None, libpath = None, libs = None, 
+                 linkflags = None, rpath = None):
+        data = {}
+
+        if not cpppath:
+            data['cpppath'] = []
+        else:
+            data['cpppath'] = cpppath
+
+        if not cflags:
+            data['cflags'] = []
+        else:
+            data['cflags'] = cflags
+
+        if not libpath:
+            data['libpath'] = []
+        else:
+            data['libpath'] = libpath
+
+        if not libs:
+            data['libs'] = []
+        else:
+            data['libs'] = libs
+
+        if not linkflags:
+            data['linkflags'] = []
+        else:
+            data['linkflags'] = linkflags
+
+        if not rpath:
+            data['rpath'] = []
+        else:
+            data['rpath'] = rpath
+
+        self.data = data
+
+    def __getitem__(self, key):
+        return self.data[key]
+
+    def __setitem__(self, key, item):
+        self.data[key] = item
+
+    def __repr__(self):
+        msg = [r'%s : %s' % (k, i) for k, i in self.data.items()]
+        return '\n'.join(msg)
+
+class ConfigRes():
+    def __init__(self, cfgopts, version, origin):
+        pass
+
 def check_include_and_run(context, name, cpppath, headers, run_src, libs,
                           libpath, linkflags, cflags, autoadd = 1):
     """This is a basic implementation for generic "test include and run"

Modified: branches/numpy.scons/numpy/scons_fake/checkers/SConstruct
===================================================================
--- branches/numpy.scons/numpy/scons_fake/checkers/SConstruct	2007-10-31 07:20:40 UTC (rev 4362)
+++ branches/numpy.scons/numpy/scons_fake/checkers/SConstruct	2007-10-31 09:48:00 UTC (rev 4363)
@@ -27,8 +27,8 @@
     st, opts = config.CheckMKL(autoadd = 0)
     if st:
         print opts
-    config.CheckAccelerate(autoadd = 0)
-    config.CheckSunperf(autoadd = 0)
+   # config.CheckAccelerate(autoadd = 0)
+   # config.CheckSunperf(autoadd = 0)
 
     if env.has_key('LIBS'):
         print env.Dump('LIBS')




More information about the Numpy-svn mailing list