Merge pull request #272752 from ConnorBaker/feat/autoPatchelf-support-structuredAttrs

auto-patchelf: add support for __structuredAttrs
This commit is contained in:
Connor Baker 2023-12-21 19:09:56 -05:00 committed by GitHub
commit dd4723bad7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 126 additions and 9 deletions

View File

@ -53,17 +53,30 @@ autoPatchelf() {
esac
done
readarray -td' ' ignoreMissingDepsArray < <(echo -n "$autoPatchelfIgnoreMissingDeps")
if [ "$autoPatchelfIgnoreMissingDeps" == "1" ]; then
echo "autoPatchelf: WARNING: setting 'autoPatchelfIgnoreMissingDeps" \
"= true;' is deprecated and will be removed in a future release." \
"Use 'autoPatchelfIgnoreMissingDeps = [ \"*\" ];' instead." >&2
ignoreMissingDepsArray=( "*" )
if [ -n "$__structuredAttrs" ]; then
local ignoreMissingDepsArray=( "${autoPatchelfIgnoreMissingDeps[@]}" )
local appendRunpathsArray=( "${appendRunpaths[@]}" )
local runtimeDependenciesArray=( "${runtimeDependencies[@]}" )
local patchelfFlagsArray=( "${patchelfFlags[@]}" )
else
readarray -td' ' ignoreMissingDepsArray < <(echo -n "$autoPatchelfIgnoreMissingDeps")
local appendRunpathsArray=($appendRunpaths)
local runtimeDependenciesArray=($runtimeDependencies)
local patchelfFlagsArray=($patchelfFlags)
fi
local appendRunpathsArray=($appendRunpaths)
local runtimeDependenciesArray=($runtimeDependencies)
local patchelfFlagsArray=($patchelfFlags)
# Check if ignoreMissingDepsArray contains "1" and if so, replace it with
# "*", printing a deprecation warning.
for dep in "${ignoreMissingDepsArray[@]}"; do
if [ "$dep" == "1" ]; then
echo "autoPatchelf: WARNING: setting 'autoPatchelfIgnoreMissingDeps" \
"= true;' is deprecated and will be removed in a future release." \
"Use 'autoPatchelfIgnoreMissingDeps = [ \"*\" ];' instead." >&2
ignoreMissingDepsArray=( "*" )
break
fi
done
@pythonInterpreter@ @autoPatchelfScript@ \
${norecurse:+--no-recurse} \
--ignore-missing "${ignoreMissingDepsArray[@]}" \

View File

@ -0,0 +1,6 @@
{ lib, callPackage }:
lib.recurseIntoAttrs {
withStructuredAttrs = callPackage ./package.nix { __structuredAttrs = true; };
withoutStructuredAttrs = callPackage ./package.nix { __structuredAttrs = false; };
}

View File

@ -0,0 +1,96 @@
# 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;
}

View File

@ -169,4 +169,6 @@ with pkgs;
pkgs-lib = recurseIntoAttrs (import ../pkgs-lib/tests { inherit pkgs; });
nixpkgs-check-by-name = callPackage ./nixpkgs-check-by-name { };
auto-patchelf-hook = callPackage ./auto-patchelf-hook { };
}