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.py97
1 files changed, 72 insertions, 25 deletions
diff --git a/numpy/distutils/system_info.py b/numpy/distutils/system_info.py
index 8a42434ff..cd78fa37f 100644
--- a/numpy/distutils/system_info.py
+++ b/numpy/distutils/system_info.py
@@ -92,20 +92,20 @@ src_dirs = /usr/local/src:/opt/src
search_static_first = 0
[fftw]
-fftw_libs = rfftw, fftw
-fftw_opt_libs = rfftw_threaded, fftw_threaded
-# if the above aren't found, look for {s,d}fftw_libs and {s,d}fftw_opt_libs
+libraries = rfftw, fftw
[atlas]
library_dirs = /usr/lib/3dnow:/usr/lib/3dnow/atlas
# for overriding the names of the atlas libraries
-atlas_libs = lapack, f77blas, cblas, atlas
+libraries = lapack, f77blas, cblas, atlas
[x11]
library_dirs = /usr/X11R6/lib
include_dirs = /usr/X11R6/include
----------
+Note that the ``libraries`` key is the default setting for libraries.
+
Authors:
Pearu Peterson <pearu@cens.ioc.ee>, February 2002
David M. Cooke <cookedm@physics.mcmaster.ca>, April 2002
@@ -449,6 +449,12 @@ class NotFoundError(DistutilsError):
"""Some third-party program or library is not found."""
+class AliasedOptionError(DistutilsError):
+ """
+ Aliases entries in config files should not be existing.
+ In section '{section}' we found multiple appearances of options {options}."""
+
+
class AtlasNotFoundError(NotFoundError):
"""
Atlas (http://math-atlas.sourceforge.net/) libraries not found.
@@ -607,6 +613,39 @@ class system_info(object):
dict_append(info, **extra_info)
self.saved_results[self.__class__.__name__] = info
+ def get_option_single(self, *options):
+ """ Ensure that only one of `options` are found in the section
+
+ Parameters
+ ----------
+ *options : list of str
+ a list of options to be found in the section (``self.section``)
+
+ Returns
+ -------
+ str :
+ the option that is uniquely found in the section
+
+ Raises
+ ------
+ AliasedOptionError :
+ in case more than one of the options are found
+ """
+ found = map(lambda opt: self.cp.has_option(self.section, opt), options)
+ found = list(found)
+ if sum(found) == 1:
+ return options[found.index(True)]
+ elif sum(found) == 0:
+ # nothing is found anyways
+ return options[0]
+
+ # Else we have more than 1 key found
+ if AliasedOptionError.__doc__ is None:
+ raise AliasedOptionError()
+ raise AliasedOptionError(AliasedOptionError.__doc__.format(
+ section=self.section, options='[{}]'.format(', '.join(options))))
+
+
def has_info(self):
return self.__class__.__name__ in self.saved_results
@@ -897,7 +936,9 @@ class fftw_info(system_info):
"""Returns True on successful version detection, else False"""
lib_dirs = self.get_lib_dirs()
incl_dirs = self.get_include_dirs()
- libs = self.get_libs(self.section + '_libs', ver_param['libs'])
+
+ opt = self.get_option_single(self.section + '_libs', 'libraries')
+ libs = self.get_libs(opt, ver_param['libs'])
info = self.check_libs(lib_dirs, libs)
if info is not None:
flag = 0
@@ -1082,7 +1123,8 @@ class mkl_info(system_info):
def calc_info(self):
lib_dirs = self.get_lib_dirs()
incl_dirs = self.get_include_dirs()
- mkl_libs = self.get_libs('mkl_libs', self._lib_mkl)
+ opt = self.get_option_single('mkl_libs', 'libraries')
+ mkl_libs = self.get_libs(opt, self._lib_mkl)
info = self.check_libs2(lib_dirs, mkl_libs)
if info is None:
return
@@ -1129,8 +1171,8 @@ class atlas_info(system_info):
def calc_info(self):
lib_dirs = self.get_lib_dirs()
info = {}
- atlas_libs = self.get_libs('atlas_libs',
- self._lib_names + self._lib_atlas)
+ opt = self.get_option_single('atlas_libs', 'libraries')
+ atlas_libs = self.get_libs(opt, self._lib_names + self._lib_atlas)
lapack_libs = self.get_libs('lapack_libs', self._lib_lapack)
atlas = None
lapack = None
@@ -1222,8 +1264,8 @@ class atlas_blas_info(atlas_info):
def calc_info(self):
lib_dirs = self.get_lib_dirs()
info = {}
- atlas_libs = self.get_libs('atlas_libs',
- self._lib_names + self._lib_atlas)
+ opt = self.get_option_single('atlas_libs', 'libraries')
+ atlas_libs = self.get_libs(opt, self._lib_names + self._lib_atlas)
atlas = self.check_libs2(lib_dirs, atlas_libs, [])
if atlas is None:
return
@@ -1275,8 +1317,8 @@ class atlas_3_10_blas_info(atlas_3_10_info):
def calc_info(self):
lib_dirs = self.get_lib_dirs()
info = {}
- atlas_libs = self.get_libs('atlas_libs',
- self._lib_names)
+ opt = self.get_option_single('atlas_lib', 'libraries')
+ atlas_libs = self.get_libs(opt, self._lib_names)
atlas = self.check_libs2(lib_dirs, atlas_libs, [])
if atlas is None:
return
@@ -1327,7 +1369,8 @@ class lapack_info(system_info):
def calc_info(self):
lib_dirs = self.get_lib_dirs()
- lapack_libs = self.get_libs('lapack_libs', self._lib_names)
+ opt = self.get_option_single('lapack_libs', 'libraries')
+ lapack_libs = self.get_libs(opt, self._lib_names)
info = self.check_libs(lib_dirs, lapack_libs, [])
if info is None:
return
@@ -1682,7 +1725,8 @@ class blas_info(system_info):
def calc_info(self):
lib_dirs = self.get_lib_dirs()
- blas_libs = self.get_libs('blas_libs', self._lib_names)
+ opt = self.get_option_single('blas_libs', 'libraries')
+ blas_libs = self.get_libs(opt, self._lib_names)
info = self.check_libs(lib_dirs, blas_libs, [])
if info is None:
return
@@ -1783,9 +1827,9 @@ class openblas_info(blas_info):
lib_dirs = self.get_lib_dirs()
- 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)
+ # Prefer to use libraries over openblas_libs
+ opt = self.get_option_single('openblas_libs', 'libraries')
+ openblas_libs = self.get_libs(opt, self._lib_names)
info = self.check_libs(lib_dirs, openblas_libs, [])
@@ -1897,10 +1941,8 @@ class blis_info(blas_info):
def calc_info(self):
lib_dirs = self.get_lib_dirs()
- blis_libs = self.get_libs('libraries', self._lib_names)
- if blis_libs == self._lib_names:
- blis_libs = self.get_libs('blis_libs', self._lib_names)
-
+ opt = self.get_option_single('blis_libs', 'libraries')
+ blis_libs = self.get_libs(opt, self._lib_names)
info = self.check_libs2(lib_dirs, blis_libs, [])
if info is None:
return
@@ -1915,6 +1957,7 @@ class blis_info(blas_info):
class accelerate_info(system_info):
section = 'accelerate'
+ _lib_names = ['accelerate', 'veclib']
notfounderror = BlasNotFoundError
def calc_info(self):
@@ -1923,7 +1966,7 @@ class accelerate_info(system_info):
if libraries:
libraries = [libraries]
else:
- libraries = self.get_libs('libraries', ['accelerate', 'veclib'])
+ libraries = self.get_libs('libraries', self._lib_names)
libraries = [lib.strip().lower() for lib in libraries]
if (sys.platform == 'darwin' and
@@ -2021,6 +2064,7 @@ class blas_src_info(system_info):
class x11_info(system_info):
section = 'x11'
notfounderror = X11NotFoundError
+ _lib_names = ['X11']
def __init__(self):
system_info.__init__(self,
@@ -2032,7 +2076,8 @@ class x11_info(system_info):
return
lib_dirs = self.get_lib_dirs()
include_dirs = self.get_include_dirs()
- x11_libs = self.get_libs('x11_libs', ['X11'])
+ opt = self.get_option_single('x11_libs', 'libraries')
+ x11_libs = self.get_libs(opt, self._lib_names)
info = self.check_libs(lib_dirs, x11_libs, [])
if info is None:
return
@@ -2423,7 +2468,8 @@ class amd_info(system_info):
def calc_info(self):
lib_dirs = self.get_lib_dirs()
- amd_libs = self.get_libs('amd_libs', self._lib_names)
+ opt = self.get_option_single('amd_libs', 'libraries')
+ amd_libs = self.get_libs(opt, self._lib_names)
info = self.check_libs(lib_dirs, amd_libs, [])
if info is None:
return
@@ -2454,7 +2500,8 @@ class umfpack_info(system_info):
def calc_info(self):
lib_dirs = self.get_lib_dirs()
- umfpack_libs = self.get_libs('umfpack_libs', self._lib_names)
+ opt = self.get_option_single('umfpack_libs', 'libraries')
+ umfpack_libs = self.get_libs(opt, self._lib_names)
info = self.check_libs(lib_dirs, umfpack_libs, [])
if info is None:
return