2021-04-23 22:04:42 +02:00
|
|
|
{ depot, pkgs, lib, ... }:
|
|
|
|
|
|
|
|
let
|
|
|
|
bins = depot.nix.getBins pkgs.s6-portable-utils [ "s6-ln" "s6-ls" "s6-touch" ]
|
|
|
|
;
|
|
|
|
|
|
|
|
linkTo = name: path: depot.nix.runExecline.local name { } [
|
|
|
|
"importas"
|
|
|
|
"out"
|
|
|
|
"out"
|
|
|
|
bins.s6-ln
|
|
|
|
"-s"
|
|
|
|
path
|
|
|
|
"$out"
|
|
|
|
];
|
|
|
|
|
2021-04-24 13:32:52 +02:00
|
|
|
# Build a rust executable, $out is the executable.
|
2021-04-23 22:04:42 +02:00
|
|
|
rustSimple = args@{ name, ... }: src:
|
|
|
|
linkTo name "${rustSimpleBin args src}/bin/${name}";
|
|
|
|
|
|
|
|
# Like `rustSimple`, but put the binary in `$out/bin/`.
|
|
|
|
rustSimpleBin =
|
|
|
|
{ name
|
|
|
|
, dependencies ? [ ]
|
|
|
|
, doCheck ? true
|
2022-01-30 17:06:58 +01:00
|
|
|
,
|
2021-04-24 13:32:52 +02:00
|
|
|
}: src:
|
2021-04-23 22:04:42 +02:00
|
|
|
(if doCheck then testRustSimple else pkgs.lib.id)
|
|
|
|
(pkgs.buildRustCrate ({
|
|
|
|
pname = name;
|
|
|
|
version = "1.0.0";
|
|
|
|
crateName = name;
|
|
|
|
crateBin = [ name ];
|
|
|
|
dependencies = dependencies;
|
|
|
|
src = pkgs.runCommandLocal "write-main.rs"
|
|
|
|
{
|
|
|
|
src = src;
|
|
|
|
passAsFile = [ "src" ];
|
|
|
|
} ''
|
|
|
|
mkdir -p $out/src/bin
|
|
|
|
cp "$srcPath" $out/src/bin/${name}.rs
|
|
|
|
find $out
|
|
|
|
'';
|
2021-04-24 13:32:52 +02:00
|
|
|
}));
|
2021-04-23 22:04:42 +02:00
|
|
|
|
|
|
|
# Build a rust library, that can be used as dependency to `rustSimple`.
|
|
|
|
# Wrapper around `pkgs.buildRustCrate`, takes all its arguments.
|
|
|
|
rustSimpleLib =
|
|
|
|
{ name
|
|
|
|
, dependencies ? [ ]
|
|
|
|
, doCheck ? true
|
2022-01-30 17:06:58 +01:00
|
|
|
,
|
2021-04-24 13:32:52 +02:00
|
|
|
}: src:
|
2021-04-23 22:04:42 +02:00
|
|
|
(if doCheck then testRustSimple else pkgs.lib.id)
|
|
|
|
(pkgs.buildRustCrate ({
|
|
|
|
pname = name;
|
|
|
|
version = "1.0.0";
|
|
|
|
crateName = name;
|
|
|
|
dependencies = dependencies;
|
|
|
|
src = pkgs.runCommandLocal "write-lib.rs"
|
|
|
|
{
|
|
|
|
src = src;
|
|
|
|
passAsFile = [ "src" ];
|
|
|
|
} ''
|
|
|
|
mkdir -p $out/src
|
|
|
|
cp "$srcPath" $out/src/lib.rs
|
|
|
|
find $out
|
|
|
|
'';
|
2021-04-24 13:32:52 +02:00
|
|
|
}));
|
2021-04-23 22:04:42 +02:00
|
|
|
|
|
|
|
/* Takes a `buildRustCrate` derivation as an input,
|
|
|
|
* builds it with `{ buildTests = true; }` and runs
|
|
|
|
* all tests found in its `tests` dir. If they are
|
|
|
|
* all successful, `$out` will point to the crate
|
|
|
|
* built with `{ buildTests = false; }`, otherwise
|
|
|
|
* it will fail to build.
|
|
|
|
*
|
|
|
|
* See also `nix.drvSeqL` which is used to implement
|
|
|
|
* this behavior.
|
|
|
|
*/
|
|
|
|
testRustSimple = rustDrv:
|
|
|
|
let
|
|
|
|
crate = buildTests: rustDrv.override { inherit buildTests; };
|
|
|
|
tests = depot.nix.runExecline.local "${rustDrv.name}-tests-run" { } [
|
|
|
|
"importas"
|
|
|
|
"out"
|
|
|
|
"out"
|
|
|
|
"if"
|
|
|
|
[
|
|
|
|
"pipeline"
|
|
|
|
[ bins.s6-ls "${crate true}/tests" ]
|
|
|
|
"forstdin"
|
|
|
|
"-o0"
|
|
|
|
"test"
|
|
|
|
"importas"
|
|
|
|
"test"
|
|
|
|
"test"
|
|
|
|
"${crate true}/tests/$test"
|
|
|
|
]
|
|
|
|
bins.s6-touch
|
|
|
|
"$out"
|
|
|
|
];
|
|
|
|
in
|
|
|
|
depot.nix.drvSeqL [ tests ] (crate false);
|
|
|
|
|
|
|
|
in
|
|
|
|
{
|
|
|
|
inherit
|
|
|
|
rustSimple
|
|
|
|
rustSimpleBin
|
|
|
|
rustSimpleLib
|
|
|
|
;
|
|
|
|
}
|