llvm: use --gcc_install_dir in config files (#43795)
This commit is contained in:
parent
2bf900a893
commit
47a9f0bdf7
1 changed files with 43 additions and 4 deletions
|
@ -936,7 +936,9 @@ def cmake_args(self):
|
||||||
|
|
||||||
cmake_args.append(from_variant("LIBOMP_TSAN_SUPPORT", "libomp_tsan"))
|
cmake_args.append(from_variant("LIBOMP_TSAN_SUPPORT", "libomp_tsan"))
|
||||||
|
|
||||||
if self.compiler.name == "gcc":
|
# From clang 16 onwards we use a more precise --gcc-install-dir flag in post-install
|
||||||
|
# generated config files.
|
||||||
|
if self.spec.satisfies("@:15 %gcc"):
|
||||||
cmake_args.append(define("GCC_INSTALL_PREFIX", self.compiler.prefix))
|
cmake_args.append(define("GCC_INSTALL_PREFIX", self.compiler.prefix))
|
||||||
|
|
||||||
if self.spec.satisfies("~code_signing platform=darwin"):
|
if self.spec.satisfies("~code_signing platform=darwin"):
|
||||||
|
@ -976,12 +978,24 @@ def cmake_args(self):
|
||||||
runtimes_order.index(x) if x in runtimes_order else len(runtimes_order)
|
runtimes_order.index(x) if x in runtimes_order else len(runtimes_order)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# CMake args passed just to runtimes
|
||||||
|
runtime_cmake_args = [define("CMAKE_INSTALL_RPATH_USE_LINK_PATH", True)]
|
||||||
|
|
||||||
|
# When building runtimes, just-built clang has to know where GCC is.
|
||||||
|
gcc_install_dir_flag = get_gcc_install_dir_flag(spec, self.compiler)
|
||||||
|
if gcc_install_dir_flag:
|
||||||
|
runtime_cmake_args.extend(
|
||||||
|
[
|
||||||
|
define("CMAKE_C_FLAGS", gcc_install_dir_flag),
|
||||||
|
define("CMAKE_CXX_FLAGS", gcc_install_dir_flag),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
cmake_args.extend(
|
cmake_args.extend(
|
||||||
[
|
[
|
||||||
define("LLVM_ENABLE_RUNTIMES", runtimes),
|
define("LLVM_ENABLE_RUNTIMES", runtimes),
|
||||||
define(
|
define("RUNTIMES_CMAKE_ARGS", runtime_cmake_args),
|
||||||
"RUNTIMES_CMAKE_ARGS", [define("CMAKE_INSTALL_RPATH_USE_LINK_PATH", True)]
|
|
||||||
),
|
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -1031,6 +1045,19 @@ def post_install(self):
|
||||||
with working_dir(self.build_directory):
|
with working_dir(self.build_directory):
|
||||||
install_tree("bin", join_path(self.prefix, "libexec", "llvm"))
|
install_tree("bin", join_path(self.prefix, "libexec", "llvm"))
|
||||||
|
|
||||||
|
cfg_files = []
|
||||||
|
if spec.satisfies("+clang"):
|
||||||
|
cfg_files.extend(("clang.cfg", "clang++.cfg"))
|
||||||
|
if spec.satisfies("@19: +flang"):
|
||||||
|
# The config file is `flang.cfg` even though the executable is `flang-new`.
|
||||||
|
# `--gcc-install-dir` / `--gcc-toolchain` support was only added in LLVM 19.
|
||||||
|
cfg_files.append("flang.cfg")
|
||||||
|
gcc_install_dir_flag = get_gcc_install_dir_flag(spec, self.compiler)
|
||||||
|
if gcc_install_dir_flag:
|
||||||
|
for cfg in cfg_files:
|
||||||
|
with open(os.path.join(self.prefix.bin, cfg), "w") as f:
|
||||||
|
print(gcc_install_dir_flag, file=f)
|
||||||
|
|
||||||
def llvm_config(self, *args, **kwargs):
|
def llvm_config(self, *args, **kwargs):
|
||||||
lc = Executable(self.prefix.bin.join("llvm-config"))
|
lc = Executable(self.prefix.bin.join("llvm-config"))
|
||||||
if not kwargs.get("output"):
|
if not kwargs.get("output"):
|
||||||
|
@ -1042,6 +1069,18 @@ def llvm_config(self, *args, **kwargs):
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
def get_gcc_install_dir_flag(spec: Spec, compiler) -> Optional[str]:
|
||||||
|
"""Get the --gcc-install-dir=... flag, so that clang does not do a system scan for GCC."""
|
||||||
|
if not spec.satisfies("@16: %gcc"):
|
||||||
|
return None
|
||||||
|
gcc = Executable(compiler.cc)
|
||||||
|
libgcc_path = gcc("-print-file-name=libgcc.a", output=str, fail_on_error=False).strip()
|
||||||
|
if not os.path.isabs(libgcc_path):
|
||||||
|
return None
|
||||||
|
libgcc_dir = os.path.dirname(libgcc_path)
|
||||||
|
return f"--gcc-install-dir={libgcc_dir}" if os.path.exists(libgcc_dir) else None
|
||||||
|
|
||||||
|
|
||||||
def get_llvm_targets_to_build(spec):
|
def get_llvm_targets_to_build(spec):
|
||||||
targets = spec.variants["targets"].value
|
targets = spec.variants["targets"].value
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue