guix/gnu/packages/patches/clang-13.0-libc-search-path.patch
Ricardo Wurmus e742437211
gnu: Add llvm-13.
* gnu/packages/llvm.scm (llvm-13, clang-runtime-13, clang-13,
clang-toolchain-13): New variables.
(llvm-12): Inherit from llvm-13.
* gnu/packages/patches/clang-13.0-libc-search-path.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
2021-12-27 13:21:05 +01:00

97 lines
3.4 KiB
Diff

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/lib/Driver/Distro.cpp b/lib/Driver/Distro.cpp
index ee4fe841..f0313bbe 100644
--- a/lib/Driver/Distro.cpp
+++ b/lib/Driver/Distro.cpp
@@ -93,6 +93,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/lib/Driver/ToolChains/Cuda.cpp b/lib/Driver/ToolChains/Cuda.cpp
index d14776c5..88bc3ccd 100644
--- a/lib/Driver/ToolChains/Cuda.cpp
+++ b/lib/Driver/ToolChains/Cuda.cpp
@@ -119,6 +119,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/lib/Driver/ToolChains/Linux.cpp b/lib/Driver/ToolChains/Linux.cpp
--- a/lib/Driver/ToolChains/Linux.cpp
+++ b/lib/Driver/ToolChains/Linux.cpp
@@ -186,6 +186,10 @@
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()) {
@@ -251,6 +255,7 @@
if (IsAndroid || Distro.IsOpenSUSE())
ExtraOpts.push_back("--enable-new-dtags");
+#endif
// The selection of paths to try here is designed to match the patterns which
// the GCC driver itself uses, as this is part of the GCC-compatible driver.
@@ -264,6 +269,7 @@
Generic_GCC::AddMultilibPaths(D, SysRoot, OSLibDir, MultiarchTriple, Paths);
+#if 0
addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
@@ -295,9 +301,11 @@
addPathIfExists(D, SysRoot + "/" + OSLibDir + "/" + ABIName, Paths);
addPathIfExists(D, SysRoot + "/usr/" + OSLibDir + "/" + ABIName, Paths);
}
+#endif
Generic_GCC::AddMultiarchPaths(D, SysRoot, OSLibDir, Paths);
+#if 0
// Similar to the logic for GCC above, if we are currently running Clang
// inside of the requested system root, add its parent library path to those
// searched.
@@ -305,9 +313,14 @@
// directory ('Dir' below) or the ResourceDir.
if (StringRef(D.Dir).startswith(SysRoot))
addPathIfExists(D, D.Dir + "/../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);
- addPathIfExists(D, SysRoot + "/lib", Paths);
- addPathIfExists(D, SysRoot + "/usr/lib", Paths);
+ // Add GCC's lib/ directory so libstdc++.so can be found.
+ addPathIfExists(D, GCCInstallation.getParentLibPath(), Paths);
}
ToolChain::RuntimeLibType Linux::GetDefaultRuntimeLibType() const {