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.py66
1 files changed, 56 insertions, 10 deletions
diff --git a/numpy/distutils/system_info.py b/numpy/distutils/system_info.py
index 5ed12db6e..48c92c548 100644
--- a/numpy/distutils/system_info.py
+++ b/numpy/distutils/system_info.py
@@ -137,6 +137,9 @@ from numpy.distutils.misc_util import is_sequence, is_string, \
get_shared_lib_extension
from numpy.distutils.command.config import config as cmd_config
from numpy.distutils.compat import get_exception
+import distutils.ccompiler
+import tempfile
+import shutil
# Determine number of bits
@@ -300,7 +303,10 @@ def get_info(name, notfound_action=0):
'lapack_atlas': lapack_atlas_info, # use lapack_opt instead
'lapack_atlas_threads': lapack_atlas_threads_info, # ditto
'mkl': mkl_info,
+ # openblas which may or may not have embedded lapack
'openblas': openblas_info, # use blas_opt instead
+ # openblas with embedded lapack
+ 'openblas_lapack': openblas_lapack_info, # use blas_opt instead
'lapack_mkl': lapack_mkl_info, # use lapack_opt instead
'blas_mkl': blas_mkl_info, # use blas_opt instead
'x11': x11_info,
@@ -449,7 +455,6 @@ class system_info:
self.__class__.info = {}
self.local_prefixes = []
defaults = {}
- defaults['libraries'] = ''
defaults['library_dirs'] = os.pathsep.join(default_lib_dirs)
defaults['include_dirs'] = os.pathsep.join(default_include_dirs)
defaults['src_dirs'] = os.pathsep.join(default_src_dirs)
@@ -703,7 +708,7 @@ class system_info:
else:
found_libs = self._lib_list(lib_dirs, libs, exts)
found_dirs = [lib_dirs]
- if len(found_libs) == len(libs):
+ if len(found_libs) > 0 and len(found_libs) == len(libs):
info = {'libraries': found_libs, 'library_dirs': found_dirs}
# Now, check for optional libraries
if is_sequence(lib_dirs):
@@ -756,9 +761,6 @@ class fftw_info(system_info):
'includes':['fftw.h', 'rfftw.h'],
'macros':[('SCIPY_FFTW_H', None)]}]
- def __init__(self):
- system_info.__init__(self)
-
def calc_ver_info(self, ver_param):
"""Returns True on successful version detection, else False"""
lib_dirs = self.get_lib_dirs()
@@ -1302,11 +1304,13 @@ def get_atlas_version(**config):
info = {}
try:
s, o = c.get_output(atlas_version_c_text,
- libraries=libraries, library_dirs=library_dirs)
+ libraries=libraries, library_dirs=library_dirs,
+ use_tee=(system_info.verbosity > 0))
if s and re.search(r'undefined reference to `_gfortran', o, re.M):
s, o = c.get_output(atlas_version_c_text,
libraries=libraries + ['gfortran'],
- library_dirs=library_dirs)
+ library_dirs=library_dirs,
+ use_tee=(system_info.verbosity > 0))
if not s:
warnings.warn("""
*****************************************************
@@ -1369,7 +1373,7 @@ class lapack_opt_info(system_info):
def calc_info(self):
- openblas_info = get_info('openblas')
+ openblas_info = get_info('openblas_lapack')
if openblas_info:
self.set_info(**openblas_info)
return
@@ -1480,7 +1484,7 @@ class blas_opt_info(system_info):
if not atlas_info:
atlas_info = get_info('atlas_blas')
- if sys.platform == 'darwin'and not atlas_info:
+ if sys.platform == 'darwin' and not atlas_info:
# Use the system BLAS from Accelerate or vecLib under OSX
args = []
link_args = []
@@ -1562,17 +1566,59 @@ class openblas_info(blas_info):
_lib_names = ['openblas']
notfounderror = BlasNotFoundError
+ def check_embedded_lapack(self, info):
+ return True
+
def calc_info(self):
lib_dirs = self.get_lib_dirs()
- openblas_libs = self.get_libs('openblas_libs', self._lib_names)
+ openblas_libs = self.get_libs('libraries', self._lib_names)
+ if openblas_libs == self._lib_names: # backward compat with 1.8.0
+ openblas_libs = self.get_libs('openblas_libs', self._lib_names)
info = self.check_libs(lib_dirs, openblas_libs, [])
if info is None:
return
+
+ if not self.check_embedded_lapack(info):
+ return None
+
info['language'] = 'f77' # XXX: is it generally true?
self.set_info(**info)
+class openblas_lapack_info(openblas_info):
+ section = 'openblas'
+ dir_env_var = 'OPENBLAS'
+ _lib_names = ['openblas']
+ notfounderror = BlasNotFoundError
+
+ def check_embedded_lapack(self, info):
+ res = False
+ c = distutils.ccompiler.new_compiler()
+ tmpdir = tempfile.mkdtemp()
+ s = """void zungqr();
+ int main(int argc, const char *argv[])
+ {
+ zungqr_();
+ return 0;
+ }"""
+ src = os.path.join(tmpdir, 'source.c')
+ out = os.path.join(tmpdir, 'a.out')
+ try:
+ with open(src, 'wt') as f:
+ f.write(s)
+ obj = c.compile([src], output_dir=tmpdir)
+ try:
+ c.link_executable(obj, out, libraries=info['libraries'],
+ library_dirs=info['library_dirs'])
+ res = True
+ except distutils.ccompiler.LinkError:
+ res = False
+ finally:
+ shutil.rmtree(tmpdir)
+ return res
+
+
class blas_src_info(system_info):
section = 'blas_src'
dir_env_var = 'BLAS_SRC'