Skip to content

Instantly share code, notes, and snippets.

@mnixry
Created October 17, 2025 13:15
Show Gist options
  • Save mnixry/590f0b50c56636fdf5fa7ba63d579804 to your computer and use it in GitHub Desktop.
Save mnixry/590f0b50c56636fdf5fa7ba63d579804 to your computer and use it in GitHub Desktop.
Nix snippet for cross build rust binaries to windows-gnu, linux-musl and apple-darwin.
{
lib,
pkgs,
crane,
zig_0_13,
cargo-zigbuild,
target,
rev,
}:
let
zig = pkgs.stdenvNoCC.mkDerivation {
inherit (zig_0_13)
name
version
passthru
meta
;
src = zig_0_13;
phases = [ "installPhase" ];
installPhase = ''
cp -r $src $out
chmod -R +w $out
ln -sf \
$out/lib/zig/libc/mingw/lib-common/api-ms-win-core-synch-l1-2-0.def \
$out/lib/zig/libc/mingw/lib-common/synchronization.def
'';
};
craneLib = (crane.mkLib pkgs).overrideToolchain (
pkgs: pkgs.rust-bin.stable.latest.default.override { targets = [ target ]; }
);
dllTool = pkgs.writeShellScriptBin "x86_64-w64-mingw32-dlltool" ''
${lib.getExe zig} dlltool "$@"
'';
appleSdk = pkgs.stdenvNoCC.mkDerivation {
name = "apple-sdk";
src = pkgs.fetchurl {
url = "https://github.com/phracker/MacOSX-SDKs/releases/download/11.3/MacOSX11.3.sdk.tar.xz";
hash = "sha256-zU8Ip1V3FFuPBSRaKXX3yBQB116VNdz/u4ee4d7vy/Q=";
};
phases = [ "installPhase" ];
installPhase = ''
mkdir -p $out
tar -Jxf $src --strip-components=1 -C $out
'';
};
in
craneLib.buildPackage {
version = rev;
src = craneLib.cleanCargoSource ./.;
doCheck = false;
strictDeps = true;
depsBuildBuild = (
[
zig
(cargo-zigbuild.override { inherit zig; })
]
++ lib.optionals (lib.strings.hasSuffix "-windows-gnu" target) [ dllTool ]
++ lib.optionals (lib.strings.hasSuffix "-darwin" target) [ appleSdk ]
);
preBuild = ''
export XDG_CACHE_HOME=$TMPDIR/xdg_cache CARGO_ZIGBUILD_CACHE_DIR=$TMPDIR/cargo-zigbuild-cache
mkdir -p $XDG_CACHE_HOME $CARGO_ZIGBUILD_CACHE_DIR
''
+ lib.optionalString (lib.strings.hasSuffix "-darwin" target) ''
export SDKROOT=${appleSdk}
'';
buildPhaseCargoCommand = ''
cargoBuildLog=$(mktemp cargoBuildLog.XXXXXX.json)
cargo zigbuild --release --target ${target} --message-format json-render-diagnostics > "$cargoBuildLog"
'';
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment