|
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