OpenCV and OpenBLAS: add external find support (#30240)
Added support for finding the OpenCV package via the find external command. Included support for identifying variants based on available shared libraries. Added support to finding the OpenBLAS package via the find external command. Enabled packages to show that they can be discovered via the find external command in the info message. Updated the OpenCV and OpenBLAS packages to use the extensible search mechanism for library extensions on multiple OS platforms. Corrected how find externals works on Darwin for OpenCV and OpenBLAS to accommodate that the version numbers are placed before the file extension instead of after it, as on Linux. Co-authored-by: Adam J. Stewart <ajstewart426@gmail.com> Co-authored-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
This commit is contained in:
@@ -64,6 +64,7 @@
|
||||
'is_exe',
|
||||
'join_path',
|
||||
'last_modification_time_recursive',
|
||||
'library_extensions',
|
||||
'mkdirp',
|
||||
'partition_path',
|
||||
'prefixes',
|
||||
@@ -109,12 +110,15 @@ def path_contains_subdirectory(path, root):
|
||||
return norm_path.startswith(norm_root)
|
||||
|
||||
|
||||
#: This generates the library filenames that may appear on any OS.
|
||||
library_extensions = ['a', 'la', 'so', 'tbd', 'dylib']
|
||||
|
||||
|
||||
def possible_library_filenames(library_names):
|
||||
"""Given a collection of library names like 'libfoo', generate the set of
|
||||
library filenames that may be found on the system (e.g. libfoo.so). This
|
||||
generates the library filenames that may appear on any OS.
|
||||
library filenames that may be found on the system (e.g. libfoo.so).
|
||||
"""
|
||||
lib_extensions = ['a', 'la', 'so', 'tbd', 'dylib']
|
||||
lib_extensions = library_extensions
|
||||
return set(
|
||||
'.'.join((lib, extension)) for lib, extension in
|
||||
itertools.product(library_names, lib_extensions))
|
||||
|
@@ -184,8 +184,9 @@ def print_detectable(pkg):
|
||||
color.cprint('')
|
||||
color.cprint(section_title('Externally Detectable: '))
|
||||
|
||||
# If the package has an 'executables' field, it can detect an installation
|
||||
if hasattr(pkg, 'executables'):
|
||||
# If the package has an 'executables' of 'libraries' field, it
|
||||
# can detect an installation
|
||||
if hasattr(pkg, 'executables') or hasattr(pkg, 'libraries'):
|
||||
find_attributes = []
|
||||
if hasattr(pkg, 'determine_version'):
|
||||
find_attributes.append('version')
|
||||
|
@@ -74,7 +74,8 @@ def executables_in_path(path_hints=None):
|
||||
|
||||
|
||||
def libraries_in_ld_library_path(path_hints=None):
|
||||
"""Get the paths of all libraries available from LD_LIBRARY_PATH.
|
||||
"""Get the paths of all libraries available from LD_LIBRARY_PATH,
|
||||
LIBRARY_PATH, DYLD_LIBRARY_PATH, and DYLD_FALLBACK_LIBRARY_PATH.
|
||||
|
||||
For convenience, this is constructed as a dictionary where the keys are
|
||||
the library paths and the values are the names of the libraries
|
||||
@@ -85,9 +86,15 @@ def libraries_in_ld_library_path(path_hints=None):
|
||||
|
||||
Args:
|
||||
path_hints (list): list of paths to be searched. If None the list will be
|
||||
constructed based on the LD_LIBRARY_PATH environment variable.
|
||||
constructed based on the set of LD_LIBRARY_PATH, LIBRARY_PATH,
|
||||
DYLD_LIBRARY_PATH, and DYLD_FALLBACK_LIBRARY_PATH environment
|
||||
variables.
|
||||
"""
|
||||
path_hints = path_hints or spack.util.environment.get_path('LD_LIBRARY_PATH')
|
||||
path_hints = path_hints or \
|
||||
spack.util.environment.get_path('LIBRARY_PATH') + \
|
||||
spack.util.environment.get_path('LD_LIBRARY_PATH') + \
|
||||
spack.util.environment.get_path('DYLD_LIBRARY_PATH') + \
|
||||
spack.util.environment.get_path('DYLD_FALLBACK_LIBRARY_PATH')
|
||||
search_paths = llnl.util.filesystem.search_paths_for_libraries(*path_hints)
|
||||
|
||||
path_to_lib = {}
|
||||
|
Reference in New Issue
Block a user