Skip to content

Commit 9351292

Browse files
committed
fix build-dependencies resolution when cross-compiling
1 parent 9ff208c commit 9351292

File tree

19 files changed

+276
-173
lines changed

19 files changed

+276
-173
lines changed

crate2nix/Cargo.nix

Lines changed: 58 additions & 52 deletions
Large diffs are not rendered by default.

crate2nix/src/render.rs

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -184,10 +184,7 @@ fn cfg_to_nix_expr_filter(
184184
})?;
185185
Ok(tera::Value::String(cfg_to_nix_expr(&expr)))
186186
} else {
187-
let condition = format!(
188-
"(stdenv.hostPlatform.rust.rustcTarget == {})",
189-
escape_nix_string(key)
190-
);
187+
let condition = format!("(target == {})", escape_nix_string(key));
191188
Ok(tera::Value::String(condition))
192189
}
193190
}
@@ -207,7 +204,7 @@ fn cfg_to_nix_expr(cfg: &CfgExpr) -> String {
207204
fn render(result: &mut String, cfg: &CfgExpr) {
208205
match cfg {
209206
CfgExpr::Value(Cfg::Name(name)) => {
210-
result.push_str(&format!("(target.{} or false)", target(name)));
207+
result.push_str(&format!("(targetSpec.{} or false)", target(name)));
211208
}
212209
CfgExpr::Value(Cfg::KeyPair(key, value)) => {
213210
let escaped_value = escape_nix_string(value);
@@ -216,9 +213,13 @@ fn cfg_to_nix_expr(cfg: &CfgExpr) -> String {
216213
} else if key == "target_feature" {
217214
format!("(builtins.elem {} targetFeatures)", escaped_value)
218215
} else if key == "target_family" {
219-
format!("(builtins.elem {} target.{})", escaped_value, target(key))
216+
format!(
217+
"(builtins.elem {} targetSpec.{})",
218+
escaped_value,
219+
target(key)
220+
)
220221
} else {
221-
format!("({} == target.{} or null)", escaped_value, target(key))
222+
format!("({} == targetSpec.{} or null)", escaped_value, target(key))
222223
});
223224
}
224225
CfgExpr::Not(expr) => {
@@ -271,7 +272,7 @@ fn test_render_cfg_to_nix_expr() {
271272
}
272273

273274
assert_eq!(
274-
"(target.\"unix\" or false)",
275+
"(targetSpec.\"unix\" or false)",
275276
&cfg_to_nix_expr(&name("unix"))
276277
);
277278
assert_eq!(
@@ -282,23 +283,23 @@ fn test_render_cfg_to_nix_expr() {
282283
]))
283284
);
284285
assert_eq!(
285-
"(builtins.elem \"unix\" target.\"family\")",
286+
"(builtins.elem \"unix\" targetSpec.\"family\")",
286287
&cfg_to_nix_expr(&kv("target_family", "unix"))
287288
);
288289
assert_eq!(
289-
"(\"linux\" == target.\"os\" or null)",
290+
"(\"linux\" == targetSpec.\"os\" or null)",
290291
&cfg_to_nix_expr(&kv("target_os", "linux"))
291292
);
292293
assert_eq!(
293-
"(!(\"linux\" == target.\"os\" or null))",
294+
"(!(\"linux\" == targetSpec.\"os\" or null))",
294295
&cfg_to_nix_expr(&CfgExpr::Not(Box::new(kv("target_os", "linux"))))
295296
);
296297
assert_eq!(
297-
"((target.\"unix\" or false) || (\"linux\" == target.\"os\" or null))",
298+
"((targetSpec.\"unix\" or false) || (\"linux\" == targetSpec.\"os\" or null))",
298299
&cfg_to_nix_expr(&CfgExpr::Any(vec![name("unix"), kv("target_os", "linux")]))
299300
);
300301
assert_eq!(
301-
"((target.\"unix\" or false) && (\"linux\" == target.\"os\" or null))",
302+
"((targetSpec.\"unix\" or false) && (\"linux\" == targetSpec.\"os\" or null))",
302303
&cfg_to_nix_expr(&CfgExpr::All(vec![name("unix"), kv("target_os", "linux")]))
303304
);
304305
assert_eq!("true", &cfg_to_nix_expr(&CfgExpr::All(vec![])));

crate2nix/templates/Cargo.nix.tera

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ rec {
195195
usesDefaultFeatures = false;
196196
{%- endif -%}
197197
{%- if dependency.target %}
198-
target = { target, features }: {{dependency.target | cfg_to_nix_expr | safe }};
198+
target = {target, targetSpec, features}: {{dependency.target | cfg_to_nix_expr | safe}};
199199
{%- endif %}
200200
{%- if dependency.features %}
201201
features = [ {% for feature in dependency.features %}{{feature}} {% endfor %}];
@@ -221,7 +221,7 @@ rec {
221221
usesDefaultFeatures = false;
222222
{%- endif -%}
223223
{%- if dependency.target %}
224-
target = {target, features}: {{dependency.target | cfg_to_nix_expr | safe }};
224+
target = {target, targetSpec, features}: {{dependency.target | cfg_to_nix_expr | safe}};
225225
{%- endif %}
226226
{%- if dependency.features %}
227227
features = [ {% for feature in dependency.features %}{{feature}} {% endfor %}];
@@ -246,7 +246,7 @@ rec {
246246
usesDefaultFeatures = false;
247247
{%- endif -%}
248248
{%- if dependency.target %}
249-
target = {target, features}: {{dependency.target | cfg_to_nix_expr | safe }};
249+
target = {target, targetSpec, features}: {{dependency.target | cfg_to_nix_expr | safe}};
250250
{%- endif %}
251251
{%- if dependency.features %}
252252
features = [ {% for feature in dependency.features %}{{feature}} {% endfor %}];

crate2nix/templates/nix/crate2nix/default.nix

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ rec {
2121
/* Target (platform) data for conditional dependencies.
2222
This corresponds roughly to what buildRustCrate is setting.
2323
*/
24-
makeDefaultTarget = platform: {
24+
makeDefaultTargetSpec = platform: {
2525
unix = platform.isUnix;
2626
windows = platform.isWindows;
2727
fuchsia = true;
@@ -241,20 +241,21 @@ rec {
241241
, crateConfigs ? crates
242242
, buildRustCrateForPkgsFunc
243243
, runTests
244-
, makeTarget ? makeDefaultTarget
244+
, makeTargetSpec ? makeDefaultTargetSpec
245245
} @ args:
246246
assert (builtins.isAttrs crateConfigs);
247247
assert (builtins.isString packageId);
248248
assert (builtins.isList features);
249-
assert (builtins.isAttrs (makeTarget stdenv.hostPlatform));
249+
assert (builtins.isAttrs (makeTargetSpec stdenv.hostPlatform));
250250
assert (builtins.isBool runTests);
251251
let
252252
rootPackageId = packageId;
253253
mergedFeatures = mergePackageFeatures
254254
(
255255
args // {
256256
inherit rootPackageId;
257-
target = makeTarget stdenv.hostPlatform // { test = runTests; };
257+
target = stdenv.hostPlatform.rust.rustcTarget;
258+
targetSpec = makeTargetSpec stdenv.hostPlatform // { test = runTests; };
258259
}
259260
);
260261
# Memoize built packages so that reappearing packages are only built once.
@@ -263,7 +264,8 @@ rec {
263264
let
264265
self = {
265266
crates = lib.mapAttrs (packageId: value: buildByPackageIdForPkgsImpl self pkgs packageId) crateConfigs;
266-
target = makeTarget stdenv.hostPlatform;
267+
target = pkgs.stdenv.hostPlatform.rust.rustcTarget;
268+
targetSpec = makeTargetSpec pkgs.stdenv.hostPlatform;
267269
build = mkBuiltByPackageIdByPkgs pkgs.buildPackages;
268270
};
269271
in
@@ -281,7 +283,7 @@ rec {
281283
dependencies =
282284
dependencyDerivations {
283285
inherit features;
284-
inherit (self) target;
286+
inherit (self) target targetSpec;
285287
buildByPackageId = depPackageId:
286288
# proc_macro crates must be compiled for the build architecture
287289
if crateConfigs.${depPackageId}.procMacro or false
@@ -294,7 +296,7 @@ rec {
294296
buildDependencies =
295297
dependencyDerivations {
296298
inherit features;
297-
inherit (self.build) target;
299+
inherit (self.build) target targetSpec;
298300
buildByPackageId = depPackageId:
299301
self.build.crates.${depPackageId};
300302
dependencies = crateConfig.buildDependencies or [ ];
@@ -303,12 +305,12 @@ rec {
303305
let
304306
buildDeps = filterEnabledDependencies {
305307
inherit features;
306-
inherit (self) target;
308+
inherit (self) target targetSpec;
307309
dependencies = crateConfig.dependencies or [ ] ++ devDependencies;
308310
};
309311
hostDeps = filterEnabledDependencies {
310312
inherit features;
311-
inherit (self.build) target;
313+
inherit (self.build) target targetSpec;
312314
dependencies = crateConfig.buildDependencies or [ ];
313315
};
314316
in
@@ -362,13 +364,14 @@ rec {
362364
, features
363365
, dependencies
364366
, target
367+
, targetSpec
365368
}:
366369
assert (builtins.isList features);
367370
assert (builtins.isList dependencies);
368-
assert (builtins.isAttrs target);
371+
assert (builtins.isAttrs targetSpec);
369372
let
370373
enabledDependencies = filterEnabledDependencies {
371-
inherit dependencies features target;
374+
inherit dependencies features target targetSpec;
372375
};
373376
depDerivation = dependency: buildByPackageId dependency.packageId;
374377
in
@@ -387,7 +390,7 @@ rec {
387390
else val;
388391

389392
/* Returns various tools to debug a crate. */
390-
debugCrate = { packageId, target ? makeDefaultTarget stdenv.hostPlatform }:
393+
debugCrate = { packageId, target ? stdenv.hostPlatform.rust.rustcTarget, targetSpec ? makeDefaultTargetSpec stdenv.hostPlatform }:
391394
assert (builtins.isString packageId);
392395
let
393396
debug = rec {
@@ -410,10 +413,10 @@ rec {
410413
);
411414
mergedPackageFeatures = mergePackageFeatures {
412415
features = rootFeatures;
413-
inherit packageId target;
416+
inherit packageId target targetSpec;
414417
};
415418
diffedDefaultPackageFeatures = diffDefaultPackageFeatures {
416-
inherit packageId target;
419+
inherit packageId target targetSpec;
417420
};
418421
};
419422
in
@@ -428,14 +431,15 @@ rec {
428431
{ crateConfigs ? crates
429432
, packageId
430433
, target
434+
, targetSpec
431435
}:
432436
assert (builtins.isAttrs crateConfigs);
433437
let
434438
prefixValues = prefix: lib.mapAttrs (n: v: { "${prefix}" = v; });
435439
mergedFeatures =
436440
prefixValues
437441
"crate2nix"
438-
(mergePackageFeatures { inherit crateConfigs packageId target; features = [ "default" ]; });
442+
(mergePackageFeatures { inherit crateConfigs packageId target targetSpec; features = [ "default" ]; });
439443
configs = prefixValues "cargo" crateConfigs;
440444
combined = lib.foldAttrs (a: b: a // b) { } [ mergedFeatures configs ];
441445
onlyInCargo =
@@ -470,6 +474,7 @@ rec {
470474
, dependencyPath ? [ crates.${packageId}.crateName ]
471475
, featuresByPackageId ? { }
472476
, target
477+
, targetSpec
473478
# Adds devDependencies to the crate with rootPackageId.
474479
, runTests ? false
475480
, ...
@@ -480,7 +485,7 @@ rec {
480485
assert (builtins.isList features);
481486
assert (builtins.isList dependencyPath);
482487
assert (builtins.isAttrs featuresByPackageId);
483-
assert (builtins.isAttrs target);
488+
assert (builtins.isAttrs targetSpec);
484489
assert (builtins.isBool runTests);
485490
let
486491
crateConfig = crateConfigs."${packageId}" or (builtins.throw "Package not found: ${packageId}");
@@ -497,7 +502,7 @@ rec {
497502
assert (builtins.isList dependencies);
498503
let
499504
enabledDependencies = filterEnabledDependencies {
500-
inherit dependencies target;
505+
inherit dependencies target targetSpec;
501506
features = enabledFeatures;
502507
};
503508
directDependencies = map depWithResolvedFeatures enabledDependencies;
@@ -516,7 +521,7 @@ rec {
516521
mergePackageFeatures {
517522
features = combinedFeatures;
518523
featuresByPackageId = cache;
519-
inherit crateConfigs packageId target runTests rootPackageId;
524+
inherit crateConfigs packageId target targetSpec runTests rootPackageId;
520525
}
521526
);
522527
cacheWithSelf =
@@ -543,18 +548,19 @@ rec {
543548
cacheWithAll;
544549

545550
/* Returns the enabled dependencies given the enabled features. */
546-
filterEnabledDependencies = { dependencies, features, target }:
551+
filterEnabledDependencies = { dependencies, features, target, targetSpec }:
547552
assert (builtins.isList dependencies);
548553
assert (builtins.isList features);
549-
assert (builtins.isAttrs target);
554+
assert (builtins.isString target);
555+
assert (builtins.isAttrs targetSpec);
550556

551557
lib.filter
552558
(
553559
dep:
554560
let
555561
targetFunc = dep.target or (features: true);
556562
in
557-
targetFunc { inherit features target; }
563+
targetFunc { inherit features target targetSpec; }
558564
&& (
559565
!(dep.optional or false)
560566
|| builtins.any (doesFeatureEnableDependency dep) features

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ let
2424
dependencyDerivations = features: dependencies:
2525
crate2nix.dependencyDerivations {
2626
buildByPackageId = p: fakeCrates.${p};
27-
target = crate2nix.makeDefaultTarget stdenv.hostPlatform;
27+
target = stdenv.hostPlatform.rust.rustcTarget;
28+
targetSpec = crate2nix.makeDefaultTargetSpec stdenv.hostPlatform;
2829
inherit features dependencies;
2930
};
3031
in

crate2nix/templates/nix/crate2nix/tests/packageFeatures.nix

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ let
8787
packageId: features:
8888
crate2nix.mergePackageFeatures
8989
{
90-
target = crate2nix.makeDefaultTarget stdenv.hostPlatform;
90+
target = stdenv.hostPlatform.rust.rustcTarget;
91+
targetSpec = crate2nix.makeDefaultTargetSpec stdenv.hostPlatform;
9192
runTests = false;
9293
rootPackageId = packageId;
9394
inherit crateConfigs packageId features;

0 commit comments

Comments
 (0)