Skip to content

Commit cb8121d

Browse files
committed
build kinds
1 parent f549328 commit cb8121d

File tree

8 files changed

+321
-164
lines changed

8 files changed

+321
-164
lines changed

crate2nix/Cargo.nix

Lines changed: 107 additions & 31 deletions
Large diffs are not rendered by default.

crate2nix/src/resolve.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! Resolve dependencies and other data for CrateDerivation.
2-
32
use anyhow::format_err;
3+
use anyhow::Context;
44
use anyhow::Error;
55
use cargo_metadata::Node;
66
use cargo_metadata::Package;
@@ -141,11 +141,16 @@ impl CrateDerivation {
141141
.iter()
142142
.any(|t| t.kind.iter().any(|k| k == "proc-macro"));
143143

144+
// Binaries have one kind:
145+
// https://github.com/rust-lang/cargo/blob/94394ebf2a6b6f1c1d6c160b48865a06e54d5f30/src/cargo/core/manifest.rs#L126
144146
let binaries = package
145147
.targets
146148
.iter()
147149
.filter_map(|t| {
148-
if t.kind.iter().any(|k| k == "bin") {
150+
if t.kind
151+
.iter()
152+
.any(|k| k == "bin" || k == "example" || k == "bench" || k == "test")
153+
{
149154
BuildTarget::new(&t, &package_path).ok()
150155
} else {
151156
None
@@ -333,23 +338,33 @@ pub fn double_crate_with_rename() {
333338
pub struct BuildTarget {
334339
/// The name of the build target.
335340
pub name: String,
341+
/// The kind of the build target.
342+
pub kind: String,
336343
/// The relative path of the target source file.
337344
pub src_path: PathBuf,
338345
/// The crate's features that need to be enabled for this target to be compiled.
339346
/// Otherwise, this target is ignored.
340347
pub required_features: Vec<String>,
348+
/// Whether to test this binary
349+
pub test: bool,
341350
}
342351

343352
impl BuildTarget {
344353
pub fn new(target: &Target, package_path: impl AsRef<Path>) -> Result<BuildTarget, Error> {
345354
Ok(BuildTarget {
346355
name: target.name.clone(),
356+
kind: target
357+
.kind
358+
.first()
359+
.context("Target shouuld have kind")?
360+
.to_string(),
347361
src_path: target
348362
.src_path
349363
.canonicalize()?
350364
.strip_prefix(&package_path)?
351365
.to_path_buf(),
352366
required_features: target.required_features.clone(),
367+
test: target.test,
353368
})
354369
}
355370
}

crate2nix/templates/Cargo.nix.tera

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,11 @@ rec {
106106
{
107107
name = {{ bin.name }};
108108
path = {{ bin.src_path }};
109+
kind = {{ bin.kind }};
110+
test = {{ bin.test }};
111+
# TODO (when cargo merges metadata):
112+
# harness
113+
# bench
109114
requiredFeatures = [ {% for feature in bin.required_features %}{{feature}} {% endfor %}];
110115
}
111116
{%- endfor %}

crate2nix/templates/nix/crate2nix/default.nix

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ rec {
110110
drv = testCrate.override
111111
(
112112
_: {
113-
buildTests = true;
113+
buildKinds = [ "test" ];
114114
}
115115
);
116116
# If the user hasn't set any pre/post commands, we don't want to
@@ -176,7 +176,8 @@ rec {
176176
, features ? rootFeatures
177177
, crateOverrides ? defaultCrateOverrides
178178
, buildRustCrateForPkgsFunc ? null
179-
, runTests ? false
179+
# Available: [ "lib" "bin" ] or ["test" "bench" "example"]
180+
, buildKinds ? [ "lib" "bin" ]
180181
, testCrateFlags ? [ ]
181182
, testInputs ? [ ]
182183
# Any command to run immediatelly before a test is executed.
@@ -188,13 +189,25 @@ rec {
188189
(
189190
{ features
190191
, crateOverrides
191-
, runTests
192+
, buildKinds
192193
, testCrateFlags
193194
, testInputs
194195
, testPreRun
195196
, testPostRun
196197
}:
197198
let
199+
isDevBuild =
200+
let
201+
inherit (pkgs.buildRustCrateHelpers.kinds) isLib isBin isExample isTest isBench;
202+
203+
notDev = builtins.any (k: isLib k || isBin k) buildKinds;
204+
isDev = builtins.any (k: isBench k || isExample k || isTest k) buildKinds;
205+
in
206+
assert (buildKinds != [ ]);
207+
# Can't have build dev and non dev kinds
208+
assert (notDev != isDev);
209+
isDev;
210+
198211
buildRustCrateForPkgsFuncOverriden =
199212
if buildRustCrateForPkgsFunc != null
200213
then buildRustCrateForPkgsFunc
@@ -207,31 +220,16 @@ rec {
207220
defaultCrateOverrides = crateOverrides;
208221
}
209222
);
223+
210224
builtRustCrates = builtRustCratesWithFeatures {
211-
inherit packageId features;
212-
buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden;
213-
runTests = false;
214-
};
215-
builtTestRustCrates = builtRustCratesWithFeatures {
216-
inherit packageId features;
225+
inherit packageId features buildKinds isDevBuild;
217226
buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden;
218-
runTests = true;
219227
};
220-
drv = builtRustCrates.crates.${packageId};
221-
testDrv = builtTestRustCrates.crates.${packageId};
222-
derivation =
223-
if runTests then
224-
crateWithTest
225-
{
226-
crate = drv;
227-
testCrate = testDrv;
228-
inherit testCrateFlags testInputs testPreRun testPostRun;
229-
}
230-
else drv;
228+
231229
in
232-
derivation
230+
builtRustCrates.crates.${packageId}
233231
)
234-
{ inherit features crateOverrides runTests testCrateFlags testInputs testPreRun testPostRun; };
232+
{ inherit features crateOverrides buildKinds testCrateFlags testInputs testPreRun testPostRun; };
235233

236234
/* Returns an attr set with packageId mapped to the result of buildRustCrateForPkgsFunc
237235
for the corresponding crate.
@@ -241,21 +239,24 @@ rec {
241239
, features
242240
, crateConfigs ? crates
243241
, buildRustCrateForPkgsFunc
244-
, runTests
242+
, buildKinds
243+
, isDevBuild
245244
, makeTarget ? makeDefaultTarget
246245
} @ args:
247246
assert (builtins.isAttrs crateConfigs);
248247
assert (builtins.isString packageId);
249248
assert (builtins.isList features);
250249
assert (builtins.isAttrs (makeTarget stdenv.hostPlatform));
251-
assert (builtins.isBool runTests);
250+
assert (builtins.isBool isDevBuild);
251+
assert (builtins.isList buildKinds);
252252
let
253253
rootPackageId = packageId;
254254
mergedFeatures = mergePackageFeatures
255255
(
256256
args // {
257257
inherit rootPackageId;
258-
target = makeTarget stdenv.hostPlatform // { test = runTests; };
258+
# What does test do for target?
259+
target = makeTarget stdenv.hostPlatform // { test = false; };
259260
}
260261
);
261262
# Memoize built packages so that reappearing packages are only built once.
@@ -277,7 +278,7 @@ rec {
277278
builtins.removeAttrs crateConfig' [ "resolvedDefaultFeatures" "devDependencies" ];
278279
devDependencies =
279280
lib.optionals
280-
(runTests && packageId == rootPackageId)
281+
(isDevBuild && packageId == rootPackageId)
281282
(crateConfig'.devDependencies or [ ]);
282283
dependencies =
283284
dependencyDerivations {
@@ -351,6 +352,7 @@ rec {
351352
}
352353
);
353354
extraRustcOpts = lib.lists.optional (targetFeatures != [ ]) "-C target-feature=${lib.concatMapStringsSep "," (x: "+${x}") targetFeatures}";
355+
buildKinds = if (packageId == rootPackageId) then buildKinds else [ "lib" ];
354356
inherit features dependencies buildDependencies crateRenames release;
355357
}
356358
);
@@ -472,7 +474,7 @@ rec {
472474
, featuresByPackageId ? { }
473475
, target
474476
# Adds devDependencies to the crate with rootPackageId.
475-
, runTests ? false
477+
, isDevBuild ? false
476478
, ...
477479
} @ args:
478480
assert (builtins.isAttrs crateConfigs);
@@ -482,7 +484,7 @@ rec {
482484
assert (builtins.isList dependencyPath);
483485
assert (builtins.isAttrs featuresByPackageId);
484486
assert (builtins.isAttrs target);
485-
assert (builtins.isBool runTests);
487+
assert (builtins.isBool isDevBuild);
486488
let
487489
crateConfig = crateConfigs."${packageId}" or (builtins.throw "Package not found: ${packageId}");
488490
expandedFeatures = expandFeatures (crateConfig.features or { }) features;
@@ -517,7 +519,7 @@ rec {
517519
mergePackageFeatures {
518520
features = combinedFeatures;
519521
featuresByPackageId = cache;
520-
inherit crateConfigs packageId target runTests rootPackageId;
522+
inherit crateConfigs packageId target isDevBuild rootPackageId;
521523
}
522524
);
523525
cacheWithSelf =
@@ -533,7 +535,7 @@ rec {
533535
(
534536
crateConfig.dependencies or [ ]
535537
++ lib.optionals
536-
(runTests && packageId == rootPackageId)
538+
(isDevBuild && packageId == rootPackageId)
537539
(crateConfig.devDependencies or [ ])
538540
);
539541
cacheWithAll =

nix/sources.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,15 @@
4848
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
4949
},
5050
"nixpkgs": {
51-
"branch": "nixos-unstable",
52-
"description": "A read-only mirror of NixOS/nixpkgs tracking the released channels. Send issues and PRs to",
53-
"homepage": "https://github.com/NixOS/nixpkgs",
54-
"owner": "NixOS",
51+
"branch": "brc-kinds",
52+
"description": "Nix Packages collection",
53+
"homepage": "",
54+
"owner": "jordanisaacs",
5555
"repo": "nixpkgs",
56-
"rev": "0c4800d579af4ed98ecc47d464a5e7b0870c4b1f",
57-
"sha256": "00gx09447gzgxlzwih4hdj51sdg62xanikkgr4bv4y7fpm98qirq",
56+
"rev": "80e5dddc787b05ec91188a58a00627542bfb5b90",
57+
"sha256": "0aaxkvmlr19963dr6z8bracjsjzyh3v6scn7wxqpixvfvmf9awql",
5858
"type": "tarball",
59-
"url": "https://github.com/NixOS/nixpkgs/archive/0c4800d579af4ed98ecc47d464a5e7b0870c4b1f.tar.gz",
59+
"url": "https://github.com/jordanisaacs/nixpkgs/archive/80e5dddc787b05ec91188a58a00627542bfb5b90.tar.gz",
6060
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
6161
},
6262
"nixpkgs-mozilla": {

0 commit comments

Comments
 (0)