|
21 | 21 | # Read toolchain from rust-toolchain.toml |
22 | 22 | rustToolchain = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml; |
23 | 23 |
|
| 24 | + # Toolchain extended with Windows cross-compilation target |
| 25 | + rustToolchainWindows = rustToolchain.override { |
| 26 | + targets = [ "x86_64-pc-windows-gnu" ]; |
| 27 | + }; |
| 28 | + |
24 | 29 | # Create a custom rustPlatform with our toolchain |
25 | 30 | rustPlatform = pkgs.makeRustPlatform { |
26 | 31 | cargo = rustToolchain; |
27 | 32 | rustc = rustToolchain; |
28 | 33 | }; |
29 | 34 |
|
| 35 | + # rustPlatform with Windows cross-compilation target |
| 36 | + rustPlatformWindows = pkgs.makeRustPlatform { |
| 37 | + cargo = rustToolchainWindows; |
| 38 | + rustc = rustToolchainWindows; |
| 39 | + }; |
| 40 | + |
30 | 41 | # Common build inputs for OS builds |
31 | 42 | commonBuildInputs = with pkgs; [ |
32 | 43 | openssl |
|
57 | 68 | "framework_lib" |
58 | 69 | "framework_tool" |
59 | 70 | "framework_uefi" |
| 71 | + "res" |
60 | 72 | ".cargo" |
61 | 73 | ]; |
62 | 74 | includedFiles = [ |
|
129 | 141 | LIBGIT2_NO_VENDOR = "1"; |
130 | 142 | }; |
131 | 143 |
|
| 144 | + # MinGW cross-compiler for Windows builds |
| 145 | + mingw = pkgs.pkgsCross.mingwW64.stdenv.cc; |
| 146 | + mingwPthreads = pkgs.pkgsCross.mingwW64.windows.pthreads; |
| 147 | + |
| 148 | + # Build function for Windows cross-compilation (Linux -> Windows) |
| 149 | + buildFrameworkToolWindows = { release ? false }: |
| 150 | + let |
| 151 | + profile = if release then "release" else "debug"; |
| 152 | + in |
| 153 | + rustPlatformWindows.buildRustPackage { |
| 154 | + pname = "framework_tool"; |
| 155 | + version = "0.5.0"; |
| 156 | + |
| 157 | + src = buildSrc; |
| 158 | + |
| 159 | + cargoLock = { |
| 160 | + lockFile = ./Cargo.lock; |
| 161 | + outputHashes = gitDependencyHashes; |
| 162 | + }; |
| 163 | + |
| 164 | + buildType = profile; |
| 165 | + buildNoDefaultFeatures = true; |
| 166 | + |
| 167 | + # Disable cargo-auditable as it's incompatible with cross-compilation |
| 168 | + auditable = false; |
| 169 | + |
| 170 | + buildPhase = '' |
| 171 | + runHook preBuild |
| 172 | + cargo build \ |
| 173 | + ${if release then "--release" else ""} \ |
| 174 | + --target x86_64-pc-windows-gnu \ |
| 175 | + -p framework_tool |
| 176 | + runHook postBuild |
| 177 | + ''; |
| 178 | + |
| 179 | + # Skip check phase - can't run .exe on Linux |
| 180 | + doCheck = false; |
| 181 | + |
| 182 | + installPhase = '' |
| 183 | + runHook preInstall |
| 184 | + mkdir -p $out/bin |
| 185 | + cp target/x86_64-pc-windows-gnu/${profile}/framework_tool.exe $out/bin/ |
| 186 | + runHook postInstall |
| 187 | + ''; |
| 188 | + |
| 189 | + nativeBuildInputs = [ mingw ]; |
| 190 | + |
| 191 | + CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER = "${mingw}/bin/x86_64-w64-mingw32-gcc"; |
| 192 | + CC_x86_64_pc_windows_gnu = "${mingw}/bin/x86_64-w64-mingw32-gcc"; |
| 193 | + CXX_x86_64_pc_windows_gnu = "${mingw}/bin/x86_64-w64-mingw32-g++"; |
| 194 | + AR_x86_64_pc_windows_gnu = "${mingw}/bin/x86_64-w64-mingw32-ar"; |
| 195 | + CARGO_TARGET_X86_64_PC_WINDOWS_GNU_RUSTFLAGS = "-L native=${mingwPthreads}/lib"; |
| 196 | + }; |
| 197 | + |
132 | 198 | # Build function for UEFI application |
133 | 199 | buildFrameworkUefi = { release ? false, features ? [] }: |
134 | 200 | let |
|
186 | 252 | framework-tool-release = buildFrameworkTool { release = true; }; |
187 | 253 | framework-uefi-debug = buildFrameworkUefi { release = false; }; |
188 | 254 | framework-uefi-release = buildFrameworkUefi { release = true; }; |
| 255 | + framework-tool-windows = buildFrameworkToolWindows { release = true; }; |
| 256 | + framework-tool-windows-debug = buildFrameworkToolWindows { release = false; }; |
189 | 257 |
|
190 | 258 | # Wrapper script to run the UEFI build in an emulator |
191 | 259 | run-qemu = pkgs.writeShellScriptBin "run-framework-uefi-qemu" '' |
|
261 | 329 | tool-debug = framework-tool-debug; |
262 | 330 | uefi = framework-uefi-release; |
263 | 331 | uefi-debug = framework-uefi-debug; |
| 332 | + windows = framework-tool-windows; |
| 333 | + windows-debug = framework-tool-windows-debug; |
264 | 334 | run-qemu = run-qemu; |
265 | 335 | run-qemu-release = run-qemu-release; |
266 | 336 | }; |
|
273 | 343 | qemu-release = flake-utils.lib.mkApp { drv = run-qemu-release; }; |
274 | 344 | }; |
275 | 345 |
|
| 346 | + devShells.cross-windows = pkgs.mkShell { |
| 347 | + packages = [ |
| 348 | + rustToolchainWindows |
| 349 | + ]; |
| 350 | + |
| 351 | + # Ensure build scripts (e.g. libgit2-sys) use the native host compiler |
| 352 | + HOST_CC = "cc"; |
| 353 | + |
| 354 | + CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER = "${mingw}/bin/x86_64-w64-mingw32-gcc"; |
| 355 | + CC_x86_64_pc_windows_gnu = "${mingw}/bin/x86_64-w64-mingw32-gcc"; |
| 356 | + CXX_x86_64_pc_windows_gnu = "${mingw}/bin/x86_64-w64-mingw32-g++"; |
| 357 | + AR_x86_64_pc_windows_gnu = "${mingw}/bin/x86_64-w64-mingw32-ar"; |
| 358 | + CARGO_TARGET_X86_64_PC_WINDOWS_GNU_RUSTFLAGS = "-L native=${mingwPthreads}/lib"; |
| 359 | + }; |
| 360 | + |
276 | 361 | devShells.default = pkgs.mkShell { |
277 | 362 | packages = with pkgs; [ |
278 | 363 | rustToolchain |
|
0 commit comments