From 1174f3030c205ea654eb3e74e53ddf797493db30 Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Sat, 18 Sep 2021 13:18:07 +0200 Subject: [PATCH 1/2] python3: fix NIX_LDFLAGS logic * Only try to link libgcc if GCC is actually used * Link libgcc depending on libc (glibc vs. musl), rather than Linux/musl vs. Linux/!musl This is a step towards fixing pkgsLLVM.python3. --- pkgs/development/interpreters/python/cpython/default.nix | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkgs/development/interpreters/python/cpython/default.nix b/pkgs/development/interpreters/python/cpython/default.nix index 353535ed6823..6f373609fb26 100644 --- a/pkgs/development/interpreters/python/cpython/default.nix +++ b/pkgs/development/interpreters/python/cpython/default.nix @@ -286,7 +286,10 @@ in with passthru; stdenv.mkDerivation { CPPFLAGS = concatStringsSep " " (map (p: "-I${getDev p}/include") buildInputs); LDFLAGS = concatStringsSep " " (map (p: "-L${getLib p}/lib") buildInputs); LIBS = "${optionalString (!stdenv.isDarwin) "-lcrypt"} ${optionalString (ncurses != null) "-lncurses"}"; - NIX_LDFLAGS = optionalString (stdenv.isLinux && !stdenv.hostPlatform.isMusl) "-lgcc_s" + optionalString stdenv.hostPlatform.isMusl "-lgcc_eh"; + NIX_LDFLAGS = lib.optionalString stdenv.cc.isGNU ({ + "glibc" = "-lgcc_s"; + "musl" = "-lgcc_eh"; + }."${stdenv.hostPlatform.libc}" or ""); # Determinism: We fix the hashes of str, bytes and datetime objects. PYTHONHASHSEED=0; From 11fe2fc3cfccb95f7b99f2a2d1096c851868e582 Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Fri, 17 Sep 2021 16:59:12 +0200 Subject: [PATCH 2/2] stdenv: move --enable-deterministic-archives flag into GNU wrapper `--enable-deterministic-archives` is a GNU specific strip flag and causes other strip implementations (for example LLVM's, see #138013) to fail. Since strip failures are ignored, this means that stripping doesn't work at all in certain situation (causing unnecessary dependencies etc.). To fix this, no longer pass `--enable-deterministic-archives` unconditionally, but instead add it in a GNU binutils specific strip wrapper only. `commonStripFlags` was only used for this flag, so we can remove it altogether. Future work could be to make a generic strip wrapper, with support for nix-support/strip-flags-{before,after} and NIX_STRIP_FLAGS_{BEFORE,AFTER}. This possibly overkill and unnecessary though -- also with the additional challenge of incorporating the darwin strip wrapper somehow. --- pkgs/build-support/bintools-wrapper/default.nix | 10 ++++++++++ .../bintools-wrapper/gnu-binutils-strip-wrapper.sh | 4 ++++ pkgs/build-support/setup-hooks/strip.sh | 2 +- pkgs/stdenv/linux/default.nix | 7 +------ 4 files changed, 16 insertions(+), 7 deletions(-) create mode 100644 pkgs/build-support/bintools-wrapper/gnu-binutils-strip-wrapper.sh diff --git a/pkgs/build-support/bintools-wrapper/default.nix b/pkgs/build-support/bintools-wrapper/default.nix index 3d64639d33fa..53f367b9b84d 100644 --- a/pkgs/build-support/bintools-wrapper/default.nix +++ b/pkgs/build-support/bintools-wrapper/default.nix @@ -324,6 +324,16 @@ stdenv.mkDerivation { echo "-arch ${targetPlatform.darwinArch}" >> $out/nix-support/libc-ldflags '' + ## + ## GNU specific extra strip flags + ## + + # TODO(@sternenseemann): make a generic strip wrapper? + + optionalString (bintools.isGNU or false) '' + wrap ${targetPrefix}strip ${./gnu-binutils-strip-wrapper.sh} \ + "${bintools_bin}/bin/${targetPrefix}strip" + '' + ### ### Remove LC_UUID ### diff --git a/pkgs/build-support/bintools-wrapper/gnu-binutils-strip-wrapper.sh b/pkgs/build-support/bintools-wrapper/gnu-binutils-strip-wrapper.sh new file mode 100644 index 000000000000..5b5136e3d14c --- /dev/null +++ b/pkgs/build-support/bintools-wrapper/gnu-binutils-strip-wrapper.sh @@ -0,0 +1,4 @@ +#! @shell@ +# shellcheck shell=bash + +exec @prog@ --enable-deterministic-archives "$@" diff --git a/pkgs/build-support/setup-hooks/strip.sh b/pkgs/build-support/setup-hooks/strip.sh index c31a50eba57b..2d8e66a89fa3 100644 --- a/pkgs/build-support/setup-hooks/strip.sh +++ b/pkgs/build-support/setup-hooks/strip.sh @@ -51,7 +51,7 @@ stripDirs() { if [ -n "${dirs}" ]; then header "stripping (with command $cmd and flags $stripFlags) in$dirs" - find $dirs -type f -exec $cmd $commonStripFlags $stripFlags '{}' \; 2>/dev/null + find $dirs -type f -exec $cmd $stripFlags '{}' \; 2>/dev/null stopNest fi } diff --git a/pkgs/stdenv/linux/default.nix b/pkgs/stdenv/linux/default.nix index 1fbd3cba27ef..d2c74f7722d3 100644 --- a/pkgs/stdenv/linux/default.nix +++ b/pkgs/stdenv/linux/default.nix @@ -375,12 +375,7 @@ in targetPlatform = localSystem; inherit config; - preHook = '' - # Make "strip" produce deterministic output, by setting - # timestamps etc. to a fixed value. - commonStripFlags="--enable-deterministic-archives" - ${commonPreHook} - ''; + preHook = commonPreHook; initialPath = ((import ../common-path.nix) {pkgs = prevStage;});