[Scipy-svn] r3546 - branches/scipy.scons/scipy/linalg

scipy-svn at scipy.org scipy-svn at scipy.org
Fri Nov 16 07:50:41 EST 2007


Author: cdavid
Date: 2007-11-16 06:50:30 -0600 (Fri, 16 Nov 2007)
New Revision: 3546

Added:
   branches/scipy.scons/scipy/linalg/SConstruct
   branches/scipy.scons/scipy/linalg/setupscons.py
Modified:
   branches/scipy.scons/scipy/linalg/setup.py
Log:
Starting working on scons build of linalg.

Added: branches/scipy.scons/scipy/linalg/SConstruct
===================================================================
--- branches/scipy.scons/scipy/linalg/SConstruct	2007-11-16 08:41:00 UTC (rev 3545)
+++ branches/scipy.scons/scipy/linalg/SConstruct	2007-11-16 12:50:30 UTC (rev 3546)
@@ -0,0 +1,177 @@
+# Last Change: Fri Nov 16 09:00 PM 2007 J
+# vim:syntax=python
+
+#import os
+#import sys
+#from os.path import join as pjoin, basename as pbasename, dirname as pdirname
+#from copy import deepcopy
+ 
+from numpy.distutils.misc_util import get_numpy_include_dirs
+from numpy.distutils.scons import get_python_inc#, get_pythonlib_dir
+from numpy.distutils.scons import GetNumpyEnvironment
+from numpy.distutils.scons import CheckCBLAS, CheckF77BLAS, CheckF77LAPACK,\
+                                  CheckCLAPACK
+#from numpy.distutils.scons.configuration import write_info
+
+#from scons_support import CheckBrokenMathlib, define_no_smp, \
+#    generate_config_header, generate_config_header_emitter
+
+#-------------------
+# To skip wrapping single precision atlas/lapack/blas routines, set
+# the following flag to True:
+skip_single_routines = 0
+
+# Some OS distributions (e.g. Redhat, Suse) provide a blas library that
+# is built using incomplete blas sources that come with lapack tar-ball.
+# In order to use such a library in scipy.linalg, the following flag
+# must be set to True:
+using_lapack_blas = 0
+
+env = GetNumpyEnvironment(ARGUMENTS)
+env.Append(CPPPATH = [get_python_inc(), get_numpy_include_dirs()])
+#if os.name == 'nt':
+#    # NT needs the pythonlib to run any code importing Python.h, including
+#    # simple code using only typedef and so on, so we need it for configuration
+#    # checks
+#    env.AppendUnique(LIBPATH = [get_pythonlib_dir()])
+
+#=======================
+# Starting Configuration
+#=======================
+# XXX: separate env for configuration
+config = env.NumpyConfigure(custom_tests = {'CheckCBLAS' : CheckCBLAS,
+                                            'CheckBLAS' : CheckF77BLAS,
+                                            'CheckCLAPACK' : CheckCLAPACK,
+                                            'CheckLAPACK' : CheckF77LAPACK})
+
+#--------------
+# Checking Blas
+#--------------
+st = config.CheckBLAS()
+if not st:
+    raise RuntimeError("no blas found, necessary for linalg module")
+
+st = config.CheckLAPACK()
+if not st:
+    raise RuntimeError("no lapack found, necessary for linalg module")
+
+if config.CheckCBLAS():
+    has_cblas = 1
+else:
+    has_cblas = 0
+
+if config.CheckCLAPACK():
+    has_clapack = 1
+else:
+    has_clapack = 0
+
+config.Finish()
+#write_info(env)
+
+#==========
+#  Build
+#==========
+#atlas_version = ([v[3:-3] for k,v in lapack_opt.get('define_macros',[]) \
+#                  if k=='ATLAS_INFO']+[None])[0]
+#if atlas_version:
+#    print 'ATLAS version',atlas_version
+
+target_dir = ''
+skip_names = {'clapack':[],'flapack':[],'cblas':[],'fblas':[]}
+if skip_single_routines:
+    target_dir = 'dbl'
+    skip_names['clapack'].extend(\
+        'sgesv cgesv sgetrf cgetrf sgetrs cgetrs sgetri cgetri'\
+        ' sposv cposv spotrf cpotrf spotrs cpotrs spotri cpotri'\
+        ' slauum clauum strtri ctrtri'.split())
+    skip_names['flapack'].extend(skip_names['clapack'])
+    skip_names['flapack'].extend(\
+        'sgesdd cgesdd sgelss cgelss sgeqrf cgeqrf sgeev cgeev'\
+        ' sgegv cgegv ssyev cheev slaswp claswp sgees cgees'
+        ' sggev cggev'.split())
+    skip_names['cblas'].extend('saxpy caxpy'.split())
+    skip_names['fblas'].extend(skip_names['cblas'])
+    skip_names['fblas'].extend(\
+        'srotg crotg srotmg srot csrot srotm sswap cswap sscal cscal'\
+        ' csscal scopy ccopy sdot cdotu cdotc snrm2 scnrm2 sasum scasum'\
+        ' isamax icamax sgemv cgemv chemv ssymv strmv ctrmv'\
+        ' sgemm cgemm'.split())
+
+if using_lapack_blas:
+    target_dir = join(target_dir,'blas')
+    skip_names['fblas'].extend(\
+        'drotmg srotmg drotm srotm'.split())
+
+#if atlas_version=='3.2.1_pre3.3.6':
+#    target_dir = join(target_dir,'atlas321')
+#    skip_names['clapack'].extend(\
+#        'sgetri dgetri cgetri zgetri spotri dpotri cpotri zpotri'\
+#        ' slauum dlauum clauum zlauum strtri dtrtri ctrtri ztrtri'.split())
+#elif atlas_version>'3.4.0' and atlas_version<='3.5.12':
+#    skip_names['clapack'].extend('cpotrf zpotrf'.split())
+
+def generate_pyf(target, source, env):
+    target = join(build_dir,target_dir,name+'.pyf')
+    if name[0]=='c' and atlas_version is None and newer(__file__,target):
+        print "============ %s =============" % target
+        f = open(target,'w')
+        f.write('python module '+name+'\n')
+        f.write('usercode void empty_module(void) {}\n')
+        f.write('interface\n')
+        f.write('subroutine empty_module()\n')
+        f.write('intent(c) empty_module\n')
+        f.write('end subroutine empty_module\n')
+        f.write('end interface\nend python module'+name+'\n')
+        f.close()
+        return target
+    if newer_group(extension.depends,target):
+        print name, extension.depend[0], target
+        raise "YATA:"
+        generate_interface(name,
+                           extension.depends[0],
+                           target,
+                           skip_names[name])
+    return target
+
+#-------------
+# Build fblas:
+#-------------
+# XXX: handle cblas wrapper for complex (check in numpy.scons or here ?)
+import os
+from os.path import join
+
+from interface_gen import generate_interface
+
+src_files = ['generic_fblas.pyf',
+             'generic_fblas1.pyf',
+             'generic_fblas2.pyf',
+             'generic_fblas3.pyf',
+             'interface_gen.py',
+             join('src','fblaswrap_veclib_c.c'),
+             join('src','fblaswrap.f')]
+
+# fblas:
+
+def do_generate_interface(target, source, env):
+    """Generate a .pyf file from another pyf file (!)."""
+    # XXX: do this correctly
+    target_name = str(target[0])
+    source_name = str(source[0])
+
+    # XXX handle skip names
+    name = os.path.splitext(os.path.basename(target_name))[0]
+    generate_interface(name, source_name, target_name)
+    return 0
+
+def generate_interface_emitter(target, source, env):
+    base = str(target[0])
+    return (['%s.pyf' % base], source)
+
+env['BUILDERS']['haha'] = Builder(action = do_generate_interface,
+                                  emitter = generate_interface_emitter)
+env.haha('build/scons/fblas', 'generic_fblas.pyf')
+env.NumpyPythonExtension('fblas', source = 'fblas.pyf')
+
+#if has_cblas:
+#    env.haha('cblas', 'generic_cblas.pyf')
+#    env.NumpyPythonExtension('cblas', source = 'cblas.pyf')

Modified: branches/scipy.scons/scipy/linalg/setup.py
===================================================================
--- branches/scipy.scons/scipy/linalg/setup.py	2007-11-16 08:41:00 UTC (rev 3545)
+++ branches/scipy.scons/scipy/linalg/setup.py	2007-11-16 12:50:30 UTC (rev 3546)
@@ -108,6 +108,8 @@
             f.close()
             return target
         if newer_group(extension.depends,target):
+            print "name %s, depends %s, target %s" % (name, extension.depends[0], target)
+            print "skipping %s" % skip_names[name]
             generate_interface(name,
                                extension.depends[0],
                                target,

Copied: branches/scipy.scons/scipy/linalg/setupscons.py (from rev 3539, branches/scipy.scons/scipy/linalg/setup.py)
===================================================================
--- branches/scipy.scons/scipy/linalg/setup.py	2007-11-14 04:21:13 UTC (rev 3539)
+++ branches/scipy.scons/scipy/linalg/setupscons.py	2007-11-16 12:50:30 UTC (rev 3546)
@@ -0,0 +1,65 @@
+## Automatically adapted for scipy Oct 18, 2005 by
+
+#!/usr/bin/env python
+
+from __future__ import nested_scopes
+import os
+import sys
+import re
+from distutils.dep_util import newer_group, newer
+from glob import glob
+from os.path import join
+
+#-------------------
+# To skip wrapping single precision atlas/lapack/blas routines, set
+# the following flag to True:
+skip_single_routines = 0
+
+# Some OS distributions (e.g. Redhat, Suse) provide a blas library that
+# is built using incomplete blas sources that come with lapack tar-ball.
+# In order to use such a library in scipy.linalg, the following flag
+# must be set to True:
+using_lapack_blas = 0
+
+#--------------------
+
+def needs_cblas_wrapper(info):
+    """Returns true if needs c wrapper around cblas for calling from
+    fortran."""
+    import re
+    r_accel = re.compile("Accelerate")
+    r_vec = re.compile("vecLib")
+    res = False
+    try:
+        tmpstr = info['extra_link_args']
+        for i in tmpstr:
+            if r_accel.search(i) or r_vec.search(i):
+                res = True
+    except KeyError:
+        pass
+
+    return res
+
+def configuration(parent_package='',top_path=None):
+    from numpy.distutils.system_info import get_info, NotFoundError
+
+    from numpy.distutils.misc_util import Configuration
+
+    from interface_gen import generate_interface
+
+    config = Configuration('linalg',parent_package,top_path)
+
+    # list of source files to register to distutils
+    source_files = []
+
+    config.add_sconscript('SConstruct')
+    config.add_data_dir('tests')
+
+    return config
+
+if __name__ == '__main__':
+    from numpy.distutils.core import setup
+    from linalg_version import linalg_version
+
+    setup(version=linalg_version,
+          **configuration(top_path='').todict())




More information about the Scipy-svn mailing list