makeBinaryWrapper: fix cross-compilation and add test

Fixes https://github.com/NixOS/nixpkgs/issues/175045
This commit is contained in:
Naïm Favier 2022-05-29 17:26:23 +02:00
parent 5db40e768d
commit eef2c762ce
No known key found for this signature in database
GPG key ID: 49B07322580B7EE2
3 changed files with 58 additions and 28 deletions

View file

@ -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" ''

View file

@ -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
''

View file

@ -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