97 lines
2.7 KiB
Nix
97 lines
2.7 KiB
Nix
|
# This is a test for autoPatchelfHook. To test it, we just need a simple binary
|
||
|
# which uses the hook. We took the derivation from tonelib-jam, which sounds
|
||
|
# like a good candidate with a small closure, and trimmed it down.
|
||
|
|
||
|
{ stdenv
|
||
|
, lib
|
||
|
, fetchurl
|
||
|
, autoPatchelfHook
|
||
|
, dpkg
|
||
|
, freetype
|
||
|
, curl
|
||
|
# This test checks that the behavior of autoPatchelfHook is correct whether
|
||
|
# __structuredAttrs
|
||
|
# (https://nixos.org/manual/nix/stable/language/advanced-attributes#adv-attr-structuredAttrs)
|
||
|
# is set or not. Hence __structuredAttrs is provided as a parameter.
|
||
|
, __structuredAttrs
|
||
|
}:
|
||
|
|
||
|
let runtimeDependencies = [
|
||
|
(lib.getLib curl)
|
||
|
"/some/dep"
|
||
|
"/some/other/dep"
|
||
|
]
|
||
|
# A dependency with space only works with __structuredAttrs set to true.
|
||
|
++ lib.lists.optional __structuredAttrs "/some/dep with space";
|
||
|
in
|
||
|
|
||
|
stdenv.mkDerivation {
|
||
|
name = "auto-patchelf-test";
|
||
|
|
||
|
src = fetchurl {
|
||
|
url = "https://tonelib.net/download/221222/ToneLib-Jam-amd64.deb";
|
||
|
sha256 = "sha256-c6At2lRPngQPpE7O+VY/Hsfw+QfIb3COIuHfbqqIEuM=";
|
||
|
};
|
||
|
|
||
|
unpackCmd = ''
|
||
|
dpkg -x $curSrc source
|
||
|
'';
|
||
|
|
||
|
nativeBuildInputs = [
|
||
|
dpkg
|
||
|
autoPatchelfHook
|
||
|
];
|
||
|
|
||
|
installPhase = ''
|
||
|
mv usr $out
|
||
|
'';
|
||
|
|
||
|
buildInputs = [
|
||
|
freetype
|
||
|
];
|
||
|
|
||
|
autoPatchelfIgnoreMissingDeps = [
|
||
|
"libGL.so.1"
|
||
|
"libasound.so.2"
|
||
|
];
|
||
|
|
||
|
inherit runtimeDependencies;
|
||
|
|
||
|
# Additional phase performing the actual test.
|
||
|
installCheckPhase =
|
||
|
let allDeps = runtimeDependencies ++ [ (lib.getLib freetype) ];
|
||
|
in
|
||
|
''
|
||
|
local binary="$out/bin/ToneLib-Jam"
|
||
|
local interpreter=$(patchelf --print-interpreter $binary)
|
||
|
local runpath=$(patchelf --print-rpath $binary)
|
||
|
local glibcStorePath="${stdenv.cc.libc}"
|
||
|
|
||
|
# Check that the glibc path is a prefix of the interpreter. If
|
||
|
# autoPatchelfHook ran correctly, the binary should have set the interpreter
|
||
|
# to point to the store.
|
||
|
echo "[auto-patchelf-hook-test]: Check that the interpreter is in the store"
|
||
|
test "''${interpreter#$glibcStorePath}" != "$interpreter"
|
||
|
|
||
|
readarray -td':' runpathArray < <(echo -n "$runpath")
|
||
|
|
||
|
echo "[auto-patchelf-hook-test]: Check that the runpath has the right number of entries"
|
||
|
test "''${#runpathArray[@]}" -eq ${builtins.toString (builtins.length allDeps)}
|
||
|
|
||
|
echo "[auto-patchelf-hook-test]: Check that the runpath contains the expected runtime deps"
|
||
|
''
|
||
|
+ lib.strings.concatStringsSep "\n"
|
||
|
(lib.lists.imap0
|
||
|
(i: path:
|
||
|
let iAsStr = builtins.toString i; in
|
||
|
''
|
||
|
echo "[auto-patchelf-hook-test]: Check that entry ${iAsStr} is ${path}"
|
||
|
test "''${paths[${iAsStr}]}" = "$path"
|
||
|
'')
|
||
|
allDeps
|
||
|
);
|
||
|
|
||
|
doInstallCheck = true;
|
||
|
inherit __structuredAttrs;
|
||
|
}
|