find_libraries searches lib and lib64 before prefix (#11958)
The default library search for a package checks the lib/ and lib64/ directories for libraries before the root prefix, in order to save time when searching for libraries provided by externals (which e.g. may have '/usr/' as their root). This moves that logic into the "find_libraries" utility method so packages implementing their own custom library search logic can benefit from it. This also updates packages which appear to be replicating this logic exactly, replacing it with a single call to "find_libraries".
This commit is contained in:

committed by
Peter Scheibel

parent
f1ce1dd163
commit
5bc15b2d9a
@@ -1389,7 +1389,25 @@ def find_libraries(libraries, root, shared=True, recursive=False):
|
||||
# List of libraries we are searching with suffixes
|
||||
libraries = ['{0}.{1}'.format(lib, suffix) for lib in libraries]
|
||||
|
||||
return LibraryList(find(root, libraries, recursive))
|
||||
if not recursive:
|
||||
# If not recursive, look for the libraries directly in root
|
||||
return LibraryList(find(root, libraries, False))
|
||||
|
||||
# To speedup the search for external packages configured e.g. in /usr,
|
||||
# perform first non-recursive search in root/lib then in root/lib64 and
|
||||
# finally search all of root recursively. The search stops when the first
|
||||
# match is found.
|
||||
for subdir in ('lib', 'lib64'):
|
||||
dirname = join_path(root, subdir)
|
||||
if not os.path.isdir(dirname):
|
||||
continue
|
||||
found_libs = find(dirname, libraries, False)
|
||||
if found_libs:
|
||||
break
|
||||
else:
|
||||
found_libs = find(root, libraries, True)
|
||||
|
||||
return LibraryList(found_libs)
|
||||
|
||||
|
||||
@memoized
|
||||
|
@@ -725,28 +725,18 @@ def _libs_default_handler(descriptor, spec, cls):
|
||||
if not name.startswith('lib'):
|
||||
name = 'lib' + name
|
||||
|
||||
# To speedup the search for external packages configured e.g. in /usr,
|
||||
# perform first non-recursive search in prefix.lib then in prefix.lib64 and
|
||||
# finally search all of prefix recursively. The search stops when the first
|
||||
# match is found.
|
||||
prefix = spec.prefix
|
||||
search_paths = [(prefix.lib, False), (prefix.lib64, False), (prefix, True)]
|
||||
|
||||
# If '+shared' search only for shared library; if '~shared' search only for
|
||||
# static library; otherwise, first search for shared and then for static.
|
||||
search_shared = [True] if ('+shared' in spec) else \
|
||||
([False] if ('~shared' in spec) else [True, False])
|
||||
|
||||
for shared in search_shared:
|
||||
for path, recursive in search_paths:
|
||||
libs = find_libraries(
|
||||
name, root=path, shared=shared, recursive=recursive
|
||||
)
|
||||
if libs:
|
||||
return libs
|
||||
libs = find_libraries(name, spec.prefix, shared=shared, recursive=True)
|
||||
if libs:
|
||||
return libs
|
||||
|
||||
msg = 'Unable to recursively locate {0} libraries in {1}'
|
||||
raise NoLibrariesError(msg.format(spec.name, prefix))
|
||||
raise NoLibrariesError(msg.format(spec.name, spec.prefix))
|
||||
|
||||
|
||||
class ForwardQueryToPackage(object):
|
||||
|
Reference in New Issue
Block a user