Skip to content

Commit ee58c66

Browse files
Ericson2314kolloch
authored andcommitted
Memo again + back compat with cross
Add test for new way to replace `buildRustCrate` while also testing the old way.
1 parent a5ed4ed commit ee58c66

File tree

10 files changed

+321
-129
lines changed

10 files changed

+321
-129
lines changed

crate2nix/Cargo.nix

Lines changed: 48 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@
77
, pkgs ? import nixpkgs { config = {}; }
88
, lib ? pkgs.lib
99
, stdenv ? pkgs.stdenv
10+
, buildRustCrateForPkgs ? if buildRustCrate != null
11+
then lib.warn "`buildRustCrate` is deprecated, use `buildRustCrateForPkgs` instead" (_: buildRustCrate)
12+
else pkgs: pkgs.buildRustCrate
13+
# Deprecated
14+
, buildRustCrate ? null
1015
# This is used as the `crateOverrides` argument for `buildRustCrate`.
1116
, defaultCrateOverrides ? pkgs.defaultCrateOverrides
1217
# The features to enable for the root_crate or the workspace_members.
@@ -2290,6 +2295,7 @@ rec {
22902295
{ packageId
22912296
, features ? rootFeatures
22922297
, crateOverrides ? defaultCrateOverrides
2298+
, buildRustCrateForPkgsFunc ? null
22932299
, runTests ? false
22942300
, testCrateFlags ? [ ]
22952301
, testInputs ? [ ]
@@ -2303,22 +2309,30 @@ rec {
23032309
, testInputs
23042310
}:
23052311
let
2306-
buildRustCrateOverrides =
2307-
if crateOverrides == pkgs.defaultCrateOverrides
2308-
then { }
2309-
else {
2310-
defaultCrateOverrides = crateOverrides;
2311-
};
2312+
buildRustCrateForPkgsFuncOverriden =
2313+
if buildRustCrateForPkgsFunc != null
2314+
then buildRustCrateForPkgsFunc
2315+
else
2316+
(
2317+
if crateOverrides == pkgs.defaultCrateOverrides
2318+
then buildRustCrateForPkgs
2319+
else
2320+
pkgs: (buildRustCrateForPkgs pkgs).override {
2321+
defaultCrateOverrides = crateOverrides;
2322+
}
2323+
);
23122324
builtRustCrates = builtRustCratesWithFeatures {
2313-
inherit packageId features buildRustCrateOverrides;
2325+
inherit packageId features;
2326+
buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden;
23142327
runTests = false;
23152328
};
23162329
builtTestRustCrates = builtRustCratesWithFeatures {
2317-
inherit packageId features buildRustCrateOverrides;
2330+
inherit packageId features;
2331+
buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden;
23182332
runTests = true;
23192333
};
2320-
drv = builtRustCrates.${packageId};
2321-
testDrv = builtTestRustCrates.${packageId};
2334+
drv = builtRustCrates.crates.${packageId};
2335+
testDrv = builtTestRustCrates.crates.${packageId};
23222336
derivation =
23232337
if runTests then
23242338
crateWithTest
@@ -2333,14 +2347,14 @@ rec {
23332347
)
23342348
{ inherit features crateOverrides runTests testCrateFlags testInputs; };
23352349

2336-
/* Returns an attr set with packageId mapped to the result of buildRustCrateFunc
2350+
/* Returns an attr set with packageId mapped to the result of buildRustCrateForPkgsFunc
23372351
for the corresponding crate.
23382352
*/
23392353
builtRustCratesWithFeatures =
23402354
{ packageId
23412355
, features
23422356
, crateConfigs ? crates
2343-
, buildRustCrateOverrides
2357+
, buildRustCrateForPkgsFunc
23442358
, runTests
23452359
, target ? defaultTarget
23462360
} @ args:
@@ -2358,10 +2372,18 @@ rec {
23582372
target = target // { test = runTests; };
23592373
}
23602374
);
2361-
buildByPackageIdForPkgs = pkgs: packageId:
2375+
# Memoize built packages so that reappearing packages are only built once.
2376+
builtByPackageIdByPkgs = mkBuiltByPackageIdByPkgs pkgs;
2377+
mkBuiltByPackageIdByPkgs = pkgs:
2378+
let
2379+
self = {
2380+
crates = lib.mapAttrs (packageId: value: buildByPackageIdForPkgsImpl self pkgs packageId) crateConfigs;
2381+
build = mkBuiltByPackageIdByPkgs pkgs.buildPackages;
2382+
};
2383+
in
2384+
self;
2385+
buildByPackageIdForPkgsImpl = self: pkgs: packageId:
23622386
let
2363-
# proc_macro crates must be compiled for the build architecture
2364-
cratePkgs = if crateConfig.procMacro or false then pkgs.buildPackages else pkgs;
23652387
features = mergedFeatures."${packageId}" or [ ];
23662388
crateConfig' = crateConfigs."${packageId}";
23672389
crateConfig =
@@ -2373,15 +2395,20 @@ rec {
23732395
dependencies =
23742396
dependencyDerivations {
23752397
inherit features target;
2376-
buildByPackageId = buildByPackageIdForPkgs cratePkgs;
2398+
buildByPackageId = depPackageId:
2399+
# proc_macro crates must be compiled for the build architecture
2400+
if crateConfigs.${depPackageId}.procMacro or false
2401+
then self.build.crates.${depPackageId}
2402+
else self.crates.${depPackageId};
23772403
dependencies =
23782404
(crateConfig.dependencies or [ ])
23792405
++ devDependencies;
23802406
};
23812407
buildDependencies =
23822408
dependencyDerivations {
23832409
inherit features target;
2384-
buildByPackageId = buildByPackageIdForPkgs cratePkgs.buildPackages;
2410+
buildByPackageId = depPackageId:
2411+
self.build.crates.${depPackageId};
23852412
dependencies = crateConfig.buildDependencies or [ ];
23862413
};
23872414
filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies {
@@ -2419,7 +2446,7 @@ rec {
24192446
in
24202447
lib.mapAttrs (name: choices: builtins.map versionAndRename choices) grouped;
24212448
in
2422-
cratePkgs.buildRustCrate.override buildRustCrateOverrides
2449+
buildRustCrateForPkgsFunc pkgs
24232450
(
24242451
crateConfig // {
24252452
src = crateConfig.src or (
@@ -2438,7 +2465,7 @@ rec {
24382465
}
24392466
);
24402467
in
2441-
lib.mapAttrs (packageId: value: buildByPackageIdForPkgs pkgs packageId) crateConfigs;
2468+
builtByPackageIdByPkgs;
24422469

24432470
/* Returns the actual derivations for the given dependencies. */
24442471
dependencyDerivations =
@@ -2477,14 +2504,14 @@ rec {
24772504
debug = rec {
24782505
# The built tree as passed to buildRustCrate.
24792506
buildTree = buildRustCrateWithFeatures {
2480-
buildRustCrateFunc = lib.id;
2507+
buildRustCrateForPkgsFunc = _: lib.id;
24812508
inherit packageId;
24822509
};
24832510
sanitizedBuildTree = sanitizeForJson buildTree;
24842511
dependencyTree = sanitizeForJson
24852512
(
24862513
buildRustCrateWithFeatures {
2487-
buildRustCrateFunc = crate: {
2514+
buildRustCrateForPkgsFunc = _: crate: {
24882515
"01_crateName" = crate.crateName or false;
24892516
"02_features" = crate.features or [ ];
24902517
"03_dependencies" = crate.dependencies or [ ];

crate2nix/templates/Cargo.nix.tera

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99
, pkgs ? import nixpkgs { config = {}; }
1010
, lib ? pkgs.lib
1111
, stdenv ? pkgs.stdenv
12+
, buildRustCrateForPkgs ? if buildRustCrate != null
13+
then lib.warn "`buildRustCrate` is deprecated, use `buildRustCrateForPkgs` instead" (_: buildRustCrate)
14+
else pkgs: pkgs.buildRustCrate
15+
# Deprecated
16+
, buildRustCrate ? null
1217
# This is used as the `crateOverrides` argument for `buildRustCrate`.
1318
, defaultCrateOverrides ? pkgs.defaultCrateOverrides
1419
# The features to enable for the root_crate or the workspace_members.

crate2nix/templates/nix/crate2nix/default.nix

Lines changed: 47 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
{ pkgs
55
, lib
66
, stdenv
7+
, buildRustCrate
8+
, buildRustCrateForPkgs ? if buildRustCrate != null
9+
then lib.warn "`buildRustCrate` is deprecated, use `buildRustCrateForPkgs` instead" (_: buildRustCrate)
10+
else pkgs: pkgs.buildRustCrate
711
, defaultCrateOverrides
812
, strictDeprecation ? true
913
, crates ? { }
@@ -161,6 +165,7 @@ rec {
161165
{ packageId
162166
, features ? rootFeatures
163167
, crateOverrides ? defaultCrateOverrides
168+
, buildRustCrateForPkgsFunc ? null
164169
, runTests ? false
165170
, testCrateFlags ? [ ]
166171
, testInputs ? [ ]
@@ -174,22 +179,30 @@ rec {
174179
, testInputs
175180
}:
176181
let
177-
buildRustCrateOverrides =
178-
if crateOverrides == pkgs.defaultCrateOverrides
179-
then { }
180-
else {
181-
defaultCrateOverrides = crateOverrides;
182-
};
182+
buildRustCrateForPkgsFuncOverriden =
183+
if buildRustCrateForPkgsFunc != null
184+
then buildRustCrateForPkgsFunc
185+
else
186+
(
187+
if crateOverrides == pkgs.defaultCrateOverrides
188+
then buildRustCrateForPkgs
189+
else
190+
pkgs: (buildRustCrateForPkgs pkgs).override {
191+
defaultCrateOverrides = crateOverrides;
192+
}
193+
);
183194
builtRustCrates = builtRustCratesWithFeatures {
184-
inherit packageId features buildRustCrateOverrides;
195+
inherit packageId features;
196+
buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden;
185197
runTests = false;
186198
};
187199
builtTestRustCrates = builtRustCratesWithFeatures {
188-
inherit packageId features buildRustCrateOverrides;
200+
inherit packageId features;
201+
buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden;
189202
runTests = true;
190203
};
191-
drv = builtRustCrates.${packageId};
192-
testDrv = builtTestRustCrates.${packageId};
204+
drv = builtRustCrates.crates.${packageId};
205+
testDrv = builtTestRustCrates.crates.${packageId};
193206
derivation =
194207
if runTests then
195208
crateWithTest
@@ -204,14 +217,14 @@ rec {
204217
)
205218
{ inherit features crateOverrides runTests testCrateFlags testInputs; };
206219

207-
/* Returns an attr set with packageId mapped to the result of buildRustCrateFunc
220+
/* Returns an attr set with packageId mapped to the result of buildRustCrateForPkgsFunc
208221
for the corresponding crate.
209222
*/
210223
builtRustCratesWithFeatures =
211224
{ packageId
212225
, features
213226
, crateConfigs ? crates
214-
, buildRustCrateOverrides
227+
, buildRustCrateForPkgsFunc
215228
, runTests
216229
, target ? defaultTarget
217230
} @ args:
@@ -229,10 +242,18 @@ rec {
229242
target = target // { test = runTests; };
230243
}
231244
);
232-
buildByPackageIdForPkgs = pkgs: packageId:
245+
# Memoize built packages so that reappearing packages are only built once.
246+
builtByPackageIdByPkgs = mkBuiltByPackageIdByPkgs pkgs;
247+
mkBuiltByPackageIdByPkgs = pkgs:
248+
let
249+
self = {
250+
crates = lib.mapAttrs (packageId: value: buildByPackageIdForPkgsImpl self pkgs packageId) crateConfigs;
251+
build = mkBuiltByPackageIdByPkgs pkgs.buildPackages;
252+
};
253+
in
254+
self;
255+
buildByPackageIdForPkgsImpl = self: pkgs: packageId:
233256
let
234-
# proc_macro crates must be compiled for the build architecture
235-
cratePkgs = if crateConfig.procMacro or false then pkgs.buildPackages else pkgs;
236257
features = mergedFeatures."${packageId}" or [ ];
237258
crateConfig' = crateConfigs."${packageId}";
238259
crateConfig =
@@ -244,15 +265,20 @@ rec {
244265
dependencies =
245266
dependencyDerivations {
246267
inherit features target;
247-
buildByPackageId = buildByPackageIdForPkgs cratePkgs;
268+
buildByPackageId = depPackageId:
269+
# proc_macro crates must be compiled for the build architecture
270+
if crateConfigs.${depPackageId}.procMacro or false
271+
then self.build.crates.${depPackageId}
272+
else self.crates.${depPackageId};
248273
dependencies =
249274
(crateConfig.dependencies or [ ])
250275
++ devDependencies;
251276
};
252277
buildDependencies =
253278
dependencyDerivations {
254279
inherit features target;
255-
buildByPackageId = buildByPackageIdForPkgs cratePkgs.buildPackages;
280+
buildByPackageId = depPackageId:
281+
self.build.crates.${depPackageId};
256282
dependencies = crateConfig.buildDependencies or [ ];
257283
};
258284
filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies {
@@ -290,7 +316,7 @@ rec {
290316
in
291317
lib.mapAttrs (name: choices: builtins.map versionAndRename choices) grouped;
292318
in
293-
cratePkgs.buildRustCrate.override buildRustCrateOverrides
319+
buildRustCrateForPkgsFunc pkgs
294320
(
295321
crateConfig // {
296322
src = crateConfig.src or (
@@ -309,7 +335,7 @@ rec {
309335
}
310336
);
311337
in
312-
lib.mapAttrs (packageId: value: buildByPackageIdForPkgs pkgs packageId) crateConfigs;
338+
builtByPackageIdByPkgs;
313339

314340
/* Returns the actual derivations for the given dependencies. */
315341
dependencyDerivations =
@@ -348,14 +374,14 @@ rec {
348374
debug = rec {
349375
# The built tree as passed to buildRustCrate.
350376
buildTree = buildRustCrateWithFeatures {
351-
buildRustCrateFunc = lib.id;
377+
buildRustCrateForPkgsFunc = _: lib.id;
352378
inherit packageId;
353379
};
354380
sanitizedBuildTree = sanitizeForJson buildTree;
355381
dependencyTree = sanitizeForJson
356382
(
357383
buildRustCrateWithFeatures {
358-
buildRustCrateFunc = crate: {
384+
buildRustCrateForPkgsFunc = _: crate: {
359385
"01_crateName" = crate.crateName or false;
360386
"02_features" = crate.features or [ ];
361387
"03_dependencies" = crate.dependencies or [ ];

crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{ lib, crate2nix }:
22
let
3-
fakeCrates = packageId: {
3+
fakeCrates = {
44
"pkg_id1" = "pkg_id1";
55
"pkg_id2" = "pkg_id2";
66
"pkg_id3" = "pkg_id3";
7-
}.${packageId};
7+
};
88
fakeDependencies = [
99
{
1010
name = "id1";
@@ -23,7 +23,7 @@ let
2323
];
2424
dependencyDerivations = features: dependencies:
2525
crate2nix.dependencyDerivations {
26-
buildByPackageId = fakeCrates;
26+
buildByPackageId = p: fakeCrates.${p};
2727
target = crate2nix.defaultTarget;
2828
inherit features dependencies;
2929
};

0 commit comments

Comments
 (0)