Create include/lib in prefix for oneapi packages (#37552)

This commit is contained in:
Robert Cohn
2023-05-10 06:25:00 -04:00
committed by GitHub
parent 9a37c8fcb1
commit a2ea30aceb
5 changed files with 50 additions and 2 deletions

View File

@@ -4,13 +4,16 @@
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
"""Common utilities for managing intel oneapi packages."""
import getpass
import os
import platform
import shutil
from os.path import basename, dirname, isdir
from llnl.util.filesystem import find_headers, find_libraries, join_path
from llnl.util.link_tree import LinkTree
from spack.directives import conflicts, variant
from spack.package import mkdirp
from spack.util.environment import EnvironmentModifications
from spack.util.executable import Executable
@@ -125,6 +128,31 @@ def setup_run_environment(self, env):
)
)
def symlink_dir(self, src, dest):
# Taken from: https://github.com/spack/spack/pull/31285/files
# oneapi bin/lib directories are 2 or 3 levels below the
# prefix, but it is more typical to have them directly in the
# prefix. The location has changed over time. Rather than make
# every package that needs to know where include/lib are
# located be aware of this, put in symlinks to conform. This
# is good enough for some, but not all packages.
# If we symlink top-level directories directly, files won't
# show up in views Create real dirs and symlink files instead
# Create a real directory at dest
mkdirp(dest)
# Symlink all files in src to dest keeping directories as dirs
for entry in os.listdir(src):
src_path = join_path(src, entry)
dest_path = join_path(dest, entry)
if isdir(src_path) and os.access(src_path, os.X_OK):
link_tree = LinkTree(src_path)
link_tree.merge(dest_path)
else:
os.symlink(src_path, dest_path)
class IntelOneApiLibraryPackage(IntelOneApiPackage):
"""Base class for Intel oneAPI library packages.

View File

@@ -170,9 +170,12 @@ def edit(self, spec, prefix):
config["LIB_FFT"] = spec["mkl"].libs.ld_flags
config["SRC_FFT"] = "mkl_dfti.f90 zfftifc_mkl.f90"
cp = which("cp")
mkl_prefix = spec["mkl"].prefix
if spec.satisfies("^intel-mkl"):
mkl_prefix = mkl_prefix.mkl
cp(
"{}/mkl/include/mkl_dfti.f90".format(spec["mkl"].prefix),
self.build_directory + "/src",
join_path(mkl_prefix.include, "mkl_dfti.f90"),
join_path(self.build_directory, "src"),
)
# Define targets

View File

@@ -170,3 +170,8 @@ def _find_mkl_libs(self, shared):
def _xlp64_lib(self, lib):
return lib + ("_ilp64" if "+ilp64" in self.spec else "_lp64")
@run_after("install")
def fixup_prefix(self):
self.symlink_dir(self.component_prefix.include, self.prefix.include)
self.symlink_dir(self.component_prefix.lib, self.prefix.lib)

View File

@@ -176,3 +176,10 @@ def fix_wrappers(self):
self.component_prefix.bin.join(wrapper),
backup=False,
)
@run_after("install")
def fixup_prefix(self):
self.symlink_dir(self.component_prefix.include, self.prefix.include)
self.symlink_dir(self.component_prefix.lib, self.prefix.lib)
self.symlink_dir(self.component_prefix.lib.release, self.prefix.lib)
self.symlink_dir(self.component_prefix.bin, self.prefix.bin)

View File

@@ -94,3 +94,8 @@ class IntelOneapiTbb(IntelOneApiLibraryPackage):
@property
def component_dir(self):
return "tbb"
@run_after("install")
def fixup_prefix(self):
self.symlink_dir(self.component_prefix.include, self.prefix.include)
self.symlink_dir(self.component_prefix.lib, self.prefix.lib)