From db6901988d282ba3e309e8bb9260ed90f0261185 Mon Sep 17 00:00:00 2001 From: Randy Eckenrode Date: Tue, 14 Jul 2026 09:24:58 -0400 Subject: [PATCH] darwin.libffi: check that the trampoline dylib is built correctly --- .../darwin/by-name/li/libffi/package.nix | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/pkgs/os-specific/darwin/by-name/li/libffi/package.nix b/pkgs/os-specific/darwin/by-name/li/libffi/package.nix index 0411e61a1f9e..6a46e4cc0a5c 100644 --- a/pkgs/os-specific/darwin/by-name/li/libffi/package.nix +++ b/pkgs/os-specific/darwin/by-name/li/libffi/package.nix @@ -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" + ''; }; };