Skip to content

Commit a5ed4ed

Browse files
lopsided98kolloch
authored andcommitted
Add support for cross-compilation
1 parent a8e3363 commit a5ed4ed

File tree

8 files changed

+129
-202
lines changed

8 files changed

+129
-202
lines changed

crate2nix/Cargo.nix

Lines changed: 21 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
, pkgs ? import nixpkgs { config = {}; }
88
, lib ? pkgs.lib
99
, stdenv ? pkgs.stdenv
10-
, buildRustCrate ? pkgs.buildRustCrate
1110
# This is used as the `crateOverrides` argument for `buildRustCrate`.
1211
, defaultCrateOverrides ? pkgs.defaultCrateOverrides
1312
# The features to enable for the root_crate or the workspace_members.
@@ -2291,7 +2290,6 @@ rec {
22912290
{ packageId
22922291
, features ? rootFeatures
22932292
, crateOverrides ? defaultCrateOverrides
2294-
, buildRustCrateFunc ? null
22952293
, runTests ? false
22962294
, testCrateFlags ? [ ]
22972295
, testInputs ? [ ]
@@ -2305,26 +2303,18 @@ rec {
23052303
, testInputs
23062304
}:
23072305
let
2308-
buildRustCrateFuncOverriden =
2309-
if buildRustCrateFunc != null
2310-
then buildRustCrateFunc
2311-
else
2312-
(
2313-
if crateOverrides == pkgs.defaultCrateOverrides
2314-
then buildRustCrate
2315-
else
2316-
buildRustCrate.override {
2317-
defaultCrateOverrides = crateOverrides;
2318-
}
2319-
);
2306+
buildRustCrateOverrides =
2307+
if crateOverrides == pkgs.defaultCrateOverrides
2308+
then { }
2309+
else {
2310+
defaultCrateOverrides = crateOverrides;
2311+
};
23202312
builtRustCrates = builtRustCratesWithFeatures {
2321-
inherit packageId features;
2322-
buildRustCrateFunc = buildRustCrateFuncOverriden;
2313+
inherit packageId features buildRustCrateOverrides;
23232314
runTests = false;
23242315
};
23252316
builtTestRustCrates = builtRustCratesWithFeatures {
2326-
inherit packageId features;
2327-
buildRustCrateFunc = buildRustCrateFuncOverriden;
2317+
inherit packageId features buildRustCrateOverrides;
23282318
runTests = true;
23292319
};
23302320
drv = builtRustCrates.${packageId};
@@ -2350,7 +2340,7 @@ rec {
23502340
{ packageId
23512341
, features
23522342
, crateConfigs ? crates
2353-
, buildRustCrateFunc
2343+
, buildRustCrateOverrides
23542344
, runTests
23552345
, target ? defaultTarget
23562346
} @ args:
@@ -2368,13 +2358,10 @@ rec {
23682358
target = target // { test = runTests; };
23692359
}
23702360
);
2371-
buildByPackageId = packageId: buildByPackageIdImpl packageId;
2372-
2373-
# Memoize built packages so that reappearing packages are only built once.
2374-
builtByPackageId =
2375-
lib.mapAttrs (packageId: value: buildByPackageId packageId) crateConfigs;
2376-
buildByPackageIdImpl = packageId:
2361+
buildByPackageIdForPkgs = pkgs: packageId:
23772362
let
2363+
# proc_macro crates must be compiled for the build architecture
2364+
cratePkgs = if crateConfig.procMacro or false then pkgs.buildPackages else pkgs;
23782365
features = mergedFeatures."${packageId}" or [ ];
23792366
crateConfig' = crateConfigs."${packageId}";
23802367
crateConfig =
@@ -2385,14 +2372,16 @@ rec {
23852372
(crateConfig'.devDependencies or [ ]);
23862373
dependencies =
23872374
dependencyDerivations {
2388-
inherit builtByPackageId features target;
2375+
inherit features target;
2376+
buildByPackageId = buildByPackageIdForPkgs cratePkgs;
23892377
dependencies =
23902378
(crateConfig.dependencies or [ ])
23912379
++ devDependencies;
23922380
};
23932381
buildDependencies =
23942382
dependencyDerivations {
2395-
inherit builtByPackageId features target;
2383+
inherit features target;
2384+
buildByPackageId = buildByPackageIdForPkgs cratePkgs.buildPackages;
23962385
dependencies = crateConfig.buildDependencies or [ ];
23972386
};
23982387
filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies {
@@ -2424,13 +2413,13 @@ rec {
24242413
dependenciesWithRenames;
24252414
versionAndRename = dep:
24262415
let
2427-
package = builtByPackageId."${dep.packageId}";
2416+
package = crateConfigs."${dep.packageId}";
24282417
in
24292418
{ inherit (dep) rename; version = package.version; };
24302419
in
24312420
lib.mapAttrs (name: choices: builtins.map versionAndRename choices) grouped;
24322421
in
2433-
buildRustCrateFunc
2422+
cratePkgs.buildRustCrate.override buildRustCrateOverrides
24342423
(
24352424
crateConfig // {
24362425
src = crateConfig.src or (
@@ -2449,24 +2438,23 @@ rec {
24492438
}
24502439
);
24512440
in
2452-
builtByPackageId;
2441+
lib.mapAttrs (packageId: value: buildByPackageIdForPkgs pkgs packageId) crateConfigs;
24532442

24542443
/* Returns the actual derivations for the given dependencies. */
24552444
dependencyDerivations =
2456-
{ builtByPackageId
2445+
{ buildByPackageId
24572446
, features
24582447
, dependencies
24592448
, target
24602449
}:
2461-
assert (builtins.isAttrs builtByPackageId);
24622450
assert (builtins.isList features);
24632451
assert (builtins.isList dependencies);
24642452
assert (builtins.isAttrs target);
24652453
let
24662454
enabledDependencies = filterEnabledDependencies {
24672455
inherit dependencies features target;
24682456
};
2469-
depDerivation = dependency: builtByPackageId.${dependency.packageId};
2457+
depDerivation = dependency: buildByPackageId dependency.packageId;
24702458
in
24712459
map depDerivation enabledDependencies;
24722460

crate2nix/templates/Cargo.nix.tera

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
, pkgs ? import nixpkgs { config = {}; }
1010
, lib ? pkgs.lib
1111
, stdenv ? pkgs.stdenv
12-
, buildRustCrate ? pkgs.buildRustCrate
1312
# This is used as the `crateOverrides` argument for `buildRustCrate`.
1413
, defaultCrateOverrides ? pkgs.defaultCrateOverrides
1514
# The features to enable for the root_crate or the workspace_members.

crate2nix/templates/nix/crate2nix/default.nix

Lines changed: 21 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
{ pkgs
55
, lib
66
, stdenv
7-
, buildRustCrate
87
, defaultCrateOverrides
98
, strictDeprecation ? true
109
, crates ? { }
@@ -162,7 +161,6 @@ rec {
162161
{ packageId
163162
, features ? rootFeatures
164163
, crateOverrides ? defaultCrateOverrides
165-
, buildRustCrateFunc ? null
166164
, runTests ? false
167165
, testCrateFlags ? [ ]
168166
, testInputs ? [ ]
@@ -176,26 +174,18 @@ rec {
176174
, testInputs
177175
}:
178176
let
179-
buildRustCrateFuncOverriden =
180-
if buildRustCrateFunc != null
181-
then buildRustCrateFunc
182-
else
183-
(
184-
if crateOverrides == pkgs.defaultCrateOverrides
185-
then buildRustCrate
186-
else
187-
buildRustCrate.override {
188-
defaultCrateOverrides = crateOverrides;
189-
}
190-
);
177+
buildRustCrateOverrides =
178+
if crateOverrides == pkgs.defaultCrateOverrides
179+
then { }
180+
else {
181+
defaultCrateOverrides = crateOverrides;
182+
};
191183
builtRustCrates = builtRustCratesWithFeatures {
192-
inherit packageId features;
193-
buildRustCrateFunc = buildRustCrateFuncOverriden;
184+
inherit packageId features buildRustCrateOverrides;
194185
runTests = false;
195186
};
196187
builtTestRustCrates = builtRustCratesWithFeatures {
197-
inherit packageId features;
198-
buildRustCrateFunc = buildRustCrateFuncOverriden;
188+
inherit packageId features buildRustCrateOverrides;
199189
runTests = true;
200190
};
201191
drv = builtRustCrates.${packageId};
@@ -221,7 +211,7 @@ rec {
221211
{ packageId
222212
, features
223213
, crateConfigs ? crates
224-
, buildRustCrateFunc
214+
, buildRustCrateOverrides
225215
, runTests
226216
, target ? defaultTarget
227217
} @ args:
@@ -239,13 +229,10 @@ rec {
239229
target = target // { test = runTests; };
240230
}
241231
);
242-
buildByPackageId = packageId: buildByPackageIdImpl packageId;
243-
244-
# Memoize built packages so that reappearing packages are only built once.
245-
builtByPackageId =
246-
lib.mapAttrs (packageId: value: buildByPackageId packageId) crateConfigs;
247-
buildByPackageIdImpl = packageId:
232+
buildByPackageIdForPkgs = pkgs: packageId:
248233
let
234+
# proc_macro crates must be compiled for the build architecture
235+
cratePkgs = if crateConfig.procMacro or false then pkgs.buildPackages else pkgs;
249236
features = mergedFeatures."${packageId}" or [ ];
250237
crateConfig' = crateConfigs."${packageId}";
251238
crateConfig =
@@ -256,14 +243,16 @@ rec {
256243
(crateConfig'.devDependencies or [ ]);
257244
dependencies =
258245
dependencyDerivations {
259-
inherit builtByPackageId features target;
246+
inherit features target;
247+
buildByPackageId = buildByPackageIdForPkgs cratePkgs;
260248
dependencies =
261249
(crateConfig.dependencies or [ ])
262250
++ devDependencies;
263251
};
264252
buildDependencies =
265253
dependencyDerivations {
266-
inherit builtByPackageId features target;
254+
inherit features target;
255+
buildByPackageId = buildByPackageIdForPkgs cratePkgs.buildPackages;
267256
dependencies = crateConfig.buildDependencies or [ ];
268257
};
269258
filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies {
@@ -295,13 +284,13 @@ rec {
295284
dependenciesWithRenames;
296285
versionAndRename = dep:
297286
let
298-
package = builtByPackageId."${dep.packageId}";
287+
package = crateConfigs."${dep.packageId}";
299288
in
300289
{ inherit (dep) rename; version = package.version; };
301290
in
302291
lib.mapAttrs (name: choices: builtins.map versionAndRename choices) grouped;
303292
in
304-
buildRustCrateFunc
293+
cratePkgs.buildRustCrate.override buildRustCrateOverrides
305294
(
306295
crateConfig // {
307296
src = crateConfig.src or (
@@ -320,24 +309,23 @@ rec {
320309
}
321310
);
322311
in
323-
builtByPackageId;
312+
lib.mapAttrs (packageId: value: buildByPackageIdForPkgs pkgs packageId) crateConfigs;
324313

325314
/* Returns the actual derivations for the given dependencies. */
326315
dependencyDerivations =
327-
{ builtByPackageId
316+
{ buildByPackageId
328317
, features
329318
, dependencies
330319
, target
331320
}:
332-
assert (builtins.isAttrs builtByPackageId);
333321
assert (builtins.isList features);
334322
assert (builtins.isList dependencies);
335323
assert (builtins.isAttrs target);
336324
let
337325
enabledDependencies = filterEnabledDependencies {
338326
inherit dependencies features target;
339327
};
340-
depDerivation = dependency: builtByPackageId.${dependency.packageId};
328+
depDerivation = dependency: buildByPackageId dependency.packageId;
341329
in
342330
map depDerivation enabledDependencies;
343331

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 = {
3+
fakeCrates = packageId: {
44
"pkg_id1" = "pkg_id1";
55
"pkg_id2" = "pkg_id2";
66
"pkg_id3" = "pkg_id3";
7-
};
7+
}.${packageId};
88
fakeDependencies = [
99
{
1010
name = "id1";
@@ -23,7 +23,7 @@ let
2323
];
2424
dependencyDerivations = features: dependencies:
2525
crate2nix.dependencyDerivations {
26-
builtByPackageId = fakeCrates;
26+
buildByPackageId = fakeCrates;
2727
target = crate2nix.defaultTarget;
2828
inherit features dependencies;
2929
};

0 commit comments

Comments
 (0)