2021-01-02 00:14:43 +01:00
|
|
|
{ depot, pkgs, lib, ... }:
|
2021-01-01 18:55:33 +01:00
|
|
|
let
|
2021-03-25 22:50:28 +01:00
|
|
|
bins = depot.nix.getBins pkgs.s6-portable-utils ["s6-mkdir" "s6-cat" "s6-ln" "s6-ls" "s6-touch" ]
|
|
|
|
// depot.nix.getBins pkgs.coreutils ["printf" ];
|
2021-01-01 18:55:33 +01:00
|
|
|
|
2021-01-01 23:55:14 +01:00
|
|
|
inherit (depot.nix.yants) defun struct restrict attrs list string drv any;
|
|
|
|
|
2021-02-14 12:41:39 +01:00
|
|
|
inherit (depot.nix) drvSeqL;
|
|
|
|
|
2021-01-02 00:14:43 +01:00
|
|
|
FlakeError =
|
|
|
|
restrict
|
|
|
|
"flake error"
|
|
|
|
(s: lib.any (prefix: (builtins.substring 0 1 s) == prefix)
|
|
|
|
[ "E" "W" ])
|
|
|
|
string;
|
2021-01-01 23:55:14 +01:00
|
|
|
Libraries = defun [ (attrs any) (list drv) ];
|
2021-01-02 14:54:39 +01:00
|
|
|
|
|
|
|
python3 = {
|
|
|
|
name,
|
2021-01-01 20:00:51 +01:00
|
|
|
libraries ? (_: []),
|
|
|
|
flakeIgnore ? []
|
|
|
|
}: pkgs.writers.writePython3 name {
|
2021-01-01 23:55:14 +01:00
|
|
|
libraries = Libraries libraries pkgs.python3Packages;
|
2021-01-02 00:14:43 +01:00
|
|
|
flakeIgnore =
|
|
|
|
let ignoreTheseErrors = [
|
|
|
|
# whitespace after {
|
|
|
|
"E201"
|
|
|
|
# whitespace before }
|
|
|
|
"E202"
|
|
|
|
# fuck 4-space indentation
|
|
|
|
"E121" "E111"
|
|
|
|
# who cares about blank lines …
|
|
|
|
# … at end of files
|
|
|
|
"W391"
|
|
|
|
# … between functions
|
|
|
|
"E302" "E305"
|
|
|
|
];
|
|
|
|
in list FlakeError (ignoreTheseErrors ++ flakeIgnore);
|
2021-01-01 20:00:51 +01:00
|
|
|
};
|
|
|
|
|
2021-01-01 23:55:14 +01:00
|
|
|
# TODO: add the same flake check as the pyhon3 writer
|
2021-01-01 18:55:33 +01:00
|
|
|
python3Lib = { name, libraries ? (_: []) }: moduleString:
|
|
|
|
let srcTree = depot.nix.runExecline.local name { stdin = moduleString; } [
|
|
|
|
"importas" "out" "out"
|
2021-03-25 22:50:28 +01:00
|
|
|
"if" [ bins.s6-mkdir "-p" "\${out}/${name}" ]
|
2021-01-01 18:55:33 +01:00
|
|
|
"if" [
|
|
|
|
"redirfd" "-w" "1" "\${out}/setup.py"
|
|
|
|
bins.printf ''
|
|
|
|
from distutils.core import setup
|
|
|
|
|
|
|
|
setup(
|
|
|
|
name='%s',
|
|
|
|
packages=['%s']
|
|
|
|
)
|
|
|
|
'' name name
|
|
|
|
]
|
|
|
|
"if" [
|
|
|
|
# redirect stdin to the init py
|
|
|
|
"redirfd" "-w" "1" "\${out}/${name}/__init__.py"
|
2021-03-25 22:50:28 +01:00
|
|
|
bins.s6-cat
|
2021-01-01 18:55:33 +01:00
|
|
|
]
|
|
|
|
];
|
|
|
|
in pkgs.python3Packages.buildPythonPackage {
|
|
|
|
inherit name;
|
|
|
|
src = srcTree;
|
|
|
|
propagatedBuildInputs = libraries pkgs.python3Packages;
|
|
|
|
doCheck = false;
|
|
|
|
};
|
|
|
|
|
2021-01-02 14:54:39 +01:00
|
|
|
rustSimple = args@{name, ...}: src:
|
|
|
|
linkTo name "${rustSimpleBin args src}/bin/${name}";
|
|
|
|
|
|
|
|
linkTo = name: path: depot.nix.runExecline.local name {} [
|
|
|
|
"importas" "out" "out"
|
2021-03-25 22:50:28 +01:00
|
|
|
bins.s6-ln "-s" path "$out"
|
2021-01-02 14:54:39 +01:00
|
|
|
];
|
|
|
|
|
|
|
|
rustSimpleBin = {
|
|
|
|
name,
|
|
|
|
dependencies ? [],
|
2021-04-04 13:05:39 +02:00
|
|
|
doCheck ? true,
|
2021-01-02 14:54:39 +01:00
|
|
|
...
|
2021-04-04 13:05:39 +02:00
|
|
|
}@args: src:
|
|
|
|
(if doCheck then testRustSimple else pkgs.lib.id)
|
|
|
|
(pkgs.buildRustCrate ({
|
2021-01-02 14:54:39 +01:00
|
|
|
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-04 13:05:39 +02:00
|
|
|
} // args));
|
2021-01-02 14:54:39 +01:00
|
|
|
|
|
|
|
rustSimpleLib = {
|
|
|
|
name,
|
|
|
|
dependencies ? [],
|
2021-04-04 13:05:39 +02:00
|
|
|
doCheck ? true,
|
2021-01-02 14:54:39 +01:00
|
|
|
...
|
2021-04-04 13:05:39 +02:00
|
|
|
}@args: src:
|
|
|
|
(if doCheck then testRustSimple else pkgs.lib.id)
|
|
|
|
(pkgs.buildRustCrate ({
|
2021-01-02 14:54:39 +01:00
|
|
|
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-04 13:05:39 +02:00
|
|
|
} // args));
|
2021-01-02 14:54:39 +01:00
|
|
|
|
2021-02-14 12:41:39 +01: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" [
|
2021-03-25 22:50:28 +01:00
|
|
|
"pipeline" [ bins.s6-ls "${crate true}/tests" ]
|
2021-03-25 22:48:46 +01:00
|
|
|
"forstdin" "-o0" "test"
|
2021-02-14 12:41:39 +01:00
|
|
|
"importas" "test" "test"
|
|
|
|
"${crate true}/tests/$test"
|
|
|
|
]
|
2021-03-25 22:50:28 +01:00
|
|
|
bins.s6-touch "$out"
|
2021-02-14 12:41:39 +01:00
|
|
|
];
|
|
|
|
in drvSeqL [ tests ] (crate false);
|
|
|
|
|
2021-01-01 18:55:33 +01:00
|
|
|
in {
|
|
|
|
inherit
|
2021-01-01 20:00:51 +01:00
|
|
|
python3
|
2021-01-01 18:55:33 +01:00
|
|
|
python3Lib
|
2021-01-02 14:54:39 +01:00
|
|
|
rustSimple
|
|
|
|
rustSimpleBin
|
|
|
|
rustSimpleLib
|
2021-01-01 18:55:33 +01:00
|
|
|
;
|
|
|
|
}
|