summaryrefslogtreecommitdiff
path: root/numpy/distutils/system_info.py
diff options
context:
space:
mode:
Diffstat (limited to 'numpy/distutils/system_info.py')
-rw-r--r--numpy/distutils/system_info.py126
1 files changed, 116 insertions, 10 deletions
diff --git a/numpy/distutils/system_info.py b/numpy/distutils/system_info.py
index 48c92c548..d73aef59f 100644
--- a/numpy/distutils/system_info.py
+++ b/numpy/distutils/system_info.py
@@ -10,6 +10,13 @@ classes are available:
atlas_blas_info
atlas_blas_threads_info
lapack_atlas_info
+ lapack_atlas_threads_info
+ atlas_3_10_info
+ atlas_3_10_threads_info
+ atlas_3_10_blas_info,
+ atlas_3_10_blas_threads_info,
+ lapack_atlas_3_10_info
+ lapack_atlas_3_10_threads_info
blas_info
lapack_info
openblas_info
@@ -302,6 +309,12 @@ def get_info(name, notfound_action=0):
'atlas_blas_threads': atlas_blas_threads_info,
'lapack_atlas': lapack_atlas_info, # use lapack_opt instead
'lapack_atlas_threads': lapack_atlas_threads_info, # ditto
+ 'atlas_3_10': atlas_3_10_info, # use lapack_opt or blas_opt instead
+ 'atlas_3_10_threads': atlas_3_10_threads_info, # ditto
+ 'atlas_3_10_blas': atlas_3_10_blas_info,
+ 'atlas_3_10_blas_threads': atlas_3_10_blas_threads_info,
+ 'lapack_atlas_3_10': lapack_atlas_3_10_info, # use lapack_opt instead
+ 'lapack_atlas_3_10_threads': lapack_atlas_3_10_threads_info, # ditto
'mkl': mkl_info,
# openblas which may or may not have embedded lapack
'openblas': openblas_info, # use blas_opt instead
@@ -434,7 +447,7 @@ class UmfpackNotFoundError(NotFoundError):
the UMFPACK environment variable."""
-class system_info:
+class system_info(object):
""" get_info() is the only public method. Don't use others.
"""
@@ -962,7 +975,8 @@ class mkl_info(system_info):
if info is None:
return
dict_append(info,
- define_macros=[('SCIPY_MKL_H', None)],
+ define_macros=[('SCIPY_MKL_H', None),
+ ('HAVE_CBLAS', None)],
include_dirs=incl_dirs)
if sys.platform == 'win32':
pass # win32 has no pthread library
@@ -1120,6 +1134,7 @@ class atlas_blas_info(atlas_info):
h = os.path.dirname(h)
dict_append(info, include_dirs=[h])
info['language'] = 'c'
+ info['define_macros'] = [('HAVE_CBLAS', None)]
atlas_version, atlas_extra_info = get_atlas_version(**atlas)
dict_append(atlas, **atlas_extra_info)
@@ -1148,6 +1163,63 @@ class lapack_atlas_threads_info(atlas_threads_info):
_lib_names = ['lapack_atlas'] + atlas_threads_info._lib_names
+class atlas_3_10_info(atlas_info):
+ _lib_names = ['satlas']
+ _lib_atlas = _lib_names
+ _lib_lapack = _lib_names
+
+
+class atlas_3_10_blas_info(atlas_3_10_info):
+ _lib_names = ['satlas']
+
+ def calc_info(self):
+ lib_dirs = self.get_lib_dirs()
+ info = {}
+ atlas_libs = self.get_libs('atlas_libs',
+ self._lib_names)
+ atlas = self.check_libs2(lib_dirs, atlas_libs, [])
+ if atlas is None:
+ return
+ include_dirs = self.get_include_dirs()
+ h = (self.combine_paths(lib_dirs + include_dirs, 'cblas.h') or [None])
+ h = h[0]
+ if h:
+ h = os.path.dirname(h)
+ dict_append(info, include_dirs=[h])
+ info['language'] = 'c'
+ info['define_macros'] = [('HAVE_CBLAS', None)]
+
+ atlas_version, atlas_extra_info = get_atlas_version(**atlas)
+ dict_append(atlas, **atlas_extra_info)
+
+ dict_append(info, **atlas)
+
+ self.set_info(**info)
+ return
+
+
+class atlas_3_10_threads_info(atlas_3_10_info):
+ dir_env_var = ['PTATLAS', 'ATLAS']
+ _lib_names = ['tatlas']
+ #if sys.platfcorm[:7] == 'freebsd':
+ ## I don't think freebsd supports 3.10 at this time - 2014
+ _lib_atlas = _lib_names
+ _lib_lapack = _lib_names
+
+
+class atlas_3_10_blas_threads_info(atlas_3_10_blas_info):
+ dir_env_var = ['PTATLAS', 'ATLAS']
+ _lib_names = ['tatlas']
+
+
+class lapack_atlas_3_10_info(atlas_3_10_info):
+ pass
+
+
+class lapack_atlas_3_10_threads_info(atlas_3_10_threads_info):
+ pass
+
+
class lapack_info(system_info):
section = 'lapack'
dir_env_var = 'LAPACK'
@@ -1366,7 +1438,6 @@ Make sure that -lgfortran is used for C++ extensions.
return result
-
class lapack_opt_info(system_info):
notfounderror = LapackNotFoundError
@@ -1383,7 +1454,11 @@ class lapack_opt_info(system_info):
self.set_info(**lapack_mkl_info)
return
- atlas_info = get_info('atlas_threads')
+ atlas_info = get_info('atlas_3_10_threads')
+ if not atlas_info:
+ atlas_info = get_info('atlas_3_10')
+ if not atlas_info:
+ atlas_info = get_info('atlas_threads')
if not atlas_info:
atlas_info = get_info('atlas')
@@ -1414,7 +1489,8 @@ class lapack_opt_info(system_info):
if args:
self.set_info(extra_compile_args=args,
extra_link_args=link_args,
- define_macros=[('NO_ATLAS_INFO', 3)])
+ define_macros=[('NO_ATLAS_INFO', 3),
+ ('HAVE_CBLAS', None)])
return
#atlas_info = {} ## uncomment for testing
@@ -1480,7 +1556,11 @@ class blas_opt_info(system_info):
self.set_info(**openblas_info)
return
- atlas_info = get_info('atlas_blas_threads')
+ atlas_info = get_info('atlas_3_10_blas_threads')
+ if not atlas_info:
+ atlas_info = get_info('atlas_3_10_blas')
+ if not atlas_info:
+ atlas_info = get_info('atlas_blas_threads')
if not atlas_info:
atlas_info = get_info('atlas_blas')
@@ -1515,7 +1595,8 @@ class blas_opt_info(system_info):
if args:
self.set_info(extra_compile_args=args,
extra_link_args=link_args,
- define_macros=[('NO_ATLAS_INFO', 3)])
+ define_macros=[('NO_ATLAS_INFO', 3),
+ ('HAVE_CBLAS', None)])
return
need_blas = 0
@@ -1556,9 +1637,33 @@ class blas_info(system_info):
info = self.check_libs(lib_dirs, blas_libs, [])
if info is None:
return
- info['language'] = 'f77' # XXX: is it generally true?
+ if self.has_cblas():
+ info['language'] = 'c'
+ info['define_macros'] = [('HAVE_CBLAS', None)]
+ else:
+ info['language'] = 'f77' # XXX: is it generally true?
self.set_info(**info)
+ def has_cblas(self):
+ # primitive cblas check by looking for the header
+ res = False
+ c = distutils.ccompiler.new_compiler()
+ tmpdir = tempfile.mkdtemp()
+ s = """#include <cblas.h>"""
+ src = os.path.join(tmpdir, 'source.c')
+ try:
+ with open(src, 'wt') as f:
+ f.write(s)
+ try:
+ c.compile([src], output_dir=tmpdir,
+ include_dirs=self.get_include_dirs())
+ res = True
+ except distutils.ccompiler.CompileError:
+ res = False
+ finally:
+ shutil.rmtree(tmpdir)
+ return res
+
class openblas_info(blas_info):
section = 'openblas'
@@ -1580,9 +1685,10 @@ class openblas_info(blas_info):
return
if not self.check_embedded_lapack(info):
- return None
+ return
- info['language'] = 'f77' # XXX: is it generally true?
+ info['language'] = 'c'
+ info['define_macros'] = [('HAVE_CBLAS', None)]
self.set_info(**info)