diff options
Diffstat (limited to 'numpy/distutils/system_info.py')
-rw-r--r-- | numpy/distutils/system_info.py | 66 |
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' |