1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
# Per-crate Rust builds with crate2nix.
#
# resolvedJson selects how the build plan is obtained:
# null (default) <src>/Cargo.json if present, else IFD from <src>/Cargo.lock
# a path that file (crate2nix generate --format json)
# false always IFD from <src>/Cargo.lock
#
# Overrides are attrs, or functions from the crate's buildRustCrate arguments
# to attrs, and are merged into those arguments before buildRustCrate sees
# them, so they can also set release. For a workspace member,
# workspaceOverride applies first and crateOverrides.<name> sees its result.
# nixpkgs' defaultCrateOverrides still apply inside buildRustCrate.
{ pkgs
, applyOverride
, name
, src
# crate name -> attrs or (args -> attrs)
, crateOverrides ? {}
# attrs or (args -> attrs), for every workspace member
, workspaceOverride ? {}
# IFD only; Cargo.json has its features baked in
, features ? [ "default" ]
, resolvedJson ? null
}:
let
resolvedJsonFromSrc = src + "/Cargo.json";
useJson =
if resolvedJson == null then builtins.pathExists resolvedJsonFromSrc
else resolvedJson != false;
resolvedJson' =
if resolvedJson != null then resolvedJson else resolvedJsonFromSrc;
workspaceMembers = builtins.attrNames cargoNix.workspaceMembers;
buildRustCrateForPkgs = pkgs: args:
let
withWorkspace =
if builtins.elem args.crateName workspaceMembers
then applyOverride workspaceOverride args
else args;
in
pkgs.buildRustCrate
(applyOverride (crateOverrides.${args.crateName} or {}) withWorkspace);
fromJson = pkgs.crate2nix.build-from-json {
inherit buildRustCrateForPkgs pkgs src;
resolvedJson = resolvedJson';
};
fromLock =
pkgs.callPackage
(pkgs.crate2nix.tools.generatedCargoNix {
inherit name src;
additionalCargoNixArgs = [ "--all-features" ];
})
{
rootFeatures = features;
inherit buildRustCrateForPkgs;
};
cargoNix =
if useJson then fromJson else fromLock;
in
cargoNix // {
build =
if cargoNix.rootCrate or null != null then cargoNix.rootCrate.build
else cargoNix.allWorkspaceMembers;
}
|