diff options
-rw-r--r-- | lib/spack/llnl/util/filesystem.py | 10 | ||||
-rw-r--r-- | lib/spack/spack/cmd/info.py | 5 | ||||
-rw-r--r-- | lib/spack/spack/detection/path.py | 13 | ||||
-rw-r--r-- | var/spack/repos/builtin/packages/openblas/package.py | 14 | ||||
-rw-r--r-- | var/spack/repos/builtin/packages/opencv/package.py | 52 |
5 files changed, 86 insertions, 8 deletions
diff --git a/lib/spack/llnl/util/filesystem.py b/lib/spack/llnl/util/filesystem.py index 53db4bdca9..973d2f9de3 100644 --- a/lib/spack/llnl/util/filesystem.py +++ b/lib/spack/llnl/util/filesystem.py @@ -64,6 +64,7 @@ __all__ = [ '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)) diff --git a/lib/spack/spack/cmd/info.py b/lib/spack/spack/cmd/info.py index f6273c4711..7a086dc416 100644 --- a/lib/spack/spack/cmd/info.py +++ b/lib/spack/spack/cmd/info.py @@ -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') diff --git a/lib/spack/spack/detection/path.py b/lib/spack/spack/detection/path.py index 7933114827..b56644a6b4 100644 --- a/lib/spack/spack/detection/path.py +++ b/lib/spack/spack/detection/path.py @@ -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 = {} diff --git a/var/spack/repos/builtin/packages/openblas/package.py b/var/spack/repos/builtin/packages/openblas/package.py index bc85dcb000..e44f8ffaa3 100644 --- a/var/spack/repos/builtin/packages/openblas/package.py +++ b/var/spack/repos/builtin/packages/openblas/package.py @@ -6,6 +6,8 @@ import os import re +from llnl.util.filesystem import library_extensions + from spack import * from spack.package_test import compare_output_file, compile_c_and_execute @@ -17,6 +19,8 @@ class Openblas(MakefilePackage): url = 'https://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz' git = 'https://github.com/xianyi/OpenBLAS.git' + libraries = ['libopenblas'] + version('develop', branch='develop') version('0.3.20', sha256='8495c9affc536253648e942908e88e097f2ec7753ede55aca52e5dead3029e3c') version('0.3.19', sha256='947f51bfe50c2a0749304fbe373e00e7637600b0a47b78a51382aeb30ca08562') @@ -145,6 +149,16 @@ class Openblas(MakefilePackage): depends_on('perl', type='build') + @classmethod + def determine_version(cls, lib): + ver = None + for ext in library_extensions: + match = re.search(r'lib(\S*?)-r(\d+\.\d+\.\d+)\.%s' % + ext, lib) + if match: + ver = match.group(2) + return ver + @property def parallel(self): # unclear whether setting `-j N` externally was supported before 0.3 diff --git a/var/spack/repos/builtin/packages/opencv/package.py b/var/spack/repos/builtin/packages/opencv/package.py index 9ae1492c71..bf96ed08d4 100644 --- a/var/spack/repos/builtin/packages/opencv/package.py +++ b/var/spack/repos/builtin/packages/opencv/package.py @@ -3,6 +3,10 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +import re + +from llnl.util.filesystem import library_extensions + class Opencv(CMakePackage, CudaPackage): """OpenCV (Open Source Computer Vision Library) is an open source computer @@ -233,10 +237,16 @@ class Opencv(CMakePackage, CudaPackage): "js_bindings_generator", ] + # Define the list of libraries objects that may be used + # to find an external installation and its variants + libraries = [] + # module variants for mod in modules: # At least one of these modules must be enabled to build OpenCV variant(mod, default=False, description="Include opencv_{0} module".format(mod)) + lib = 'libopencv_' + mod + libraries.append(lib) # module conflicts and dependencies with when("+calib3d"): @@ -873,6 +883,48 @@ class Opencv(CMakePackage, CudaPackage): conflicts("+win32ui", when="platform=linux", msg="Windows only") conflicts("+win32ui", when="platform=cray", msg="Windows only") + @classmethod + def determine_version(cls, lib): + ver = None + for ext in library_extensions: + pattern = None + if ext == 'dylib': + # Darwin switches the order of the version compared to Linux + pattern = re.compile(r'lib(\S*?)_(\S*)\.(\d+\.\d+\.\d+)\.%s' % + ext) + else: + pattern = re.compile(r'lib(\S*?)_(\S*)\.%s\.(\d+\.\d+\.\d+)' % + ext) + match = pattern.search(lib) + if match: + ver = match.group(3) + return ver + + @classmethod + def determine_variants(cls, libs, version_str): + variants = [] + remaining_modules = set(Opencv.modules) + for lib in libs: + for ext in library_extensions: + pattern = None + if ext == 'dylib': + # Darwin switches the order of the version compared to Linux + pattern = re.compile(r'lib(\S*?)_(\S*)\.(\d+\.\d+\.\d+)\.%s' % + ext) + else: + pattern = re.compile(r'lib(\S*?)_(\S*)\.%s\.(\d+\.\d+\.\d+)' % + ext) + match = pattern.search(lib) + if match and not match.group(2) == 'core': + variants.append('+' + match.group(2)) + remaining_modules.remove(match.group(2)) + + # If libraries are not found, mark those variants as disabled + for mod in remaining_modules: + variants.append('~' + mod) + + return ' '.join(variants) + def cmake_args(self): spec = self.spec args = [ |