Skip to content

Instantly share code, notes, and snippets.

@js6pak
Last active November 16, 2025 19:30
Show Gist options
  • Select an option

  • Save js6pak/5b8f3f92103ed64f85e971dc196a70fb to your computer and use it in GitHub Desktop.

Select an option

Save js6pak/5b8f3f92103ed64f85e971dc196a70fb to your computer and use it in GitHub Desktop.
{
pkgs ? import <nixpkgs> { },
}:
let
inherit (pkgs) lib;
macos_sdk = builtins.fetchTarball {
url = "https://github.com/phracker/MacOSX-SDKs/releases/download/11.3/MacOSX11.3.sdk.tar.xz";
sha256 = "sha256-BoFWhRSHaD0j3dzDOFtGJ6DiRrdzMJhkjxztxCluFKo=";
};
systems = [
"x86_64-linux"
"i686-linux"
"aarch64-linux"
"x86_64-darwin"
"aarch64-darwin"
# *-pc-windows-gnu
{
config = "i686-w64-mingw32";
libc = "msvcrt";
}
{
config = "x86_64-w64-mingw32";
libc = "ucrt";
}
]
# *-pc-windows-gnullvm
++
map
(arch: {
config = "${arch}-w64-mingw32";
libc = "ucrt";
rust.rustcTarget = "${arch}-pc-windows-gnullvm";
useLLVM = true;
})
[
"x86_64"
"i686"
"aarch64"
]
# *-pc-windows-msvc
++
map
(arch: {
config = "${arch}-windows";
useLLVM = true;
})
[
"x86_64"
"i686"
"aarch64"
];
mapAllSystems =
f:
lib.mergeAttrsList (
map (
system:
f (
import <nixpkgs> {
crossSystem = system;
config = {
microsoftVisualStudioLicenseAccepted = true;
allowUnfreePredicate =
pkg:
builtins.elem (lib.getName pkg) [
"win-sdk"
"xwin-fetch-msvc"
];
};
}
)
) systems
);
in
pkgs.mkShell.override { stdenv = pkgs.clangStdenv; } (
{
nativeBuildInputs = with pkgs; [
gnumake
ninja
lld
];
SDKROOT = macos_sdk;
}
// mapAllSystems (
pkgs:
let
inherit (pkgs) buildPackages;
inherit (pkgs.stdenv) hostPlatform;
inherit (hostPlatform.rust) cargoEnvVarTarget;
in
{
}
// lib.optionalAttrs hostPlatform.isWindows {
"CARGO_TARGET_${cargoEnvVarTarget}_RUNNER" = "wine";
}
// (
if hostPlatform.isMsvc then
let
windows_sdk = pkgs.windows.sdk;
arch =
{
"x86_64" = "x64";
"i686" = "x86";
"aarch64" = "arm64";
}
.${hostPlatform.parsed.cpu.name};
cflags = "--target=${hostPlatform.config} -Wno-unused-command-line-argument -fuse-ld=lld-link /imsvc ${windows_sdk}/crt/include /imsvc ${windows_sdk}/sdk/include/ucrt /imsvc ${windows_sdk}/sdk/include/um /imsvc ${windows_sdk}/sdk/include/shared";
in
{
"CC_${lib.toLower cargoEnvVarTarget}" = "clang-cl";
"CXX_${lib.toLower cargoEnvVarTarget}" = "clang-cl";
"CARGO_TARGET_${cargoEnvVarTarget}_LINKER" = "lld-link";
"AR_${lib.toLower cargoEnvVarTarget}" = "llvm-lib";
"BINDGEN_EXTRA_CLANG_ARGS_${lib.toLower cargoEnvVarTarget}" =
"-I${windows_sdk}/crt/include -I${windows_sdk}/sdk/include/ucrt -I${windows_sdk}/sdk/include/um -I${windows_sdk}/sdk/include/shared";
"CARGO_TARGET_${cargoEnvVarTarget}_RUSTFLAGS" =
"-C target-feature=+crt-static -C linker-flavor=lld-link -C link-arg=-nodefaultlib:ucrt -C link-arg=-defaultlib:libucrt -Lnative=${windows_sdk}/crt/lib/${arch} -Lnative=${windows_sdk}/sdk/lib/um/${arch} -Lnative=${windows_sdk}/sdk/lib/ucrt/${arch}";
"CFLAGS_${lib.toLower cargoEnvVarTarget}" = cflags;
"CXXFLAGS_${lib.toLower cargoEnvVarTarget}" = "${cflags} /EHsc";
"CMAKE_TOOLCHAIN_FILE_${lib.toLower cargoEnvVarTarget}" =
buildPackages.writeText "${lib.toLower cargoEnvVarTarget}-toolchain.cmake" ''
message(FATAL_ERROR "TODO")
'';
}
else if hostPlatform.isMinGW then
let
getCcExe = name: lib.getExe' pkgs.stdenv.cc (pkgs.stdenv.cc.targetPrefix + name);
in
{
"CC_${lib.toLower cargoEnvVarTarget}" = getCcExe "cc";
"CARGO_TARGET_${cargoEnvVarTarget}_LINKER" = getCcExe "cc";
}
// lib.optionalAttrs pkgs.stdenv.cc.isGNU {
"CARGO_TARGET_${cargoEnvVarTarget}_RUSTFLAGS" =
"-C dlltool=${getCcExe "dlltool"} -L ${pkgs.windows.pthreads}/lib";
}
else
let
zigTarget =
let
inherit (hostPlatform.parsed) cpu kernel abi;
arch =
{
"i686" = "x86";
}
.${cpu.name} or cpu.name;
os =
{
"darwin" = "macos";
}
.${kernel.name} or kernel.name;
in
"${arch}-${os}${lib.optionalString (abi.name != "unknown") "-${abi.name}"}";
zigCc = lib.getExe (
buildPackages.writeShellScriptBin "${hostPlatform.config}-zig-cc" (
lib.optionalString hostPlatform.isDarwin ''
for arg do
shift
[ "$arg" = "-Wl,-exported_symbols_list" ] && shift && continue
set -- "$@" "$arg"
done
''
+ ''
${lib.getExe buildPackages.zig} cc -fno-sanitize=undefined $@ -target "${zigTarget}" ${lib.optionalString hostPlatform.isDarwin ''-I"$SDKROOT/usr/include" -L"$SDKROOT/usr/lib" -F"$SDKROOT/System/Library/Frameworks"''}
''
)
);
in
{
"CC_${lib.toLower cargoEnvVarTarget}" = zigCc;
"CXX_${lib.toLower cargoEnvVarTarget}" = zigCc;
"CARGO_TARGET_${cargoEnvVarTarget}_LINKER" = zigCc;
}
)
)
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment