From 514b00cf08702b31cdf873a798f1ff100d4f2cf7 Mon Sep 17 00:00:00 2001 From: Emily Date: Fri, 18 Oct 2024 16:05:43 +0100 Subject: [PATCH] clang: skip the `-nostdlibinc` patch on Darwin --- pkgs/build-support/cc-wrapper/add-flags.sh | 5 ----- .../compilers/llvm/common/clang/default.nix | 18 +++++++++++------- .../compilers/llvm/common/default.nix | 18 +++++++++++++++++- pkgs/stdenv/darwin/default.nix | 11 +++++++++++ 4 files changed, 39 insertions(+), 13 deletions(-) diff --git a/pkgs/build-support/cc-wrapper/add-flags.sh b/pkgs/build-support/cc-wrapper/add-flags.sh index cd5396f45f8b..838b963ead7b 100644 --- a/pkgs/build-support/cc-wrapper/add-flags.sh +++ b/pkgs/build-support/cc-wrapper/add-flags.sh @@ -95,11 +95,6 @@ if [ "@darwinMinVersion@" ]; then # xcbuild needs `SDKROOT` to be the name of the SDK, which it sets in its own wrapper, # but compilers expect it to point to the absolute path. SDKROOT="$DEVELOPER_DIR/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk" - - # Set up various library paths since compilers may not support (or may have disabled) finding them in the sysroot. - NIX_CFLAGS_COMPILE_BEFORE_@suffixSalt@+=" -isysroot $SDKROOT" - NIX_CFLAGS_COMPILE_@suffixSalt@+=" -idirafter $SDKROOT/usr/include" - NIX_CFLAGS_COMPILE_@suffixSalt@+=" -iframework $SDKROOT/System/Library/Frameworks" fi # That way forked processes will not extend these environment variables again. diff --git a/pkgs/development/compilers/llvm/common/clang/default.nix b/pkgs/development/compilers/llvm/common/clang/default.nix index 5c9662c24d58..4bf30400832a 100644 --- a/pkgs/development/compilers/llvm/common/clang/default.nix +++ b/pkgs/development/compilers/llvm/common/clang/default.nix @@ -81,13 +81,17 @@ let # Make sure clang passes the correct location of libLTO to ld64 substituteInPlace lib/Driver/ToolChains/Darwin.cpp \ --replace-fail 'StringRef P = llvm::sys::path::parent_path(D.Dir);' 'StringRef P = "${lib.getLib libllvm}";' - '' + (if lib.versionOlder release_version "13" then '' - sed -i -e 's/DriverArgs.hasArg(options::OPT_nostdlibinc)/true/' \ - -e 's/Args.hasArg(options::OPT_nostdlibinc)/true/' \ - lib/Driver/ToolChains/*.cpp - '' else '' - (cd tools && ln -s ../../clang-tools-extra extra) - '') + lib.optionalString stdenv.hostPlatform.isMusl '' + '' + ( + # See the comment on the `add-nostdlibinc-flag.patch` patch in + # `../default.nix` for why we skip Darwin here. + if lib.versionOlder release_version "13" && (!stdenv.hostPlatform.isDarwin || !stdenv.targetPlatform.isDarwin) then '' + sed -i -e 's/DriverArgs.hasArg(options::OPT_nostdlibinc)/true/' \ + -e 's/Args.hasArg(options::OPT_nostdlibinc)/true/' \ + lib/Driver/ToolChains/*.cpp + '' else '' + (cd tools && ln -s ../../clang-tools-extra extra) + '' + ) + lib.optionalString stdenv.hostPlatform.isMusl '' sed -i -e 's/lgcc_s/lgcc_eh/' lib/Driver/ToolChains/*.cpp ''; diff --git a/pkgs/development/compilers/llvm/common/default.nix b/pkgs/development/compilers/llvm/common/default.nix index eaba6f45edfe..c3a98c1f063f 100644 --- a/pkgs/development/compilers/llvm/common/default.nix +++ b/pkgs/development/compilers/llvm/common/default.nix @@ -529,8 +529,24 @@ let # mis-compilation in firefox. # See: https://bugzilla.mozilla.org/show_bug.cgi?id=1741454 (metadata.getVersionFile "clang/revert-malloc-alignment-assumption.patch") + # This patch prevents global system header directories from + # leaking through on non‐NixOS Linux. However, on macOS, the + # SDK path is used as the sysroot, and forcing `-nostdlibinc` + # breaks `-isysroot` with an unwrapped compiler. As macOS has + # no `/usr/include`, there’s essentially no risk to skipping + # the patch there. It’s possible that Homebrew headers in + # `/usr/local/include` might leak through to unwrapped + # compilers being used without an SDK set or something, but + # it hopefully shouldn’t matter. + # + # TODO: Figure out a better solution to this whole problem so + # that we won’t have to choose between breaking unwrapped + # compilers breaking libclang when we can do Linux‐to‐Darwin + # cross‐compilation again. + ++ lib.optional ( + !args.stdenv.hostPlatform.isDarwin || !args.stdenv.targetPlatform.isDarwin + ) ./clang/add-nostdlibinc-flag.patch ++ [ - ./clang/add-nostdlibinc-flag.patch (substituteAll { src = if (lib.versionOlder metadata.release_version "16") then diff --git a/pkgs/stdenv/darwin/default.nix b/pkgs/stdenv/darwin/default.nix index 5a3ef15e392d..070d5ec23851 100644 --- a/pkgs/stdenv/darwin/default.nix +++ b/pkgs/stdenv/darwin/default.nix @@ -133,6 +133,17 @@ let ln -s "${compiler-rt.out}/lib" "$rsrc/lib" ln -s "${compiler-rt.out}/share" "$rsrc/share" echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags + '' + + lib.optionalString (isFromBootstrapFiles prevStage.llvmPackages.clang-unwrapped) '' + # Work around the `-nostdlibinc` patch in the bootstrap tools. + # TODO: Remove after the bootstrap tools have been updated. + substituteAll ${builtins.toFile "add-flags-extra.sh" '' + if [ "@darwinMinVersion@" ]; then + NIX_CFLAGS_COMPILE_@suffixSalt@+=" -idirafter $SDKROOT/usr/include" + NIX_CFLAGS_COMPILE_@suffixSalt@+=" -iframework $SDKROOT/System/Library/Frameworks" + fi + ''} add-flags-extra.sh + cat add-flags-extra.sh >> $out/nix-support/add-flags.sh ''; cc = prevStage.llvmPackages.clang-unwrapped;