spack/var/spack/repos/builtin/packages/llvm/package.py
2025-01-28 09:45:43 +01:00

1227 lines
52 KiB
Python

# Copyright Spack Project Developers. See COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import os
import re
import sys
import llnl.util.tty as tty
from llnl.util.lang import classproperty
import spack.compilers
from spack.build_systems.cmake import get_cmake_prefix_path
from spack.operating_systems.mac_os import macos_sdk_path
from spack.package import *
from spack.package_base import PackageBase
class LlvmDetection(PackageBase):
"""Base class to detect LLVM based compilers"""
compiler_version_argument = "--version"
c_names = ["clang"]
cxx_names = ["clang++"]
@classmethod
def filter_detected_exes(cls, prefix, exes_in_prefix):
# Executables like lldb-vscode-X are daemon listening on some port and would hang Spack
# during detection. clang-cl, clang-cpp, etc. are dev tools that we don't need to test
reject = re.compile(
r"-(vscode|cpp|cl|ocl|gpu|tidy|rename|scan-deps|format|refactor|offload|"
r"check|query|doc|move|extdef|apply|reorder|change-namespace|"
r"include-fixer|import-test|dap|server)"
)
return [x for x in exes_in_prefix if not reject.search(x)]
class Llvm(CMakePackage, CudaPackage, LlvmDetection, CompilerPackage):
"""The LLVM Project is a collection of modular and reusable compiler and
toolchain technologies. Despite its name, LLVM has little to do
with traditional virtual machines, though it does provide helpful
libraries that can be used to build them. The name "LLVM" itself
is not an acronym; it is the full name of the project.
"""
homepage = "https://llvm.org/"
url = "https://github.com/llvm/llvm-project/archive/llvmorg-7.1.0.tar.gz"
list_url = "https://releases.llvm.org/download.html"
git = "https://github.com/llvm/llvm-project"
maintainers("trws", "haampie", "skosukhin")
tags = ["e4s", "compiler"]
generator("ninja")
license("Apache-2.0")
version("main", branch="main")
version("19.1.7", sha256="59abea1c22e64933fad4de1671a61cdb934098793c7a31b333ff58dc41bff36c")
version("19.1.6", sha256="f07fdcbb27b2b67aa95e5ddadf45406b33228481c250e65175066d36536a1ee2")
version("19.1.5", sha256="e2204b9903cd9d7ee833a2f56a18bef40a33df4793e31cc090906b32cbd8a1f5")
version("19.1.4", sha256="010e1fd3cabee8799bd2f8a6fbc68f28207494f315cf9da7057a2820f79fd531")
version("19.1.3", sha256="e5106e2bef341b3f5e41340e4b6c6a58259f4021ad801acf14e88f1a84567b05")
version("19.1.2", sha256="622cb6c5e95a3bb7e9876c4696a65671f235bd836cfd0c096b272f6c2ada41e7")
version("19.1.1", sha256="115dfd98a353d05bffdab3f80db22f159da48aca0124e8c416f437adcd54b77f")
version("19.1.0", sha256="0a08341036ca99a106786f50f9c5cb3fbe458b3b74cab6089fd368d0edb2edfe")
version("18.1.8", sha256="09c08693a9afd6236f27a2ebae62cda656eba19021ef3f94d59e931d662d4856")
version("18.1.7", sha256="b60df7cbe02cef2523f7357120fb0d46cbb443791cde3a5fb36b82c335c0afc9")
version("18.1.6", sha256="01390edfae5b809e982b530ff9088e674c62b13aa92cb9dc1e067fa2cf501083")
version("18.1.5", sha256="d543309f55ae3f9b422108302b45c40f5696c96862f4bda8f5526955daa54284")
version("18.1.4", sha256="deca5a29e8b1d103ecc4badb3c304aca50d5cac6453364d88ee415dc55699dfb")
version("18.1.3", sha256="fc5a2fd176d73ceb17f4e522f8fe96d8dde23300b8c233476d3609f55d995a7a")
version("18.1.2", sha256="8d686d5ece6f12b09985cb382a3a530dc06bb6e7eb907f57c7f8bf2d868ebb0b")
version("18.1.1", sha256="62439f733311869dbbaf704ce2e02141d2a07092d952fc87ef52d1d636a9b1e4")
version("18.1.0", sha256="eb18f65a68981e94ea1a5aae4f02321b17da9e99f76bfdb983b953f4ba2d3550")
version("17.0.6", sha256="81494d32e6f12ea6f73d6d25424dbd2364646011bb8f7e345ca870750aa27de1")
version("17.0.5", sha256="432c1eda3d1c9379cd52a9bee8e0ea6f7b204bff5075895f963fd8e575aa4fb8")
version("17.0.4", sha256="46200b79f52a02fe26d0a43fd856ab6ceff49ab2a0b7c240ac4b700a6ada700c")
version("17.0.3", sha256="1e3d9d04fb5fbd8d0080042ad72c7e2a5c68788b014b186647a604dbbdd625d2")
version("17.0.2", sha256="dcba3eb486973dce45b6edfe618f3f29b703ae7e6ef9df65182fb50fb6fe4235")
version("17.0.1", sha256="d51b10be66c10a6a81f4c594b554ffbf1063ffbadcb810af37d1f88d6e0b49dd")
version("16.0.6", sha256="56b2f75fdaa95ad5e477a246d3f0d164964ab066b4619a01836ef08e475ec9d5")
version("16.0.5", sha256="e0fbca476693fcafa125bc71c8535587b6d9950293122b66b262bb4333a03942")
version("16.0.4", sha256="10c3fe1757d2e4f1cd7745dc548ecf687680a71824ec81701c38524c2a0753e2")
version("16.0.3", sha256="0bd71bc687a4e5a250c40afb0decefc50c85178fcce726137b682039de63919b")
version("16.0.2", sha256="97c3c6aafb53c4bb0ed2781a18d6f05e75445e24bb1dc57a32b74f8d710ac19f")
version("16.0.1", sha256="b5a9ff1793b1e2d388a3819bf35797002b1d2e40bb35a10c65605e0ea1435271")
version("16.0.0", sha256="cba969a0782a3a398658d439f047b5e548ea04724f4fbfdbe17cfc946f4cd3ed")
version("15.0.7", sha256="42a0088f148edcf6c770dfc780a7273014a9a89b66f357c761b4ca7c8dfa10ba")
version("15.0.6", sha256="4d857d7a180918bdacd09a5910bf9743c9861a1e49cb065a85f7a990f812161d")
version("15.0.5", sha256="c47640269e0251e009ae18a25162df4e20e175885286e21d28c054b084b991a4")
version("15.0.4", sha256="e24b4d3bf7821dcb1c901d1e09096c1f88fb00095c5a6ef893baab4836975e52")
version("15.0.3", sha256="8ac8e4c0982bf236526d737d385db5e1e66543ab217a9355d54159659eae3774")
version("15.0.2", sha256="dc11d35e60ab61792baa607dff080c993b39de23fb93b3d3369ba15b0601c307")
version("15.0.1", sha256="20bccb964e39f604fdc16d1258f94d2053fbdcdab2b2f6d5e20e6095ec403c00")
version("15.0.0", sha256="36d83cd84e1caf2bcfda1669c029e2b949adb9860cff01e7d3246ac2348b11ae")
version("14.0.6", sha256="98f15f842700bdb7220a166c8d2739a03a72e775b67031205078f39dd756a055")
version("14.0.5", sha256="a4a57f029cb81f04618e05853f05fc2d21b64353c760977d8e7799bf7218a23a")
version("14.0.4", sha256="1333236f9bee38658762076be4236cb5ebf15ae9b7f2bfce6946b96ae962dc73")
version("14.0.3", sha256="0e1d049b050127ecf6286107e9a4400b0550f841d5d2288b9d31fd32ed0683d5")
version("14.0.2", sha256="ca52232b3451c8e017f00eb882277707c13e30fac1271ec97015f6d0eeb383d1")
version("14.0.1", sha256="c8be00406e872c8a24f8571cf6f5517b73ae707104724b1fd1db2f0af9544019")
version("14.0.0", sha256="87b1a068b370df5b79a892fdb2935922a8efb1fddec4cc506e30fe57b6a1d9c4")
version("13.0.1", sha256="09c50d558bd975c41157364421820228df66632802a4a6a7c9c17f86a7340802")
version("13.0.0", sha256="a1131358f1f9f819df73fa6bff505f2c49d176e9eef0a3aedd1fdbce3b4630e8")
version("12.0.1", sha256="66b64aa301244975a4aea489f402f205cde2f53dd722dad9e7b77a0459b4c8df")
version("12.0.0", sha256="8e6c99e482bb16a450165176c2d881804976a2d770e0445af4375e78a1fbf19c")
version("11.1.0", sha256="53a0719f3f4b0388013cfffd7b10c7d5682eece1929a9553c722348d1f866e79")
version("11.0.1", sha256="9c7ad8e8ec77c5bde8eb4afa105a318fd1ded7dff3747d14f012758719d7171b")
version("11.0.0", sha256="8ad4ddbafac4f2c8f2ea523c2c4196f940e8e16f9e635210537582a48622a5d5")
version("10.0.1", sha256="c7ccb735c37b4ec470f66a6c35fbae4f029c0f88038f6977180b1a8ddc255637")
version("10.0.0", sha256="b81c96d2f8f40dc61b14a167513d87c0d813aae0251e06e11ae8a4384ca15451")
version("9.0.1", sha256="be7b034641a5fda51ffca7f5d840b1a768737779f75f7c4fd18fe2d37820289a")
version("9.0.0", sha256="7807fac25330e24e9955ca46cd855dd34bbc9cc4fdba8322366206654d1036f2")
version("8.0.1", sha256="5b18f6111c7aee7c0933c355877d4abcfe6cb40c1a64178f28821849c725c841")
version("8.0.0", sha256="d81238b4a69e93e29f74ce56f8107cbfcf0c7d7b40510b7879e98cc031e25167")
version("7.1.0", sha256="71c93979f20e01f1a1cc839a247945f556fa5e63abf2084e8468b238080fd839")
version("7.0.1", sha256="f17a6cd401e8fd8f811fbfbb36dcb4f455f898c9d03af4044807ad005df9f3c0")
version("6.0.1", sha256="aefadceb231f4c195fe6d6cd3b1a010b269c8a22410f339b5a089c2e902aa177")
version("6.0.0", sha256="1946ec629c88d30122afa072d3c6a89cc5d5e4e2bb28dc63b2f9ebcc7917ee64")
version("5.0.2", sha256="fe87aa11558c08856739bfd9bd971263a28657663cb0c3a0af01b94f03b0b795")
version("5.0.1", sha256="84ca454abf262579814a2a2b846569f6e0cb3e16dc33ca3642b4f1dff6fbafd3")
version("5.0.0", sha256="1f1843315657a4371d8ca37f01265fa9aae17dbcf46d2d0a95c1fdb3c6a4bab6")
depends_on("c", type="build")
depends_on("cxx", type="build")
variant(
"clang", default=True, description="Build the LLVM C/C++/Objective-C compiler frontend"
)
variant(
"flang",
default=False,
description="Build the LLVM Fortran compiler frontend "
"(experimental - parser only, needs GCC)",
)
conflicts("+flang", when="@:10")
conflicts("+flang", when="~clang")
variant("lldb", default=True, description="Build the LLVM debugger")
conflicts("+lldb", when="~clang")
variant("lld", default=True, description="Build the LLVM linker")
variant("mlir", default=False, when="@10:", description="Build with MLIR support")
variant(
"libunwind",
values=(
"none",
conditional("project", when="@:15"),
conditional("runtime", when="+clang @6:"),
),
default="runtime",
description="Build the LLVM unwinder library"
"either as a runtime (with just-build Clang) "
"or as a project (with the compiler in use)",
)
variant(
"polly",
default=True,
description="Build the LLVM polyhedral optimization plugin, only builds for 3.7.0+",
)
variant(
"libcxx",
values=(
"none",
conditional("project", when="@:15"),
conditional("runtime", when="+clang @6:"),
),
default="runtime",
description="Build the LLVM C++ standard library "
"either as a runtime (with just-build Clang) "
"or as a project (with the compiler in use)",
)
variant("offload", default=True, when="@19:", description="Build the Offload subproject")
conflicts("+offload", when="~clang")
variant("libomptarget", default=True, description="Build the OpenMP offloading library")
conflicts("+libomptarget", when="~clang")
conflicts("+libomptarget", when="~offload @19:")
for _p in ["darwin", "windows"]:
conflicts("+libomptarget", when="platform={0}".format(_p))
del _p
variant(
"libomptarget_debug",
default=False,
description="Allow debug output with the environment variable LIBOMPTARGET_DEBUG=1",
)
conflicts("+libomptarget_debug", when="~libomptarget")
variant(
"compiler-rt",
values=(
"none",
conditional("project", when="+clang"),
conditional("runtime", when="+clang @6:"),
),
default="runtime",
description="Build the LLVM compiler runtime, including sanitizers, "
"either as a runtime (with just-build Clang) "
"or as a project (with the compiler in use)",
)
variant(
"gold",
default=(sys.platform != "darwin"),
description="Add support for LTO with the gold linker plugin",
)
variant("split_dwarf", default=False, description="Build with split dwarf information")
variant(
"llvm_dylib",
default=True,
description="Build a combined LLVM shared library with all components",
)
variant(
"link_llvm_dylib",
default=False,
when="+llvm_dylib",
description="Link LLVM tools against the LLVM shared library",
)
variant(
"targets",
default="all",
description=(
"What targets to build. Spack's target family is always added "
"(e.g. X86 is automatically enabled when targeting znver2)."
),
values=(
"all",
"none",
"aarch64",
"amdgpu",
"arm",
"avr",
"bpf",
"cppbackend",
"hexagon",
"lanai",
"mips",
"msp430",
"nvptx",
"powerpc",
"riscv",
"sparc",
"systemz",
"webassembly",
"x86",
"xcore",
),
multi=True,
)
variant(
"libomp_tsan",
default=False,
# Added in https://reviews.llvm.org/D13072
# Removed in https://reviews.llvm.org/D103767
when="@4:12",
description="Build with OpenMP capable thread sanitizer",
)
variant(
"openmp",
values=("project", conditional("runtime", when="+clang @12:")),
default="runtime",
description="Build OpenMP either as a runtime (with just-build Clang) "
"or as a project (with the compiler in use)",
)
variant(
"code_signing",
default=False,
when="+lldb platform=darwin",
description="Enable code-signing on macOS",
)
variant("python", default=False, description="Install python bindings")
variant("lua", default=True, description="Enable lua scripting inside lldb")
variant("version_suffix", default="none", description="Add a symbol suffix")
variant(
"shlib_symbol_version",
default="none",
description="Add shared library symbol version",
when="@13:",
)
variant("z3", default=False, description="Use Z3 for the clang static analyzer")
conflicts("+z3", when="@:7")
conflicts("+z3", when="~clang")
conflicts("+lua", when="@:10")
conflicts("+lua", when="~lldb")
# Python distutils were removed with 3.12 and are required to build LLVM <= 14
conflicts("^python@3.12:", when="@:14")
variant(
"zstd",
default=False,
when="@15:",
description="Enable zstd support for static analyzer / lld",
)
provides("libllvm@19", when="@19.0.0:19")
provides("libllvm@18", when="@18.0.0:18")
provides("libllvm@17", when="@17.0.0:17")
provides("libllvm@16", when="@16.0.0:16")
provides("libllvm@15", when="@15.0.0:15")
provides("libllvm@14", when="@14.0.0:14")
provides("libllvm@13", when="@13.0.0:13")
provides("libllvm@12", when="@12.0.0:12")
provides("libllvm@11", when="@11.0.0:11")
provides("libllvm@10", when="@10.0.0:10")
provides("libllvm@9", when="@9.0.0:9")
provides("libllvm@8", when="@8.0.0:8")
provides("libllvm@7", when="@7.0.0:7")
provides("libllvm@6", when="@6.0.0:6")
provides("libllvm@5", when="@5.0.0:5")
provides("libllvm@4", when="@4.0.0:4")
provides("libllvm@3", when="@3.0.0:3")
extends("python", when="+python")
# Build dependency
depends_on("cmake@3.4.3:", type="build")
depends_on("cmake@3.13.4:", type="build", when="@12:")
depends_on("cmake@3.20:", type="build", when="@16:")
with when("@:10"):
# Versions 10 and older cannot build runtimes with cmake@3.17:
# See https://reviews.llvm.org/D77284
for runtime in ["libunwind", "libcxx", "compiler-rt"]:
depends_on("cmake@:3.16", type="build", when="{0}=runtime".format(runtime))
del runtime
depends_on("python", when="~python", type="build")
depends_on("pkgconfig", type="build")
# Universal dependency
depends_on("python", when="+python")
# clang and clang-tools dependencies
depends_on("z3@4.7.1:", when="+z3")
# openmp dependencies
depends_on("perl-data-dumper", type=("build"))
depends_on("hwloc")
depends_on("hwloc@2.0.1:", when="@13")
with when("@:15"):
depends_on("elf", when="+cuda")
depends_on("elf", when="+libomptarget")
depends_on("libffi", when="+libomptarget")
# llvm-config --system-libs libraries.
depends_on("zlib-api")
# needs zstd cmake config file, which is not added when built with makefile.
depends_on("zstd build_system=cmake", when="+zstd")
# lldb dependencies
with when("+lldb"):
depends_on("libedit")
depends_on("libxml2")
depends_on("lua@5.3", when="+lua") # purposefully not a range
depends_on("ncurses")
depends_on("py-six", when="+python")
depends_on("swig", when="+lua")
depends_on("swig", when="+python")
depends_on("xz")
for _when_spec in ("+lldb+python", "+lldb+lua"):
with when(_when_spec):
depends_on("swig@2:", when="@10:")
depends_on("swig@3:", when="@12:")
depends_on("swig@4:", when="@17:")
# Commits f0a25fe0b746f56295d5c02116ba28d2f965c175 and
# 81fc5f7909a4ef5a8d4b5da2a10f77f7cb01ba63 fixed swig 4.1 support
depends_on("swig@:4.0", when="@:15")
# gold support, required for some features
depends_on("binutils+gold+ld+plugins+headers", when="+gold")
# Older LLVM do not build with newer compilers, and vice versa
with when("@16:"):
conflicts("%gcc@:7.0")
conflicts("%clang@:4")
conflicts("%apple-clang@:9")
conflicts("%gcc@8:", when="@:5")
conflicts("%gcc@:5.0", when="@8:")
# Internal compiler error on gcc 8.4 on aarch64 https://bugzilla.redhat.com/show_bug.cgi?id=1958295
conflicts("%gcc@8.4:8.4.9", when="@12: target=aarch64:")
# libcxx=project imposes compiler conflicts
# see https://libcxx.llvm.org/#platform-and-compiler-support for the latest release
# and https://github.com/llvm/www-releases for older releases
with when("libcxx=project"):
for v, compiler_conflicts in {
"@7:": {"clang": "@:3.4", "gcc": "@:4.6"},
"@9:": {"clang": "@:3.4", "gcc": "@:4"},
"@11:": {"clang": "@:3", "gcc": "@:4"},
"@13:": {"clang": "@:10", "gcc": "@:10", "apple-clang": "@:11"},
"@14:": {
"clang": "@:11",
"gcc": "@:10",
"apple-clang": "@:11",
"xlc": "@:17.0",
"xlc_r": "@:17.0",
},
"@15:": {
"clang": "@:12",
"gcc": "@:11",
"apple-clang": "@:12",
"xlc": "@:17.0",
"xlc_r": "@:17.0",
},
"@16:": {
"clang": "@:13",
"gcc": "@:11",
"apple-clang": "@:13",
"xlc": "@:17.0",
"xlc_r": "@:17.0",
},
}.items():
with when(v):
for comp in spack.compilers.supported_compilers():
conflicts("%{0}{1}".format(comp, compiler_conflicts.get(comp, "")))
del v, compiler_conflicts, comp
# libomptarget
conflicts("+cuda", when="@15:") # +cuda variant is obselete since LLVM 15
conflicts(
"targets=none",
when="+libomptarget",
msg="Non-host backends needed for offloading, set targets=all",
)
# See https://github.com/spack/spack/pull/32476#issuecomment-1573770361
conflicts("~lld", when="+libomptarget")
# cuda_arch value must be specified
conflicts("cuda_arch=none", when="+cuda", msg="A value for cuda_arch must be specified.")
# clang/test/Misc/target-invalid-cpu-note.c
conflicts("cuda_arch=10")
conflicts("cuda_arch=11")
conflicts("cuda_arch=12")
conflicts("cuda_arch=13")
conflicts("cuda_arch=75", when="@:13")
conflicts("cuda_arch=80", when="@:13")
conflicts("cuda_arch=86", when="@:13")
conflicts("cuda_arch=87", when="@:15")
conflicts("cuda_arch=89", when="@:15")
conflicts("cuda_arch=90", when="@:15")
conflicts("cuda_arch=90a", when="@:17")
# LLVM bug https://bugs.llvm.org/show_bug.cgi?id=48234
# CMake bug: https://gitlab.kitware.com/cmake/cmake/-/issues/21469
# Fixed in upstream versions of both
conflicts("^cmake@3.19.0", when="@6:11.0.0")
# Fix lld templates: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=230463
patch(
"https://raw.githubusercontent.com/freebsd/freebsd-ports/f8f9333d8e1e5a7a6b28c5ef0ca73785db06136e/devel/llvm50/files/lld/patch-tools_lld_ELF_Symbols.cpp",
sha256="c81a50c1b6b78d359c0ce3b88914477f4f2a85b8dbfa7ac745b9e7eb4e53931b",
when="@5+lld%clang@7:",
)
# Add missing include directives for the standard headers (the real need for the following
# patches depends on the implementation of the standard C++ library, the headers, however, must
# be included according to the standard, therefore, we apply the patches regardless of the
# compiler and compiler version).
#
# fix missing ::size_t in 'llvm@4:5'
# see comments in the patch file
patch(
"xray_buffer_queue-cstddef.patch",
# we do not cover compiler-rt=runtime because it is not supported when @:5
when="@4:5 compiler-rt=project",
)
#
# see https://reviews.llvm.org/D64937
# see https://github.com/spack/spack/issues/24270
patch(
"https://github.com/llvm/llvm-project/commit/b288d90b39f4b905c02092a9bfcfd6d78f99b191.patch?full_index=1",
sha256="2028d52e1a39326bb48fb7463132bbfe7fb4fa18f1adfeea9c3ed0320ed49564",
when="@8:9.0.0",
)
#
# committed upstream without a review
# see https://github.com/llvm/llvm-project/commit/b498303066a63a203d24f739b2d2e0e56dca70d1
# see https://github.com/spack/spack/pull/28547
patch(
"https://github.com/llvm/llvm-project/commit/b498303066a63a203d24f739b2d2e0e56dca70d1.patch?full_index=1",
sha256="514926d661635de47972c7d403c9c4669235aa51e22e56d44676d2a2709179b6",
when="@8:11",
)
#
# fix compilation against libstdc++13
patch(
"https://github.com/llvm/llvm-project/commit/1b4fdf18bc2aaa2d46bf072475dd9cbcd44a9fee.patch?full_index=1",
sha256="82481418766b4b949ea808d956ff3800b9a241a576370114862428bb0e25ee1f",
when="@14:15",
)
# missing <cstdint> include
patch(
"https://github.com/llvm/llvm-project/commit/ff1681ddb303223973653f7f5f3f3435b48a1983.patch?full_index=1",
sha256="c6ca6b925f150e8644ce756023797b7f94c9619c62507231f979edab1c09af78",
when="@6:13",
)
# fix building of older versions of llvm with newer versions of glibc
for compiler_rt_as in ["project", "runtime"]:
with when("compiler-rt={0}".format(compiler_rt_as)):
# sys/ustat.h has been removed in favour of statfs from glibc-2.28
# see https://reviews.llvm.org/D47281
patch(
"https://github.com/llvm/llvm-project/commit/383fe5c8668f63ef21c646b43f48da9fa41aa100.patch?full_index=1",
sha256="66f01ac1769a6815aba09d6f4347ac1744f77f82ec9578a1158b24daca7a89e6",
when="@4:6.0.0",
)
# fix sanitizer-common build with glibc 2.31
# see https://reviews.llvm.org/D70662
patch("sanitizer-ipc_perm_mode.patch", when="@5:9")
del compiler_rt_as
# Backport from llvm upstream gcc ppc const expr long double issue
# see https://bugs.llvm.org/show_bug.cgi?id=39696
# This fix was initially committed (3bf63cf3b366) for the 9.0 release
# but was then broken (0583d9ea8d5e) prior to the 9.0 release and
# eventually unbroken (d9a42ec98adc) for the 11.0 release. The first
# patch backports the original correct fix to previous releases. The
# second patch backports the un-breaking of the original fix.
for libcxx_as in ["project", "runtime"]:
with when("libcxx={0}".format(libcxx_as)):
patch(
"https://github.com/llvm/llvm-project/commit/3bf63cf3b366d3a57cf5cbad4112a6abf6c0c3b1.patch?full_index=1",
sha256="e56489a4bcf3c3636e206adca366bfcda2722ad81a5fa9a0360faed63933191a",
when="@6:8",
)
patch(
"https://github.com/llvm/llvm-project/commit/d9a42ec98adcb1ebc0c3837715df4e5a50c7ccc0.patch?full_index=1",
sha256="50bfc4e82c02bb5b7739990f363d99b1e43d5d11a5104f6aabbc303ebce6fbe3",
when="@9:10",
)
del libcxx_as
# Backport from llvm to fix issues related to Python 3.7
# see https://bugs.llvm.org/show_bug.cgi?id=38233
patch(
"https://github.com/llvm/llvm-project/commit/5457b426f5e15a29c0acc8af1a476132f8be2a36.patch?full_index=1",
sha256="7a1e4aa80760167807255c3e3121b1281bfcf532396b2d8fb3dce021f3f18758",
when="@4:6+python+lldb ^python@3.7:",
)
# fix building on SUSE (with panel.h being in /usr/include/ncurses/)
# see https://reviews.llvm.org/D85219
# see https://github.com/spack/spack/issues/19625
patch(
"https://github.com/llvm/llvm-project/commit/c952ec15d38843b69e22dfd7b0665304a0459f9f.patch?full_index=1",
sha256="66932ba31b5bf8808ea112e42cfd79b2480a4936e711771c06ce851eac429b2c",
when="@10:11+lldb",
)
# honor Python2_EXECUTABLE and Python3_EXECUTABLE when they are passed to cmake
# see https://reviews.llvm.org/D91536
patch(
"https://github.com/llvm/llvm-project/commit/16de50895e96adbe261a5ce2498366bda7b3fccd.patch?full_index=1",
sha256="0e121ed460aa6e117f9f5f339d597a96c0fe4f97dc2209aba47b43ffc831ea24",
# The patch is applicable only starting version 7.0.0 (the older version might require a
# different patch addressing https://github.com/spack/spack/issues/19908). It looks like
# the patched function is used only if both compiler-rt and libcxx are enabled but we keep
# it simple:
when="@7:11",
)
# Workaround for issue https://github.com/spack/spack/issues/18197
patch("llvm7_intel.patch", when="@7 %intel@18.0.2,19.0.0:19.1.99")
# Remove cyclades support to build against newer kernel headers
# https://reviews.llvm.org/D102059
patch(
"https://github.com/llvm/llvm-project/commit/68d5235cb58f988c71b403334cd9482d663841ab.patch?full_index=1",
sha256="742501723642675075e617f3c38339961b2c7b6fd8290dbffc52239ab0783317",
when="@10:12.0.0",
)
# The patch above is not applicable when "@:9" due to the file renaming and reformatting. The
# following patch is applicable starting at least version 5.0.0, the oldest we try to support.
patch("no_cyclades9.patch", when="@5:9")
with when("+libomptarget"):
# libomptarget makes use of multithreading via the standard C++ library (e.g.
# std::call_once), which, depending on the platform and the implementation of the standard
# library, might or might not require linking to libpthread (note that the failure might
# happen at the linking time as well as at the runtime). In some cases, the required linker
# flag comes as a transitive dependency (e.g. from the static LLVMSupport component). The
# following patches enforce linking to the thread library that is relevant for the system,
# which might lead to overlinking in some cases though.
# TODO: figure out why we do not use LLVM_PTHREAD_LIB but run find_package(Threads), at
# least for newer versions (the solution must work with both openmp=runtime and
# openmp=project)
patch("llvm12-thread.patch", when="@12")
patch("llvm13-14-thread.patch", when="@13:14")
patch("llvm15-thread.patch", when="@15")
# avoid build failed with Fujitsu compiler
patch("llvm13-fujitsu.patch", when="@13 %fj")
# avoid build failed with Fujitsu compiler since llvm17
patch("llvm17-fujitsu.patch", when="@17: %fj")
patch("llvm17-18-thread.patch", when="@17:18 %fj")
# patch for missing hwloc.h include for libompd
# see https://reviews.llvm.org/D123888
patch(
"https://github.com/llvm/llvm-project/commit/91ccd8248c85385a5654c63c302a37d97f811bab.patch?full_index=1",
sha256="b216cff38659c176c5381e9dda3252edbb204e6f6f1f33e843a9ebcc42732e5d",
when="@14 openmp=runtime",
)
# make libflags a list in openmp subproject when openmp=project
# see https://reviews.llvm.org/D125370
patch(
"https://github.com/llvm/llvm-project/commit/e27ce281399dca8b08b6ca593172a1bd5dbdd5c1.patch?full_index=1",
sha256="6f0cfa55e3ed17ee33346b0a5bca8092adcc1dc75ca712ab83901755fba9767e",
when="@3.7:14 openmp=project",
)
# fix detection of LLDB_PYTHON_EXE_RELATIVE_PATH
# see https://reviews.llvm.org/D133513
# TODO: the patch is not applicable after https://reviews.llvm.org/D141042 but it is not clear
# yet whether we need a version of it for when="@16:"
patch("D133513.diff", level=0, when="@14:15+lldb+python")
# Fix hwloc@:2.3 (Conditionally disable hwloc@2.0 and hwloc@2.4 code)
patch(
"https://github.com/llvm/llvm-project/commit/3a362a9f38b95978160377ee408dbc7d14af9aad.patch?full_index=1",
sha256="25bc503f7855229620e56e76161cf4654945aef0be493a2d8d9e94a088157b7c",
when="@14:15",
)
# Fix false positive detection of a target when building compiler-rt as a runtime
# https://reviews.llvm.org/D127975
patch(
"https://github.com/llvm/llvm-project/commit/9f1d90bf91570efa124c4a86cd033de374d1049a.patch?full_index=1",
sha256="1f4287465b3e499911e039e6cc2f395b8cb00eb8a0a223fa0db3704ba77f9969",
when="@13:14 compiler-rt=runtime",
)
patch("add-include-for-libelf-llvm-12-14.patch", when="@12:14")
patch("add-include-for-libelf-llvm-15.patch", when="@15")
patch("sanitizer-platform-limits-posix-xdr-macos.patch", when="@10:14 platform=darwin")
@when("@14:17")
def patch(self):
# https://github.com/llvm/llvm-project/pull/69458
filter_file(
r"${TERMINFO_LIB}",
r"${Terminfo_LIBRARIES}",
"lldb/source/Core/CMakeLists.txt",
string=True,
)
compiler_version_regex = (
# Normal clang compiler versions are left as-is
r"clang version ([^ )\n]+)-svn[~.\w\d-]*|"
# Don't include hyphenated patch numbers in the version
# (see https://github.com/spack/spack/pull/14365 for details)
r"clang version ([^ )\n]+?)-[~.\w\d-]*|"
r"clang version ([^ )\n]+)|"
# LLDB
r"lldb version ([^ )\n]+)|"
# LLD
r"LLD ([^ )\n]+) \(compatible with GNU linkers\)"
)
fortran_names = ["flang"]
@property
def supported_languages(self):
languages = []
if self.spec.satisfies("+clang"):
languages.extend(["c", "cxx"])
if self.spec.satisfies("+flang"):
languages.append("fortran")
return languages
@classproperty
def executables(cls):
return super().executables + [r"^ld\.lld(-\d+)?$", r"^lldb(-\d+)?$"]
@classmethod
def determine_version(cls, exe):
try:
compiler = Executable(exe)
output = compiler(cls.compiler_version_argument, output=str, error=str)
if "Apple" in output:
return None
if "AMD" in output:
return None
match = re.search(cls.compiler_version_regex, output)
if match:
return match.group(match.lastindex)
except ProcessError:
pass
except Exception as e:
tty.debug(e)
return None
@classmethod
def determine_variants(cls, exes, version_str):
# Do not need to reuse more general logic from CompilerPackage
# because LLVM has kindly named compilers
variants, compilers = ["+clang"], {}
lld_found, lldb_found = False, False
for exe in sorted(exes, key=len):
name = os.path.basename(exe)
if "clang++" in name:
compilers.setdefault("cxx", exe)
elif "clang" in name:
compilers.setdefault("c", exe)
elif "flang" in name:
variants.append("+flang")
compilers.setdefault("fortran", exe)
elif "ld.lld" in name:
lld_found = True
elif "lldb" in name:
lldb_found = True
variants.append("+lld" if lld_found else "~lld")
variants.append("+lldb" if lldb_found else "~lldb")
return "".join(variants), {"compilers": compilers}
@classmethod
def validate_detected_spec(cls, spec, extra_attributes):
# For LLVM 'compilers' is a mandatory attribute
msg = 'the extra attribute "compilers" must be set for ' 'the detected spec "{0}"'.format(
spec
)
assert "compilers" in extra_attributes, msg
compilers = extra_attributes["compilers"]
for key in ("c", "cxx"):
msg = "{0} compiler not found for {1}"
assert key in compilers, msg.format(key, spec)
@property
def cc(self):
msg = "cannot retrieve C compiler [spec is not concrete]"
assert self.spec.concrete, msg
if self.spec.external:
return self.spec.extra_attributes["compilers"].get("c", None)
result = None
if self.spec.satisfies("+clang"):
result = os.path.join(self.spec.prefix.bin, "clang")
return result
@property
def cxx(self):
msg = "cannot retrieve C++ compiler [spec is not concrete]"
assert self.spec.concrete, msg
if self.spec.external:
return self.spec.extra_attributes["compilers"].get("cxx", None)
result = None
if self.spec.satisfies("+clang"):
result = os.path.join(self.spec.prefix.bin, "clang++")
return result
@property
def fc(self):
msg = "cannot retrieve Fortran compiler [spec is not concrete]"
assert self.spec.concrete, msg
if self.spec.external:
return self.spec.extra_attributes["compilers"].get("fc", None)
result = None
if self.spec.satisfies("+flang"):
result = os.path.join(self.spec.prefix.bin, "flang")
return result
@property
def f77(self):
msg = "cannot retrieve Fortran 77 compiler [spec is not concrete]"
assert self.spec.concrete, msg
if self.spec.external:
return self.spec.extra_attributes["compilers"].get("f77", None)
result = None
if self.spec.satisfies("+flang"):
result = os.path.join(self.spec.prefix.bin, "flang")
return result
@property
def libs(self):
return LibraryList(self.llvm_config("--libfiles", "all", result="list"))
@run_before("cmake")
def codesign_check(self):
if self.spec.satisfies("+code_signing"):
codesign = which("codesign")
mkdir("tmp")
llvm_check_file = join_path("tmp", "llvm_check")
copy("/usr/bin/false", llvm_check_file)
try:
codesign("-f", "-s", "lldb_codesign", "--dryrun", llvm_check_file)
except ProcessError:
# Newer LLVM versions have a simple script that sets up
# automatically when run with sudo priviliges
setup = Executable("./lldb/scripts/macos-setup-codesign.sh")
try:
setup()
except Exception:
raise RuntimeError(
"spack was unable to either find or set up"
"code-signing on your system. Please refer to"
"https://lldb.llvm.org/resources/build.html#"
"code-signing-on-macos for details on how to"
"create this identity."
)
def flag_handler(self, name, flags):
if name == "ldflags" and self.spec.satisfies("%intel"):
flags.append("-shared-intel")
return (None, flags, None)
return (flags, None, None)
def setup_build_environment(self, env):
"""When using %clang, add only its ld.lld-$ver and/or ld.lld to our PATH"""
if self.compiler.name in ["clang", "apple-clang"]:
for lld in "ld.lld-{0}".format(self.compiler.version.version[0]), "ld.lld":
bin = os.path.join(os.path.dirname(self.compiler.cc), lld)
sym = os.path.join(self.stage.path, "ld.lld")
if os.path.exists(bin) and not os.path.exists(sym):
mkdirp(self.stage.path)
os.symlink(bin, sym)
env.prepend_path("PATH", self.stage.path)
if self.spec.satisfies("platform=darwin"):
# set the SDKROOT so the bootstrap compiler finds its C++ headers
env.set("SDKROOT", macos_sdk_path())
def setup_run_environment(self, env):
if self.spec.satisfies("+clang"):
env.set("CC", join_path(self.spec.prefix.bin, "clang"))
env.set("CXX", join_path(self.spec.prefix.bin, "clang++"))
if self.spec.satisfies("+flang"):
env.set("FC", join_path(self.spec.prefix.bin, "flang"))
env.set("F77", join_path(self.spec.prefix.bin, "flang"))
root_cmakelists_dir = "llvm"
def cmake_args(self):
spec = self.spec
define = self.define
from_variant = self.define_from_variant
cmake_args = [
define("LLVM_REQUIRES_RTTI", True),
define("LLVM_ENABLE_RTTI", True),
define("LLVM_ENABLE_LIBXML2", False),
define("CLANG_DEFAULT_OPENMP_RUNTIME", "libomp"),
define("LIBOMP_USE_HWLOC", True),
define("LIBOMP_HWLOC_INSTALL_DIR", spec["hwloc"].prefix),
from_variant("LLVM_ENABLE_ZSTD", "zstd"),
]
# Flang does not support exceptions from core llvm.
# LLVM_ENABLE_EH=True when building flang will soon
# fail (with changes at the llvm-project level).
# Only enable exceptions in LLVM if we are *not*
# building flang. FYI: LLVM <= 16.x will build flang
# successfully but the executable will suffer from
# link errors looking for C++ EH support.
if "+flang" not in spec:
cmake_args.append(define("LLVM_ENABLE_EH", True))
version_suffix = spec.variants["version_suffix"].value
if version_suffix != "none":
cmake_args.append(define("LLVM_VERSION_SUFFIX", version_suffix))
shlib_symbol_version = spec.variants.get("shlib_symbol_version", None)
if shlib_symbol_version is not None and shlib_symbol_version.value != "none":
cmake_args.append(define("LLVM_SHLIB_SYMBOL_VERSION", shlib_symbol_version.value))
projects = []
runtimes = []
if spec.satisfies("+cuda"):
cmake_args.extend(
[
define("CUDA_TOOLKIT_ROOT_DIR", spec["cuda"].prefix),
define(
"LIBOMPTARGET_NVPTX_COMPUTE_CAPABILITIES",
",".join(spec.variants["cuda_arch"].value),
),
define(
"CLANG_OPENMP_NVPTX_DEFAULT_ARCH",
"sm_{0}".format(spec.variants["cuda_arch"].value[-1]),
),
]
)
if spec.satisfies("openmp=runtime"):
cmake_args.append(define("LIBOMPTARGET_NVPTX_ENABLE_BCLIB", True))
else:
# still build libomptarget but disable cuda
cmake_args.extend(
[
define("CUDA_TOOLKIT_ROOT_DIR", "IGNORE"),
define("CUDA_SDK_ROOT_DIR", "IGNORE"),
define("CUDA_NVCC_EXECUTABLE", "IGNORE"),
define("LIBOMPTARGET_DEP_CUDA_DRIVER_LIBRARIES", "IGNORE"),
]
)
cmake_args.append(from_variant("LIBOMPTARGET_ENABLE_DEBUG", "libomptarget_debug"))
if spec.satisfies("@14:"):
# The hsa-rocr-dev package may be pulled in through hwloc, which can lead to cmake
# finding libhsa and enabling the AMDGPU plugin. Since we don't support this yet,
# disable explicitly. See commit a05a0c3c2f8eefc80d84b7a87a23a4452d4a3087.
cmake_args.append(define("LIBOMPTARGET_BUILD_AMDGPU_PLUGIN", False))
if "python" in spec: # lit's Python needs to be set with this variable
cmake_args.append(define("python_executable", spec["python"].command.path))
if spec.satisfies("+lldb"):
projects.append("lldb")
cmake_args.extend(
[
define("LLDB_ENABLE_LIBEDIT", True),
define("LLDB_ENABLE_CURSES", True),
define("LLDB_ENABLE_LIBXML2", True),
from_variant("LLDB_ENABLE_LUA", "lua"),
define("LLDB_ENABLE_LZMA", True),
]
)
if spec.satisfies("@19:"):
cmake_args.append(define("LLDB_CURSES_LIBS", spec["ncurses"].libs))
else:
if spec["ncurses"].satisfies("+termlib"):
cmake_args.append(define("LLVM_ENABLE_TERMINFO", True))
else:
cmake_args.append(define("LLVM_ENABLE_TERMINFO", False))
if spec.version >= Version("10"):
cmake_args.append(from_variant("LLDB_ENABLE_PYTHON", "python"))
else:
cmake_args.append(define("LLDB_DISABLE_PYTHON", spec.satisfies("~python")))
if spec.satisfies("@5.0.0: +python"):
cmake_args.append(define("LLDB_USE_SYSTEM_SIX", True))
elif spec.satisfies("@:19"):
cmake_args.append(define("LLVM_ENABLE_TERMINFO", False))
if spec.satisfies("+gold"):
cmake_args.append(define("LLVM_BINUTILS_INCDIR", spec["binutils"].prefix.include))
if spec.satisfies("+clang"):
projects.append("clang")
projects.append("clang-tools-extra")
if spec.satisfies("openmp=runtime"):
runtimes.append("openmp")
elif spec.satisfies("openmp=project"):
projects.append("openmp")
if spec.satisfies("+offload"):
runtimes.append("offload")
if spec.satisfies("+libomptarget"):
cmake_args.append(define("OPENMP_ENABLE_LIBOMPTARGET", True))
else:
cmake_args.append(define("OPENMP_ENABLE_LIBOMPTARGET", False))
if spec.satisfies("@8"):
cmake_args.append(from_variant("CLANG_ANALYZER_ENABLE_Z3_SOLVER", "z3"))
elif spec.satisfies("@9:"):
cmake_args.append(from_variant("LLVM_ENABLE_Z3_SOLVER", "z3"))
if spec.satisfies("+flang"):
projects.append("flang")
if spec.satisfies("+lld"):
projects.append("lld")
if spec.satisfies("compiler-rt=runtime"):
runtimes.append("compiler-rt")
elif spec.satisfies("compiler-rt=project"):
projects.append("compiler-rt")
if spec.satisfies("libcxx=runtime"):
runtimes.extend(["libcxx", "libcxxabi"])
elif spec.satisfies("libcxx=project"):
projects.extend(["libcxx", "libcxxabi"])
if spec.satisfies("+mlir"):
projects.append("mlir")
if spec.satisfies("libunwind=runtime"):
runtimes.append("libunwind")
elif spec.satisfies("libunwind=project"):
projects.append("libunwind")
if spec.satisfies("+polly"):
projects.append("polly")
cmake_args.append(define("LINK_POLLY_INTO_TOOLS", True))
cmake_args.extend(
[
define("BUILD_SHARED_LIBS", False),
from_variant("LLVM_BUILD_LLVM_DYLIB", "llvm_dylib"),
from_variant("LLVM_LINK_LLVM_DYLIB", "link_llvm_dylib"),
from_variant("LLVM_USE_SPLIT_DWARF", "split_dwarf"),
# By default on Linux, libc++.so is a ldscript. CMake fails to add
# CMAKE_INSTALL_RPATH to it, which fails. Statically link libc++abi.a
# into libc++.so, linking with -lc++ or -stdlib=libc++ is enough.
define("LIBCXX_ENABLE_STATIC_ABI_LIBRARY", True),
# Make sure that CMake does not pick host-installed tools for the build
# Until #45535 is merged, prevent CMake from delivering incompatible
# system tools like python3.12 to older LLVM versions like LLVM-14:
define("CMAKE_FIND_PACKAGE_PREFER_CONFIG", True),
define("CMAKE_FIND_USE_PACKAGE_ROOT_PATH", False),
define("CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY", False),
define("CMAKE_FIND_USE_PACKAGE_REGISTRY", False),
define("CMAKE_FIND_USE_SYSTEM_PATH", False),
]
)
cmake_args.append(define("LLVM_TARGETS_TO_BUILD", get_llvm_targets_to_build(spec)))
cmake_args.append(from_variant("LIBOMP_TSAN_SUPPORT", "libomp_tsan"))
# 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))
if self.spec.satisfies("~code_signing platform=darwin"):
cmake_args.append(define("LLDB_USE_SYSTEM_DEBUGSERVER", True))
# LLDB test suite requires libc++
if spec.satisfies("libcxx=none"):
cmake_args.append(define("LLDB_INCLUDE_TESTS", False))
# Enable building with CLT [and not require full Xcode]
# https://github.com/llvm/llvm-project/issues/57037
if self.spec.satisfies("@15.0.0: platform=darwin"):
cmake_args.append(
define(
"BUILTINS_CMAKE_ARGS",
";".join(
[f"-DCOMPILER_RT_ENABLE_{os}=OFF" for os in ("IOS", "WATCHOS", "TVOS")]
),
)
)
if self.spec.satisfies("platform=darwin"):
cmake_args.append(define("LLVM_ENABLE_LIBCXX", True))
cmake_args.append(define("DEFAULT_SYSROOT", macos_sdk_path()))
# without this libc++ headers are not fond during compiler-rt build
cmake_args.append(define("LLVM_BUILD_EXTERNAL_COMPILER_RT", True))
# Semicolon seperated list of projects to enable
cmake_args.append(define("LLVM_ENABLE_PROJECTS", projects))
# Semicolon seperated list of runtimes to enable
if runtimes:
# The older versions are not careful enough with the order of the runtimes.
# Instead of applying
# https://github.com/llvm/llvm-project/commit/06400a0142af8297b5d39b8f34a7c59db6f9910c,
# which might be incompatible with the version that we install,
# we sort the runtimes here according to the same order as
# in the aforementioned commit:
if self.spec.satisfies("@:14"):
runtimes_order = [
"libc",
"libunwind",
"libcxxabi",
"libcxx",
"compiler-rt",
"openmp",
]
runtimes.sort(
key=lambda x: (
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(
[
define("LLVM_ENABLE_RUNTIMES", runtimes),
define("RUNTIMES_CMAKE_ARGS", runtime_cmake_args),
]
)
return cmake_args
@run_after("install")
def post_install(self):
spec = self.spec
define = self.define
# unnecessary if we build openmp via LLVM_ENABLE_RUNTIMES
if self.spec.satisfies("+cuda openmp=project"):
ompdir = "build-bootstrapped-omp"
prefix_paths = get_cmake_prefix_path(self)
prefix_paths.append(str(spec.prefix))
# rebuild libomptarget to get bytecode runtime library files
with working_dir(ompdir, create=True):
cmake_args = [
"-G",
"Ninja",
define("CMAKE_BUILD_TYPE", spec.variants["build_type"].value),
define("CMAKE_C_COMPILER", spec.prefix.bin + "/clang"),
define("CMAKE_CXX_COMPILER", spec.prefix.bin + "/clang++"),
define("CMAKE_INSTALL_PREFIX", spec.prefix),
define("CMAKE_PREFIX_PATH", prefix_paths),
]
cmake_args.extend(self.cmake_args())
cmake_args.extend(
[
define("LIBOMPTARGET_NVPTX_ENABLE_BCLIB", True),
self.stage.source_path + "/openmp",
]
)
cmake(*cmake_args)
ninja()
ninja("install")
if self.spec.satisfies("+python"):
if spec.version < Version("17.0.0"):
# llvm bindings were removed in v17:
# https://releases.llvm.org/17.0.1/docs/ReleaseNotes.html#changes-to-the-python-bindings
install_tree("llvm/bindings/python", python_platlib)
if self.spec.satisfies("+clang"):
install_tree("clang/bindings/python", python_platlib)
with working_dir(self.build_directory):
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, result=None, **kwargs):
lc = Executable(self.prefix.bin.join("llvm-config"))
if not kwargs.get("output"):
kwargs["output"] = str
ret = lc(*args, **kwargs)
if result == "list":
return ret.split()
else:
return ret
@property
def unresolved_libraries(self):
# libomptarget at 14 and older has a hard-coded rpath that lacks hwloc's path
# https://github.com/llvm/llvm-project/commit/dc52712a063241bd0d3a0473b4e7ed870e41921f
if self.spec.satisfies("@:14 +libomptarget"):
return ["*"]
# TODO: for newer llvm there are still issues with runtimes for omp we
# have to add rpaths to `bin/llvm-omp-*` and `share/gdb/python/ompd/ompdModule.so`.
return ["libpython*.so.*", "libomp.so*", "libomptarget*.so*", "libunwind.so.*"]
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):
targets = spec.variants["targets"].value
# Build everything?
if "all" in targets:
return "all"
# Convert targets variant values to CMake LLVM_TARGETS_TO_BUILD array.
spack_to_cmake = {
"aarch64": "AArch64",
"amdgpu": "AMDGPU",
"arm": "ARM",
"avr": "AVR",
"bpf": "BPF",
"cppbackend": "CppBackend",
"hexagon": "Hexagon",
"lanai": "Lanai",
"mips": "Mips",
"msp430": "MSP430",
"nvptx": "NVPTX",
"powerpc": "PowerPC",
"riscv": "RISCV",
"sparc": "Sparc",
"systemz": "SystemZ",
"webassembly": "WebAssembly",
"x86": "X86",
"xcore": "XCore",
}
if "none" in targets:
llvm_targets = set()
else:
llvm_targets = set(spack_to_cmake[target] for target in targets)
if spec.target.family in ("x86", "x86_64"):
llvm_targets.add("X86")
elif spec.target.family == "arm":
llvm_targets.add("ARM")
elif spec.target.family == "aarch64":
llvm_targets.add("AArch64")
elif spec.target.family in ("sparc", "sparc64"):
llvm_targets.add("Sparc")
elif spec.target.family in ("ppc64", "ppc64le", "ppc", "ppcle"):
llvm_targets.add("PowerPC")
return list(llvm_targets)