From 5a92b07f5ddb808f7711166d27d840ae51a99505 Mon Sep 17 00:00:00 2001 From: Colin Date: Sun, 19 May 2024 22:33:00 +0000 Subject: [PATCH] cross: clean up the meson x cargo flag patching --- overlays/cross.nix | 68 ++++++++++++++-------------------------------- 1 file changed, 20 insertions(+), 48 deletions(-) diff --git a/overlays/cross.nix b/overlays/cross.nix index 09cdf0f1..f8adb9cb 100644 --- a/overlays/cross.nix +++ b/overlays/cross.nix @@ -75,8 +75,20 @@ let pkg ); + # build a GI_TYPELIB_PATH out of some packages, useful for build-time tools which otherwise + # try to load gobject-introspection files for the wrong platform (e.g. `blueprint` compiler). typelibPath = pkgs: lib.concatStringsSep ":" (builtins.map (p: "${lib.getLib p}/lib/girepository-1.0") pkgs); + # `cargo` which adds the correct env vars and `--target` flag when invoked from meson build scripts + crossCargo = let + inherit (final.pkgsBuildHost) cargo; + inherit (final.rust.envVars) setEnv rustHostPlatformSpec; + in (final.pkgsBuildBuild.writeShellScriptBin "cargo" '' + exec ${setEnv} "${lib.getExe cargo}" "$@" --target "${rustHostPlatformSpec}" + '').overrideAttrs { + inherit (cargo) meta; + }; + emulated = mkEmulated final prev; @@ -474,24 +486,14 @@ in with final; { # ]; # }); - delfin = prev.delfin.overrideAttrs (upstream: - let - cargoEnvWrapper = buildPackages.writeShellScript "cargo-env-wrapper" '' - CARGO_BIN="$1" - shift - CARGO_OP="$1" - shift - - ${rust.envVars.setEnv} "$CARGO_BIN" "$CARGO_OP" --target "${rust.envVars.rustHostPlatformSpec}" "$@" - ''; - in { + delfin = prev.delfin.overrideAttrs (upstream: { nativeBuildInputs = upstream.nativeBuildInputs ++ [ # fixes: loaders/meson.build:72:7: ERROR: Program 'msgfmt' not found or not executable buildPackages.gettext ]; postPatch = '' substituteInPlace delfin/meson.build \ - --replace "cargo, 'build'," "'${cargoEnvWrapper}', cargo, 'build'," \ + --replace "cargo, 'build'," "'${lib.getExe crossCargo}', 'build'," \ --replace "'delfin' / rust_target" "'delfin' / '${rust.envVars.rustHostPlatformSpec}' / rust_target" ''; }); @@ -745,24 +747,14 @@ in with final; { # }); # 2024/02/27: upstreaming is unblocked - glycin-loaders = prev.glycin-loaders.overrideAttrs (upstream: - let - cargoEnvWrapper = buildPackages.writeShellScript "cargo-env-wrapper" '' - CARGO_BIN="$1" - shift - CARGO_OP="$1" - shift - - ${rust.envVars.setEnv} "$CARGO_BIN" "$CARGO_OP" --target "${rust.envVars.rustHostPlatformSpec}" "$@" - ''; - in { + glycin-loaders = prev.glycin-loaders.overrideAttrs (upstream: { nativeBuildInputs = upstream.nativeBuildInputs ++ [ # fixes: loaders/meson.build:72:7: ERROR: Program 'msgfmt' not found or not executable buildPackages.gettext ]; postPatch = '' substituteInPlace loaders/meson.build \ - --replace "cargo_bin, 'build'," "'${cargoEnvWrapper}', cargo_bin, 'build'," \ + --replace "cargo_bin, 'build'," "'${lib.getExe crossCargo}', 'build'," \ --replace "'loaders' / rust_target" "'loaders' / '${rust.envVars.rustHostPlatformSpec}' / rust_target" ''; }); @@ -1210,20 +1202,10 @@ in with final; { # }); # 2023/12/19: upstreaming blocked on glycin-loaders - loupe = prev.loupe.overrideAttrs (upstream: - let - cargoEnvWrapper = buildPackages.writeShellScript "cargo-env-wrapper" '' - CARGO_BIN="$1" - shift - CARGO_OP="$1" - shift - - ${rust.envVars.setEnv} "$CARGO_BIN" "$CARGO_OP" --target "${rust.envVars.rustHostPlatformSpec}" "$@" - ''; - in { + loupe = prev.loupe.overrideAttrs (upstream: { postPatch = (upstream.postPatch or "") + '' substituteInPlace src/meson.build \ - --replace "cargo, 'build'," "'${cargoEnvWrapper}', cargo, 'build'," \ + --replace "cargo, 'build'," "'${lib.getExe crossCargo}', 'build'," \ --replace "'src' / rust_target" "'src' / '${rust.envVars.rustHostPlatformSpec}' / rust_target" ''; }); @@ -1845,21 +1827,11 @@ in with final; { # inherit (emulated) stdenv; # }; - snapshot = prev.snapshot.overrideAttrs (upstream: - let - cargoEnvWrapper = buildPackages.writeShellScript "cargo-env-wrapper" '' - CARGO_BIN="$1" - shift - CARGO_OP="$1" - shift - - ${rust.envVars.setEnv} "$CARGO_BIN" "$CARGO_OP" --target "${rust.envVars.rustHostPlatformSpec}" "$@" - ''; - in { + snapshot = prev.snapshot.overrideAttrs (upstream: { # fixes "error: linker `cc` not found" postPatch = (upstream.postPatch or "") + '' substituteInPlace src/meson.build \ - --replace "cargo, 'build'," "'${cargoEnvWrapper}', cargo, 'build'," \ + --replace "cargo, 'build'," "'${lib.getExe crossCargo}', 'build'," \ --replace "'src' / rust_target" "'src' / '${rust.envVars.rustHostPlatformSpec}' / rust_target" ''; });