Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 1e8e515

Browse files
npintoRalf Gommers
authored andcommitted
ENH: support for detecting libraries in several directories simultaneously, see http://projects.scipy.org/numpy/ticket/993
1 parent 89d11fc commit 1e8e515

1 file changed

Lines changed: 60 additions & 78 deletions

File tree

numpy/distutils/system_info.py

Lines changed: 60 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -199,10 +199,12 @@ def libpaths(paths,bits):
199199
'/opt/local/include', '/sw/include',
200200
'/usr/include/suitesparse']
201201
default_src_dirs = ['.','/usr/local/src', '/opt/src','/sw/src']
202+
202203
default_x11_lib_dirs = libpaths(['/usr/X11R6/lib','/usr/X11/lib',
203204
'/usr/lib'], platform_bits)
204205
default_x11_include_dirs = ['/usr/X11R6/include','/usr/X11/include',
205206
'/usr/include']
207+
206208
if os.path.exists('/usr/lib/X11'):
207209
globbed_x11_dir = glob('/usr/lib/*/libX11.so')
208210
if globbed_x11_dir:
@@ -211,7 +213,6 @@ def libpaths(paths,bits):
211213
default_x11_include_dirs.extend(['/usr/lib/X11/include',
212214
'/usr/include/X11'])
213215

214-
215216
if os.path.join(sys.prefix, 'lib') not in default_lib_dirs:
216217
default_lib_dirs.insert(0,os.path.join(sys.prefix, 'lib'))
217218
default_include_dirs.append(os.path.join(sys.prefix, 'include'))
@@ -434,11 +435,7 @@ def calc_libraries_info(self):
434435
dirs = self.get_lib_dirs()
435436
info = {}
436437
for lib in libs:
437-
i = None
438-
for d in dirs:
439-
i = self.check_libs(d,[lib])
440-
if i is not None:
441-
break
438+
i = self.check_libs(dirs,[lib])
442439
if i is not None:
443440
dict_append(info,**i)
444441
else:
@@ -586,7 +583,7 @@ def library_extensions(self):
586583
# exts.append('.so.3gf')
587584
return exts
588585

589-
def check_libs(self,lib_dir,libs,opt_libs =[]):
586+
def check_libs(self,lib_dirs,libs,opt_libs =[]):
590587
"""If static or shared libraries are available then return
591588
their info dictionary.
592589
@@ -596,23 +593,23 @@ def check_libs(self,lib_dir,libs,opt_libs =[]):
596593
exts = self.library_extensions()
597594
info = None
598595
for ext in exts:
599-
info = self._check_libs(lib_dir,libs,opt_libs,[ext])
596+
info = self._check_libs(lib_dirs,libs,opt_libs,[ext])
600597
if info is not None:
601598
break
602599
if not info:
603-
log.info(' libraries %s not found in %s', ','.join(libs), lib_dir)
600+
log.info(' libraries %s not found in %s', ','.join(libs), lib_dirs)
604601
return info
605602

606-
def check_libs2(self, lib_dir, libs, opt_libs =[]):
603+
def check_libs2(self, lib_dirs, libs, opt_libs =[]):
607604
"""If static or shared libraries are available then return
608605
their info dictionary.
609606
610607
Checks each library for shared or static.
611608
"""
612609
exts = self.library_extensions()
613-
info = self._check_libs(lib_dir,libs,opt_libs,exts)
610+
info = self._check_libs(lib_dirs,libs,opt_libs,exts)
614611
if not info:
615-
log.info(' libraries %s not found in %s', ','.join(libs), lib_dir)
612+
log.info(' libraries %s not found in %s', ','.join(libs), lib_dirs)
616613
return info
617614

618615
def _lib_list(self, lib_dir, libs, exts):
@@ -640,13 +637,36 @@ def _lib_list(self, lib_dir, libs, exts):
640637
break
641638
return liblist
642639

643-
def _check_libs(self, lib_dir, libs, opt_libs, exts):
644-
found_libs = self._lib_list(lib_dir, libs, exts)
640+
def _check_libs(self, lib_dirs, libs, opt_libs, exts):
641+
"""Find mandatory and optional libs in expected paths.
642+
643+
Missing optional libraries are silently forgotten.
644+
"""
645+
# First, try to find the mandatory libraries
646+
if is_sequence(lib_dirs):
647+
found_libs, found_dirs = [], []
648+
for dir_ in lib_dirs:
649+
found_libs1 = self._lib_list(dir_, libs, exts)
650+
if found_libs1:
651+
found_libs.extend(found_libs1)
652+
found_dirs.append(dir_)
653+
else:
654+
found_libs = self._lib_list(lib_dirs, libs, exts)
655+
found_dirs = [lib_dirs]
645656
if len(found_libs) == len(libs):
646-
info = {'libraries' : found_libs, 'library_dirs' : [lib_dir]}
647-
opt_found_libs = self._lib_list(lib_dir, opt_libs, exts)
648-
if len(opt_found_libs) == len(opt_libs):
649-
info['libraries'].extend(opt_found_libs)
657+
info = {'libraries' : found_libs, 'library_dirs' : found_dirs}
658+
# Now, check for optional libraries
659+
if is_sequence(lib_dirs):
660+
for dir_ in lib_dirs:
661+
opt_found_libs = self._lib_list(dir_, opt_libs, exts)
662+
if opt_found_libs:
663+
if dir_ not in found_dirs:
664+
found_dirs.extend(dir_)
665+
found_libs.extend(opt_found_libs)
666+
else:
667+
opt_found_libs = self._lib_list(lib_dirs, opt_libs, exts)
668+
if opt_found_libs:
669+
found_libs.extend(opt_found_libs)
650670
return info
651671
else:
652672
return None
@@ -695,12 +715,7 @@ def calc_ver_info(self,ver_param):
695715
incl_dirs = self.get_include_dirs()
696716
incl_dir = None
697717
libs = self.get_libs(self.section+'_libs', ver_param['libs'])
698-
info = None
699-
for d in lib_dirs:
700-
r = self.check_libs(d,libs)
701-
if r is not None:
702-
info = r
703-
break
718+
info = self.check_libs(lib_dirs,libs)
704719
if info is not None:
705720
flag = 0
706721
for d in incl_dirs:
@@ -871,23 +886,18 @@ def __init__(self):
871886
#l = 'mkl_ia32'
872887
if l not in self._lib_mkl:
873888
self._lib_mkl.insert(0,l)
874-
system_info.__init__(self,
875-
default_lib_dirs=[os.path.join(mklroot,'lib',plt)],
876-
default_include_dirs=[os.path.join(mklroot,'include')])
889+
system_info.__init__(
890+
self,
891+
default_lib_dirs=[os.path.join(mklroot,'lib',plt)],
892+
default_include_dirs=[os.path.join(mklroot,'include')])
877893

878894
def calc_info(self):
879895
lib_dirs = self.get_lib_dirs()
880896
incl_dirs = self.get_include_dirs()
881897
mkl_libs = self.get_libs('mkl_libs',self._lib_mkl)
882-
mkl = None
883-
for d in lib_dirs:
884-
mkl = self.check_libs2(d,mkl_libs)
885-
if mkl is not None:
886-
break
887-
if mkl is None:
898+
info = self.check_libs2(lib_dirs,mkl_libs)
899+
if info is None:
888900
return
889-
info = {}
890-
dict_append(info,**mkl)
891901
dict_append(info,
892902
define_macros=[('SCIPY_MKL_H',None)],
893903
include_dirs = incl_dirs)
@@ -950,12 +960,7 @@ def calc_info(self):
950960
lapack_atlas = self.check_libs2(d,['lapack_atlas'],[])
951961
if atlas is not None:
952962
lib_dirs2 = [d] + self.combine_paths(d,['atlas*','ATLAS*'])
953-
for d2 in lib_dirs2:
954-
lapack = self.check_libs2(d2,lapack_libs,[])
955-
if lapack is not None:
956-
break
957-
else:
958-
lapack = None
963+
lapack = self.check_libs2(lib_dirs2,lapack_libs,[])
959964
if lapack is not None:
960965
break
961966
if atlas:
@@ -1035,11 +1040,7 @@ def calc_info(self):
10351040
info = {}
10361041
atlas_libs = self.get_libs('atlas_libs',
10371042
self._lib_names + self._lib_atlas)
1038-
atlas = None
1039-
for d in lib_dirs:
1040-
atlas = self.check_libs2(d,atlas_libs,[])
1041-
if atlas is not None:
1042-
break
1043+
atlas = self.check_libs2(lib_dirs,atlas_libs,[])
10431044
if atlas is None:
10441045
return
10451046
include_dirs = self.get_include_dirs()
@@ -1082,12 +1083,8 @@ def calc_info(self):
10821083
lib_dirs = self.get_lib_dirs()
10831084

10841085
lapack_libs = self.get_libs('lapack_libs', self._lib_names)
1085-
for d in lib_dirs:
1086-
lapack = self.check_libs(d,lapack_libs,[])
1087-
if lapack is not None:
1088-
info = lapack
1089-
break
1090-
else:
1086+
info = self.check_libs(lib_dirs,lapack_libs_libs,[])
1087+
if info is None:
10911088
return
10921089
info['language'] = 'f77'
10931090
self.set_info(**info)
@@ -1253,8 +1250,8 @@ def get_atlas_version(**config):
12531250
if m:
12541251
atlas_version = m.group('version')
12551252
if atlas_version is not None:
1256-
12571253
break
1254+
12581255
# final choice --- look at ATLAS_VERSION environment
12591256
# variable
12601257
if atlas_version is None:
@@ -1294,7 +1291,7 @@ def calc_info(self):
12941291
args = []
12951292
link_args = []
12961293
if get_platform()[-4:] == 'i386' or 'intel' in get_platform() or \
1297-
'i386' in platform.platform():
1294+
'i386' in platform.platform():
12981295
intel = 1
12991296
else:
13001297
intel = 0
@@ -1382,7 +1379,7 @@ def calc_info(self):
13821379
args = []
13831380
link_args = []
13841381
if get_platform()[-4:] == 'i386' or 'intel' in get_platform() or \
1385-
'i386' in platform.platform():
1382+
'i386' in platform.platform():
13861383
intel = 1
13871384
else:
13881385
intel = 0
@@ -1452,12 +1449,8 @@ def calc_info(self):
14521449
lib_dirs = self.get_lib_dirs()
14531450

14541451
blas_libs = self.get_libs('blas_libs', self._lib_names)
1455-
for d in lib_dirs:
1456-
blas = self.check_libs(d,blas_libs,[])
1457-
if blas is not None:
1458-
info = blas
1459-
break
1460-
else:
1452+
info = self.check_libs(lib_dirs,blas_libs,[])
1453+
if info is None:
14611454
return
14621455
info['language'] = 'f77' # XXX: is it generally true?
14631456
self.set_info(**info)
@@ -1529,11 +1522,8 @@ def calc_info(self):
15291522
lib_dirs = self.get_lib_dirs()
15301523
include_dirs = self.get_include_dirs()
15311524
x11_libs = self.get_libs('x11_libs', ['X11'])
1532-
for lib_dir in lib_dirs:
1533-
info = self.check_libs(lib_dir, x11_libs, [])
1534-
if info is not None:
1535-
break
1536-
else:
1525+
info = self.check_libs(lib_dirs, x11_libs, [])
1526+
if info is None:
15371527
return
15381528
inc_dir = None
15391529
for d in include_dirs:
@@ -1880,12 +1870,8 @@ def calc_info(self):
18801870
lib_dirs = self.get_lib_dirs()
18811871

18821872
amd_libs = self.get_libs('amd_libs', self._lib_names)
1883-
for d in lib_dirs:
1884-
amd = self.check_libs(d,amd_libs,[])
1885-
if amd is not None:
1886-
info = amd
1887-
break
1888-
else:
1873+
info = self.check_libs(lib_dirs,amd_libs,[])
1874+
if info is None:
18891875
return
18901876

18911877
include_dirs = self.get_include_dirs()
@@ -1914,12 +1900,8 @@ def calc_info(self):
19141900
lib_dirs = self.get_lib_dirs()
19151901

19161902
umfpack_libs = self.get_libs('umfpack_libs', self._lib_names)
1917-
for d in lib_dirs:
1918-
umf = self.check_libs(d,umfpack_libs,[])
1919-
if umf is not None:
1920-
info = umf
1921-
break
1922-
else:
1903+
info = self.check_libs(lib_dirs,umfpack_libs,[])
1904+
if info is None:
19231905
return
19241906

19251907
include_dirs = self.get_include_dirs()

0 commit comments

Comments
 (0)