From cffe067937a02eb2c9a5f3d80e6789c3c36867f6 Mon Sep 17 00:00:00 2001 From: Efraim Flashner Date: Tue, 26 Mar 2024 14:14:19 +0200 Subject: gnu: Add llvm-18. * gnu/packages/llvm.scm (clang-runtime-from-llvm)[native-inputs]: When building clang-runtime-18 or newer use gcc-13. (%llvm-monorepo-hashes): Add entry for llvm-18. (%llvm-patches): Add entry for llvm-18. (llvm-18, clang-runtime-18, clang-18, libomp-18, clang-toolchain-18): New variables. * gnu/packages/patches/clang-18.0-libc-search-path.patch: New file. * gnu/local.mk (dist_patch_DATA): Register it. Change-Id: I4027065398300104c6a310187007448f5b2780c1 --- gnu/packages/llvm.scm | 56 ++++++++++++-- .../patches/clang-18.0-libc-search-path.patch | 90 ++++++++++++++++++++++ 2 files changed, 139 insertions(+), 7 deletions(-) create mode 100644 gnu/packages/patches/clang-18.0-libc-search-path.patch (limited to 'gnu/packages') diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm index 2b8e8d6215..08ffb017a0 100644 --- a/gnu/packages/llvm.scm +++ b/gnu/packages/llvm.scm @@ -145,12 +145,17 @@ as \"x86_64-linux\"." (llvm-monorepo (package-version llvm)))) (build-system cmake-build-system) (native-inputs - (if (version>=? version "15") - ;; TODO: Remove this when GCC 12 is the default. - ;; libfuzzer fails to build with GCC 11 - (modify-inputs (package-native-inputs llvm) - (prepend gcc-12)) - (package-native-inputs llvm))) + (cond ((version>=? version "18") + ;; TODO: Remove this when GCC 13 is the default. + ;; libfuzzer fails to build with GCC 12 + (modify-inputs (package-native-inputs llvm) + (prepend gcc-13))) + ((version>=? version "15") + ;; TODO: Remove this when GCC 12 is the default. + ;; libfuzzer fails to build with GCC 11 + (modify-inputs (package-native-inputs llvm) + (prepend gcc-12))) + (else (package-native-inputs llvm)))) (inputs (append (list llvm) @@ -544,13 +549,16 @@ output), and Binutils.") '(("14.0.6" . "14f8nlvnmdkp9a9a79wv67jbmafvabczhah8rwnqrgd5g3hfxxxx") ("15.0.7" . "12sggw15sxq1krh1mfk3c1f07h895jlxbcifpwk3pznh4m1rjfy2") ("16.0.6" . "0jxmapg7shwkl88m4mqgfjv4ziqdmnppxhjz6vz51ycp2x4nmjky") - ("17.0.6" . "1a7rq3rgw5vxm8y39fyzr4kv7w97lli4a0c1qrkchwk8p0n07hgh"))) + ("17.0.6" . "1a7rq3rgw5vxm8y39fyzr4kv7w97lli4a0c1qrkchwk8p0n07hgh") + ("18.1.2" . "06nfbn8yj8c65q4vamwdiqpxh0dggs6w781swd3285k4af0qwf62"))) (define %llvm-patches '(("14.0.6" . ("clang-14.0-libc-search-path.patch")) ("15.0.7" . ("clang-15.0-libc-search-path.patch")) ("16.0.6" . ("clang-16.0-libc-search-path.patch")) ("17.0.6" . ("clang-17.0-libc-search-path.patch" + "clang-17.0-link-dsymutil-latomic.patch")) + ("18.1.2" . ("clang-18.0-libc-search-path.patch" "clang-17.0-link-dsymutil-latomic.patch")))) (define (llvm-monorepo version) @@ -1443,6 +1451,40 @@ Library.") (define-public clang-toolchain-17 (make-clang-toolchain clang-17 libomp-17)) +(define-public llvm-18 + (package + (inherit llvm-15) + (version "18.1.2") + (source (llvm-monorepo version)))) + +(define-public clang-runtime-18 + (clang-runtime-from-llvm llvm-18)) + +(define-public clang-18 + (clang-from-llvm + llvm-18 clang-runtime-18 + #:tools-extra + (origin + (method url-fetch) + (uri (llvm-uri "clang-tools-extra" + (package-version llvm-18))) + (sha256 + (base32 + "1whpd7szjy6i95gzy9jzf154dgk2jdbsp753sv2dx4lg9a9chkcc"))))) + +(define-public libomp-18 + (package + (inherit libomp-15) + (version (package-version llvm-18)) + (source (llvm-monorepo version)) + (native-inputs + (modify-inputs (package-native-inputs libomp-15) + (replace "clang" clang-18) + (replace "llvm" llvm-18))))) + +(define-public clang-toolchain-18 + (make-clang-toolchain clang-18 libomp-18)) + ;; Default LLVM and Clang version. (define-public libomp libomp-13) (define-public llvm llvm-13) diff --git a/gnu/packages/patches/clang-18.0-libc-search-path.patch b/gnu/packages/patches/clang-18.0-libc-search-path.patch new file mode 100644 index 0000000000..e3c673bf80 --- /dev/null +++ b/gnu/packages/patches/clang-18.0-libc-search-path.patch @@ -0,0 +1,90 @@ +Clang attempts to guess file names based on the OS and distro (yes!), +but unfortunately, that doesn't work for us. + +This patch makes it easy to insert libc's $libdir so that Clang passes the +correct absolute file name of crt1.o etc. to 'ld'. It also disables all +the distro-specific stuff and removes the hard-coded FHS directory names +to make sure Clang also works on foreign distros. + +diff --git a/clang/lib/Driver/Distro.cpp b/clang/lib/Driver/Distro.cpp +index a7e7f169dc14..0564003352a4 100644 +--- a/clang/lib/Driver/Distro.cpp ++++ b/clang/lib/Driver/Distro.cpp +@@ -100,6 +100,10 @@ static Distro::DistroType DetectLsbRelease(llvm::vfs::FileSystem &VFS) { + } + + static Distro::DistroType DetectDistro(llvm::vfs::FileSystem &VFS) { ++ // The compiler should always behave the same, even when used via Guix on a ++ // foreign distro. ++ return Distro::UnknownDistro; ++ + Distro::DistroType Version = Distro::UnknownDistro; + + // Newer freedesktop.org's compilant systemd-based systems +diff --git a/clang/lib/Driver/ToolChains/Cuda.cpp b/clang/lib/Driver/ToolChains/Cuda.cpp +index 1462576ca870..1078dba8f481 100644 +--- a/clang/lib/Driver/ToolChains/Cuda.cpp ++++ b/clang/lib/Driver/ToolChains/Cuda.cpp +@@ -132,6 +132,9 @@ CudaInstallationDetector::CudaInstallationDetector( + const Driver &D, const llvm::Triple &HostTriple, + const llvm::opt::ArgList &Args) + : D(D) { ++ // Don't look for CUDA in /usr. ++ return; ++ + struct Candidate { + std::string Path; + bool StrictChecking; +diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp +index 4300a2bdff17..ac3b29d0fc13 100644 +--- a/clang/lib/Driver/ToolChains/Linux.cpp ++++ b/clang/lib/Driver/ToolChains/Linux.cpp +@@ -224,6 +224,10 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) + + Generic_GCC::PushPPaths(PPaths); + ++ // Comment out the distro-specific tweaks so that they don't bite when ++ // using Guix on a foreign distro. ++#if 0 ++ + Distro Distro(D.getVFS(), Triple); + + if (Distro.IsAlpineLinux() || Triple.isAndroid()) { +@@ -284,6 +288,7 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) + + #ifdef ENABLE_LINKER_BUILD_ID + ExtraOpts.push_back("--build-id"); ++#endif + #endif + + // The selection of paths to try here is designed to match the patterns which +@@ -305,6 +310,7 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) + } + Generic_GCC::AddMultilibPaths(D, SysRoot, OSLibDir, MultiarchTriple, Paths); + ++#if 0 + addPathIfExists(D, concat(SysRoot, "/lib", MultiarchTriple), Paths); + addPathIfExists(D, concat(SysRoot, "/lib/..", OSLibDir), Paths); + +@@ -333,11 +339,21 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) + addPathIfExists(D, concat(SysRoot, "/", OSLibDir, ABIName), Paths); + addPathIfExists(D, concat(SysRoot, "/usr", OSLibDir, ABIName), Paths); + } ++#endif + + Generic_GCC::AddMultiarchPaths(D, SysRoot, OSLibDir, Paths); + ++#if 0 + addPathIfExists(D, concat(SysRoot, "/lib"), Paths); + addPathIfExists(D, concat(SysRoot, "/usr/lib"), Paths); ++#endif ++ ++ // Add libc's lib/ directory to the search path, so that crt1.o, crti.o, ++ // and friends can be found. ++ addPathIfExists(D, "@GLIBC_LIBDIR@", Paths); ++ ++ // Add GCC's lib/ directory so libstdc++.so can be found. ++ addPathIfExists(D, GCCInstallation.getParentLibPath(), Paths); + } + + ToolChain::RuntimeLibType Linux::GetDefaultRuntimeLibType() const { -- cgit v1.2.3