Last active
November 16, 2025 19:30
-
-
Save js6pak/5b8f3f92103ed64f85e971dc196a70fb to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| 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