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 6e0087565941..c0a3ba7d7702 100644 --- a/clang/lib/Driver/Distro.cpp +++ b/clang/lib/Driver/Distro.cpp @@ -99,6 +99,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 3a577650eb08..ca3373edc127 100644 --- a/clang/lib/Driver/ToolChains/Cuda.cpp +++ b/clang/lib/Driver/ToolChains/Cuda.cpp @@ -128,6 +128,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 1ba222bf83b1..28766c5ab792 100644 --- a/clang/lib/Driver/ToolChains/Linux.cpp +++ b/clang/lib/Driver/ToolChains/Linux.cpp @@ -220,6 +220,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()) { @@ -280,6 +284,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 @@ -301,6 +306,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); @@ -329,11 +335,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 { uix/commit/tests/guix-authenticate.sh?id=b911d6547444b5f8d17b224bafa5ee1b5aafaff5'>authenticate: Encode strings as ISO-8859-1....Fixes <https://bugs.gnu.org/43421>. * guix/scripts/authenticate.scm (read-command): Decode strings as ISO-8859-1, not UTF-8. (guix-authenticate)[send-reply]: Encode strings as ISO-8859-1, not UTF-8. * tests/guix-authenticate.sh: Add test. Ludovic Courtès 2020-09-14daemon: Spawn 'guix authenticate' once for all....Previously, we'd spawn 'guix authenticate' once for each item that has to be signed (when exporting) or authenticated (when importing). Now, we spawn it once for all and then follow a request/reply protocol. This reduces the wall-clock time of: guix archive --export -r $(guix build coreutils -d) from 30s to 2s. * guix/scripts/authenticate.scm (sign-with-key): Return the signature instead of displaying it. Raise a &formatted-message instead of calling 'leave'. (validate-signature): Likewise. (read-command): New procedure. (define-enumerate-type, reply-code): New macros. (guix-authenticate)[send-reply]: New procedure. Change to read commands from current-input-port. * nix/libstore/local-store.cc (runAuthenticationProgram): Remove. (authenticationAgent, readInteger, readAuthenticateReply): New functions. (signHash, verifySignature): Rewrite in terms of the agent. * tests/store.scm ("import not signed"): Remove 'pk' call. ("import signed by unauthorized key"): Check the error message of C. * tests/guix-authenticate.sh: Rewrite using the new protocol. fixlet Ludovic Courtès 2020-09-11daemon: Simplify interface with 'guix authenticate'....There's no reason at this point to mimic the calling convention of the 'openssl' command. * nix/libstore/local-store.cc (LocalStore::exportPath): Add only "sign" and HASH to ARGS. Remove 'tmpDir' and 'hashFile'. (LocalStore::importPath): Add only "verify" and SIGNATURE to * guix/scripts/authenticate.scm (guix-authenticate): Adjust accordingly; remove the OpenSSL-style clauses. (read-hash-data): Remove. (sign-with-key): Replace 'port' with 'sha256' and adjust accordingly. (validate-signature): Export SIGNATURE to be a canonical sexp. * tests/guix-authenticate.sh: Adjust tests accordingly. Ludovic Courtès