1{
2 lib,
3 stdenv,
4 pkgsCross,
5 makeBinaryWrapper,
6 writeText,
7 runCommand,
8 runCommandCC,
9}:
10
11let
12 env = {
13 nativeBuildInputs = [ makeBinaryWrapper ];
14 };
15 envCheck = runCommandCC "envcheck" env ''
16 cc -Wall -Werror -Wpedantic -o $out ${./envcheck.c}
17 '';
18 makeGoldenTest =
19 testname:
20 runCommand "make-binary-wrapper-test-${testname}" env ''
21 mkdir -p tmp/foo # for the chdir test
22
23 source=${./. + "/${testname}"}
24
25 params=$(<"$source/${testname}.cmdline")
26 eval "makeCWrapper /send/me/flags $params" > wrapper.c
27
28 diff wrapper.c "$source/${testname}.c"
29
30 if [ -f "$source/${testname}.env" ]; then
31 eval "makeWrapper ${envCheck} wrapped $params"
32 env -i ./wrapped > env.txt
33 sed "s#SUBST_ARGV0#${envCheck}#;s#SUBST_CWD#$PWD#" \
34 "$source/${testname}.env" > golden-env.txt
35 if ! diff env.txt golden-env.txt; then
36 echo "env/argv should be:"
37 cat golden-env.txt
38 echo "env/argv output is:"
39 cat env.txt
40 exit 1
41 fi
42 else
43 # without a golden env, we expect the wrapper compilation to fail
44 ! eval "makeWrapper ${envCheck} wrapped $params" &> error.txt
45 fi
46
47 cp wrapper.c $out
48 '';
49 tests =
50 lib.genAttrs [
51 "add-flags"
52 "argv0"
53 "basic"
54 "chdir"
55 "combination"
56 "env"
57 "inherit-argv0"
58 "invalid-env"
59 "overlength-strings"
60 "prefix"
61 "suffix"
62 ] makeGoldenTest
63 // lib.optionalAttrs (!stdenv.hostPlatform.isDarwin) {
64 cross =
65 pkgsCross.${if stdenv.buildPlatform.isAarch64 then "gnu64" else "aarch64-multiplatform"}.callPackage
66 ./cross.nix
67 { };
68 };
69in
70
71writeText "make-binary-wrapper-tests" ''
72 ${lib.concatStringsSep "\n" (builtins.attrValues tests)}
73''
74// tests