|
107 | 107 | «derivation /nix/store/g3z1zlmc0sqpd6d5ccfrx3c4w4nv5dzr-cryptography-43.0.0.drv» |
108 | 108 | ``` |
109 | 109 |
|
| 110 | + # Cross-platform evaluation example: needs cargoLockHash |
| 111 | +
|
| 112 | + ```nix |
| 113 | + importCargoLock { |
| 114 | + prev = prev.cryptography; |
| 115 | + # Lock file relative to source root |
| 116 | + lockFile = "src/rust/Cargo.lock"; |
| 117 | + # Provide the SRI hash of the Cargo.lock file for cross-platform evaluation |
| 118 | + cargoLockHash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; |
| 119 | + } |
| 120 | + ``` |
| 121 | +
|
110 | 122 | # Type |
111 | 123 |
|
112 | 124 | ``` |
|
127 | 139 | lockFile |
128 | 140 | : Path to Cargo.lock (defaults to `${cargoRoot}/Cargo.lock`) |
129 | 141 |
|
| 142 | + cargoLockHash |
| 143 | + : Optional SRI hash of the Cargo.lock file (enables cross-platform evaluation) |
| 144 | +
|
130 | 145 | doUnpack |
131 | 146 | : Whether to unpack sources using an intermediate derivation |
132 | 147 |
|
|
149 | 164 | unpackDerivationArgs ? { }, |
150 | 165 | cargoRoot ? ".", |
151 | 166 | lockFile ? "${cargoRoot}/Cargo.lock", |
| 167 | + cargoLockHash ? null, |
152 | 168 | cargo ? pkgs.cargo, |
153 | 169 | rustc ? pkgs.rustc, |
154 | 170 | pkg-config ? pkgs.pkg-config, |
|
175 | 191 | } |
176 | 192 | ); |
177 | 193 |
|
| 194 | + # Determine the lock file path |
| 195 | + # If cargoLockHash is provided and we need to unpack, extract just the Cargo.lock |
| 196 | + # as a fixed-output derivation for cross-platform evaluation |
| 197 | + actualLockFile = |
| 198 | + if !doUnpack || cargoLockHash == null then |
| 199 | + # Use the lock file from src (either local path or unpacked archive) |
| 200 | + if lib.hasPrefix "/" lockFile then lockFile else "${src}/${lockFile}" |
| 201 | + else |
| 202 | + # Create fixed-output derivation for just the Cargo.lock file |
| 203 | + # Use pkgsBuildHost to ensure this runs on the build platform |
| 204 | + pkgs.pkgsBuildHost.runCommand "${prev.src.name}-cargo-lock" |
| 205 | + { |
| 206 | + outputHash = cargoLockHash; |
| 207 | + outputHashMode = "flat"; |
| 208 | + nativeBuildInputs = with pkgs.pkgsBuildHost; [ gnutar gzip bzip2 xz ]; |
| 209 | + } |
| 210 | + '' |
| 211 | + tar -xaf ${prev.src} --to-stdout --no-wildcards-match-slash --wildcards "*/${lib.removePrefix "./" lockFile}" >"$out" && test -s "$out" |
| 212 | + ''; |
| 213 | + |
178 | 214 | in |
179 | 215 | assert isDerivation prev; |
180 | 216 | prev.overrideAttrs (old: { |
181 | 217 | inherit cargoRoot src; |
182 | 218 | cargoDeps = pkgs.rustPlatform.importCargoLock ( |
183 | 219 | { |
184 | | - lockFile = "${src}/${lockFile}"; |
| 220 | + lockFile = actualLockFile; |
185 | 221 | } |
186 | 222 | // importCargoLockArgs |
187 | 223 | ); |
|
0 commit comments