From eef2c762ce19c8cf7172b319a7f4cd5555b5f289 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Na=C3=AFm=20Favier?= Date: Sun, 29 May 2022 17:26:23 +0200 Subject: [PATCH] makeBinaryWrapper: fix cross-compilation and add test Fixes https://github.com/NixOS/nixpkgs/issues/175045 --- .../make-binary-wrapper/default.nix | 5 +- pkgs/test/make-binary-wrapper/cross.nix | 23 ++++++++ pkgs/test/make-binary-wrapper/default.nix | 58 ++++++++++--------- 3 files changed, 58 insertions(+), 28 deletions(-) create mode 100644 pkgs/test/make-binary-wrapper/cross.nix diff --git a/pkgs/build-support/setup-hooks/make-binary-wrapper/default.nix b/pkgs/build-support/setup-hooks/make-binary-wrapper/default.nix index 34bed3bb297..9f52a05f61c 100644 --- a/pkgs/build-support/setup-hooks/make-binary-wrapper/default.nix +++ b/pkgs/build-support/setup-hooks/make-binary-wrapper/default.nix @@ -1,10 +1,11 @@ { stdenv +, targetPackages , lib , makeSetupHook , dieHook , writeShellScript , tests -, cc ? stdenv.cc +, cc ? targetPackages.stdenv.cc , sanitizers ? [] }: @@ -14,7 +15,7 @@ makeSetupHook { ++ lib.optional (stdenv.isDarwin && stdenv.isAarch64) cc; substitutions = { - cc = "${cc}/bin/cc ${lib.escapeShellArgs (map (s: "-fsanitize=${s}") sanitizers)}"; + cc = "${cc}/bin/${cc.targetPrefix}cc ${lib.escapeShellArgs (map (s: "-fsanitize=${s}") sanitizers)}"; # Extract the function call used to create a binary wrapper from its embedded docstring passthru.extractCmd = writeShellScript "extract-binary-wrapper-cmd" '' diff --git a/pkgs/test/make-binary-wrapper/cross.nix b/pkgs/test/make-binary-wrapper/cross.nix new file mode 100644 index 00000000000..36758086b92 --- /dev/null +++ b/pkgs/test/make-binary-wrapper/cross.nix @@ -0,0 +1,23 @@ +{ stdenv +, runCommand +, makeBinaryWrapper +, binutils +, expectedArch ? stdenv.hostPlatform.parsed.cpu.name +}: + +runCommand "make-binary-wrapper-test-cross" { + nativeBuildInputs = [ + makeBinaryWrapper + binutils + ]; + inherit expectedArch; +} '' + touch prog + chmod +x prog + makeWrapper prog $out + read -r _ arch < <($READELF --file-header $out | grep Machine:) + if [[ ''${arch,,} != *"''${expectedArch,,}"* ]]; then + echo "expected $expectedArch, got $arch" + exit 1 + fi +'' diff --git a/pkgs/test/make-binary-wrapper/default.nix b/pkgs/test/make-binary-wrapper/default.nix index 2d3389c4a01..afc2b41ff5a 100644 --- a/pkgs/test/make-binary-wrapper/default.nix +++ b/pkgs/test/make-binary-wrapper/default.nix @@ -1,12 +1,19 @@ -{ lib, coreutils, python3, gcc, writeText, writeScript, runCommand, makeBinaryWrapper }: +{ lib +, stdenv +, pkgsCross +, makeBinaryWrapper +, writeText +, runCommand +, runCommandCC +}: let - env = { buildInputs = [ makeBinaryWrapper ]; }; - envCheck = runCommand "envcheck" env '' - ${gcc}/bin/cc -Wall -Werror -Wpedantic -o $out ${./envcheck.c} + env = { nativeBuildInputs = [ makeBinaryWrapper ]; }; + envCheck = runCommandCC "envcheck" env '' + cc -Wall -Werror -Wpedantic -o $out ${./envcheck.c} ''; - makeGoldenTest = testname: runCommand "test-wrapper_${testname}" env '' - mkdir -p ./tmp/foo + makeGoldenTest = testname: runCommand "make-binary-wrapper-test-${testname}" env '' + mkdir -p tmp/foo # for the chdir test params=$(<"${./.}/${testname}.cmdline") eval "makeCWrapper /send/me/flags $params" > wrapper.c @@ -32,24 +39,23 @@ let cp wrapper.c $out ''; - tests = let - names = [ - "add-flags" - "argv0" - "basic" - "chdir" - "combination" - "env" - "inherit-argv0" - "invalid-env" - "prefix" - "suffix" - "overlength-strings" - ]; - f = name: lib.nameValuePair name (makeGoldenTest name); - in builtins.listToAttrs (builtins.map f names); -in writeText "make-binary-wrapper-test" '' - ${lib.concatStringsSep "\n" (lib.mapAttrsToList (_: test: '' - "${test.name}" "${test}" - '') tests)} + tests = lib.genAttrs [ + "add-flags" + "argv0" + "basic" + "chdir" + "combination" + "env" + "inherit-argv0" + "invalid-env" + "overlength-strings" + "prefix" + "suffix" + ] makeGoldenTest // lib.optionalAttrs (! stdenv.isDarwin) { + cross = pkgsCross.aarch64-multiplatform.callPackage ./cross.nix { }; + }; +in + +writeText "make-binary-wrapper-tests" '' + ${lib.concatStringsSep "\n" (builtins.attrValues tests)} '' // tests