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