From 3104da40851eb23a52275fd082a8fab2147e2a94 Mon Sep 17 00:00:00 2001 From: Tobias Bergkvist Date: Fri, 10 Dec 2021 16:26:08 +0100 Subject: [PATCH 1/5] makeBinaryWrapper: Switch from stdenv.cc.cc to stdenv.cc "${stdenv.cc.cc}/bin" does not contain a cc-symlink, since this is the unwrapped version of the compiler - however "${stdenv.cc}/bin" does. --- pkgs/top-level/all-packages.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index a6d79f5cc134..a6f1f8f4d28c 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -699,7 +699,7 @@ with pkgs; makeSetupHook { deps = [ dieHook ]; } script; in lib.makeOverridable f { - cc = stdenv.cc.cc; + cc = stdenv.cc; sanitizers = [ "undefined" "address" ]; }; From f7b5083cb6f175834dc6dfc49c78cedb90eb0b0b Mon Sep 17 00:00:00 2001 From: Tobias Bergkvist Date: Fri, 10 Dec 2021 19:41:18 +0100 Subject: [PATCH 2/5] makeBinaryWrapper: Make tests discoverable to OfBorg Move makeBinaryWrapper tests to pkgs.makeBinaryWrapper.passthru.tests, since OfBorg doesn't discover/skips the tests in the previous location. --- pkgs/test/default.nix | 2 -- pkgs/top-level/all-packages.nix | 5 ++++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pkgs/test/default.nix b/pkgs/test/default.nix index b73617daa895..e3ef7839c4b4 100644 --- a/pkgs/test/default.nix +++ b/pkgs/test/default.nix @@ -35,8 +35,6 @@ with pkgs; macOSSierraShared = callPackage ./macos-sierra-shared {}; - make-binary-wrapper = callPackage ./make-binary-wrapper { inherit makeBinaryWrapper; }; - cross = callPackage ./cross {}; php = recurseIntoAttrs (callPackages ./php {}); diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index a6f1f8f4d28c..5f0beb6df04c 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -696,7 +696,10 @@ with pkgs; --replace " @CC@ " " ${cc}/bin/cc ${san} " ''; in - makeSetupHook { deps = [ dieHook ]; } script; + makeSetupHook { + deps = [ dieHook ]; + substitutions.passthru.tests = callPackage ../test/make-binary-wrapper { inherit makeBinaryWrapper; }; + } script; in lib.makeOverridable f { cc = stdenv.cc; From 228d451e0388118572e4113afbf34ea2eaf3f55f Mon Sep 17 00:00:00 2001 From: Tobias Bergkvist Date: Fri, 10 Dec 2021 21:21:14 +0100 Subject: [PATCH 3/5] makeBinaryWrapper: Fix chdir golden test for darwin On macOS, /tmp is a symlink to /private/tmp. When performing cd /tmp, and checking cwd - it won't match since it follows the symlink. This caused test breakage on macOS but not Linux. Instead, use a folder which is not a symlink, and consistent across Linux and macOS. --- pkgs/test/make-binary-wrapper/chdir.c | 2 +- pkgs/test/make-binary-wrapper/chdir.cmdline | 2 +- pkgs/test/make-binary-wrapper/chdir.env | 2 +- pkgs/test/make-binary-wrapper/default.nix | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/test/make-binary-wrapper/chdir.c b/pkgs/test/make-binary-wrapper/chdir.c index c67c695b1c3b..9e0b7e2c7f52 100644 --- a/pkgs/test/make-binary-wrapper/chdir.c +++ b/pkgs/test/make-binary-wrapper/chdir.c @@ -5,7 +5,7 @@ #define assert_success(e) do { if ((e) < 0) { perror(#e); abort(); } } while (0) int main(int argc, char **argv) { - assert_success(chdir("/tmp/foo")); + assert_success(chdir("./tmp/foo")); argv[0] = "/send/me/flags"; return execv("/send/me/flags", argv); } diff --git a/pkgs/test/make-binary-wrapper/chdir.cmdline b/pkgs/test/make-binary-wrapper/chdir.cmdline index 15235f20621c..d6ab081e8d35 100644 --- a/pkgs/test/make-binary-wrapper/chdir.cmdline +++ b/pkgs/test/make-binary-wrapper/chdir.cmdline @@ -1 +1 @@ - --chdir /tmp/foo + --chdir ./tmp/foo diff --git a/pkgs/test/make-binary-wrapper/chdir.env b/pkgs/test/make-binary-wrapper/chdir.env index db129d68af74..ea1c61054e50 100644 --- a/pkgs/test/make-binary-wrapper/chdir.env +++ b/pkgs/test/make-binary-wrapper/chdir.env @@ -1,2 +1,2 @@ -CWD=/tmp/foo +CWD=SUBST_CWD/tmp/foo SUBST_ARGV0 diff --git a/pkgs/test/make-binary-wrapper/default.nix b/pkgs/test/make-binary-wrapper/default.nix index c5bb6970aac0..7b4d0b26b5cc 100644 --- a/pkgs/test/make-binary-wrapper/default.nix +++ b/pkgs/test/make-binary-wrapper/default.nix @@ -6,7 +6,7 @@ let ${gcc}/bin/cc -Wall -Werror -Wpedantic -o $out ${./envcheck.c} ''; makeGoldenTest = testname: runCommand "test-wrapper_${testname}" env '' - mkdir -p /tmp/foo + mkdir -p ./tmp/foo params=$(<"${./.}/${testname}.cmdline") eval "makeCWrapper /send/me/flags $params" > wrapper.c From d5435990b003a1c5279beaa9bdda5b5dd9724124 Mon Sep 17 00:00:00 2001 From: Tobias Bergkvist Date: Thu, 16 Dec 2021 21:23:16 +0100 Subject: [PATCH 4/5] makeBinaryWrapper: Disable sanitizers by default outside of tests Although sanitizers can catch and prevent undefined behaviour during runtime, it has a significant impact on performance. They also cause issues on macOS where they can make compilation fail. The future goal is to instead utilize static analysis to prevent undefined behaviour as makeBinaryWrapper evolves. --- pkgs/top-level/all-packages.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 5f0beb6df04c..b9645f975b3b 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -703,7 +703,7 @@ with pkgs; in lib.makeOverridable f { cc = stdenv.cc; - sanitizers = [ "undefined" "address" ]; + sanitizers = [ ]; }; makeModulesClosure = { kernel, firmware, rootModules, allowMissing ? false }: From ebf46e57648aa93b8e0a38e73473133291a38120 Mon Sep 17 00:00:00 2001 From: Tobias Bergkvist Date: Thu, 16 Dec 2021 21:29:21 +0100 Subject: [PATCH 5/5] makeBinaryWrapper: Fix issues on aarch64-darwin/macOS 12 (Monterey) Sanitizers don't seem to be present on aarch64-darwin/macOS 12 (Monterey), so they are removed from the aarch64-darwin tests. Switching from nativeBuildInputs to buildInputs and adding cc to the deps list caused some strange error messages to go away. --- pkgs/test/make-binary-wrapper/default.nix | 2 +- pkgs/top-level/all-packages.nix | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/pkgs/test/make-binary-wrapper/default.nix b/pkgs/test/make-binary-wrapper/default.nix index 7b4d0b26b5cc..b5bbf994ffa3 100644 --- a/pkgs/test/make-binary-wrapper/default.nix +++ b/pkgs/test/make-binary-wrapper/default.nix @@ -1,7 +1,7 @@ { lib, coreutils, python3, gcc, writeText, writeScript, runCommand, makeBinaryWrapper }: let - env = { nativeBuildInputs = [ makeBinaryWrapper ]; }; + env = { buildInputs = [ makeBinaryWrapper ]; }; envCheck = runCommand "envcheck" env '' ${gcc}/bin/cc -Wall -Werror -Wpedantic -o $out ${./envcheck.c} ''; diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index b9645f975b3b..3755fd6bcd56 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -697,8 +697,15 @@ with pkgs; ''; in makeSetupHook { - deps = [ dieHook ]; - substitutions.passthru.tests = callPackage ../test/make-binary-wrapper { inherit makeBinaryWrapper; }; + deps = [ dieHook cc ]; + substitutions.passthru.tests = callPackage ../test/make-binary-wrapper { + makeBinaryWrapper = makeBinaryWrapper.override { + sanitizers = (if stdenv.isDarwin && stdenv.isAarch64 + then [ ] + else [ "undefined" "address" ] + ); + }; + }; } script; in lib.makeOverridable f {