darwin.libffi: check that the trampoline dylib is built correctly

This commit is contained in:
Randy Eckenrode
2026-07-14 09:24:58 -04:00
parent ab2c12891d
commit db6901988d

View File

@@ -3,6 +3,9 @@
autoreconfHook,
dejagnu,
mkAppleDerivation,
runCommand,
dyld,
python3,
stdenv,
testers,
texinfo,
@@ -12,6 +15,10 @@
doCheck ? !(stdenv.hostPlatform.isStatic),
}:
let
python3-with-macholib = python3.withPackages (pkgs: [ pkgs.macholib ]);
in
mkAppleDerivation (finalAttrs: {
releaseName = "libffi";
@@ -94,6 +101,32 @@ mkAppleDerivation (finalAttrs: {
pkg-config = testers.hasPkgConfigModules {
package = finalAttrs.finalPackage;
};
# Done as a passthru test to avoid pulling dyld into the Darwin bootstrap just for `dyld_info`.
# `dyld_info` is needed because `check-trampolines-dylib.py` does not check chained fixups.
check-trampolines-dylib =
runCommand "check-trampolines-dylib"
{
inherit (finalAttrs) src version;
nativeBuildInputs = [
dyld
python3-with-macholib
];
buildInputs = [ finalAttrs.finalPackage ];
meta = {
description = "Test whether the libffi trampoline was built correctly and works on Darwin.";
inherit (finalAttrs.meta) license platforms;
};
}
''
runPhase unpackPhase
trampolineDylib=${lib.escapeShellArg (lib.getLib finalAttrs.finalPackage)}/lib/libffi-trampolines.dylib
patchShebangs check-trampolines-dylib.py
./check-trampolines-dylib.py "$trampolineDylib"
dyld_info -fixups "$trampolineDylib" | grep -v "chained fixups, seg_count exceeds number of segments"
touch "$out"
'';
};
};