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