104 lines
2.7 KiB
Nix
104 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;
|
|
}
|