From eb41eef6127216543d8b28c9c423ac1be0a4ee24 Mon Sep 17 00:00:00 2001 From: Profpatsch Date: Fri, 23 Apr 2021 22:04:42 +0200 Subject: chore(nix): move rustSimple from users.Profpatsch.writers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I think it’s solid enough to use in a wider context. Change-Id: If53e8bbb6b90fa88d73fb42730db470e822ea182 Reviewed-on: https://cl.tvl.fyi/c/depot/+/3055 Tested-by: BuildkiteCI Reviewed-by: sterni Reviewed-by: lukegb --- nix/writers/default.nix | 97 ++++++++++++++++++++++++++++ nix/writers/tests/rust.nix | 68 +++++++++++++++++++ users/Profpatsch/arglib/netencode.nix | 2 +- users/Profpatsch/execline/default.nix | 2 +- users/Profpatsch/imap-idle.nix | 2 +- users/Profpatsch/netencode/default.nix | 19 ++---- users/Profpatsch/netstring/default.nix | 2 +- users/Profpatsch/netstring/tests/default.nix | 11 +--- users/Profpatsch/read-http.nix | 2 +- users/Profpatsch/tree-sitter.nix | 4 +- users/Profpatsch/writers/default.nix | 80 ----------------------- users/Profpatsch/writers/tests/default.nix | 49 -------------- users/sterni/nint/default.nix | 2 +- users/sterni/nix/utf8/tests/default.nix | 2 +- 14 files changed, 184 insertions(+), 158 deletions(-) create mode 100644 nix/writers/default.nix create mode 100644 nix/writers/tests/rust.nix diff --git a/nix/writers/default.nix b/nix/writers/default.nix new file mode 100644 index 0000000000..f43761865f --- /dev/null +++ b/nix/writers/default.nix @@ -0,0 +1,97 @@ +{ 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" + ]; + + # Build a rust executable. + # Takes all arguments that `pkgs.buildRustCrate` accepts. + # Rather leaky abstraction. + 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, + ... + }@args: src: + (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 + ''; + } // args)); + + # 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, + ... + }@args: src: + (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 + ''; + } // args)); + + /* 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 + ; +} diff --git a/nix/writers/tests/rust.nix b/nix/writers/tests/rust.nix new file mode 100644 index 0000000000..4b87676118 --- /dev/null +++ b/nix/writers/tests/rust.nix @@ -0,0 +1,68 @@ +{ depot, pkgs, ... }: + +let + inherit (depot.nix.writers) + rustSimple + rustSimpleLib + rustSimpleBin + ; + + inherit (pkgs) + coreutils + ; + + run = drv: depot.nix.runExecline.local "run-${drv.name}" {} [ + "if" [ drv ] + "importas" "out" "out" + "${coreutils}/bin/touch" "$out" + ]; + + rustTransitiveLib = rustSimpleLib { + name = "transitive"; + } '' + pub fn transitive(s: &str) -> String { + let mut new = s.to_string(); + new.push_str(" 1 2 3"); + new + } + + #[cfg(test)] + mod tests { + use super::*; + + #[test] + fn test_transitive() { + assert_eq!(transitive("foo").as_str(), "foo 1 2 3") + } + } + ''; + + rustTestLib = rustSimpleLib { + name = "test_lib"; + dependencies = [ rustTransitiveLib ]; + } '' + extern crate transitive; + use transitive::{transitive}; + pub fn test() -> String { + transitive("test") + } + ''; + + rustWithLib = run (rustSimple { + name = "rust-with-lib"; + dependencies = [ rustTestLib ]; + } '' + extern crate test_lib; + + fn main() { + assert_eq!(test_lib::test(), String::from("test 1 2 3")); + } + ''); + + +in depot.nix.utils.drvTargets { + inherit + rustTransitiveLib + rustWithLib + ; +} diff --git a/users/Profpatsch/arglib/netencode.nix b/users/Profpatsch/arglib/netencode.nix index 6b568ab80d..7712bbd5bb 100644 --- a/users/Profpatsch/arglib/netencode.nix +++ b/users/Profpatsch/arglib/netencode.nix @@ -2,7 +2,7 @@ let netencode = { - rust = depot.users.Profpatsch.writers.rustSimpleLib { + rust = depot.nix.writers.rustSimpleLib { name = "arglib-netencode"; dependencies = [ depot.users.Profpatsch.execline.exec-helpers diff --git a/users/Profpatsch/execline/default.nix b/users/Profpatsch/execline/default.nix index c852b82a86..2d1b911373 100644 --- a/users/Profpatsch/execline/default.nix +++ b/users/Profpatsch/execline/default.nix @@ -1,7 +1,7 @@ { depot, pkgs, lib, ... }: let - exec-helpers = depot.users.Profpatsch.writers.rustSimpleLib { + exec-helpers = depot.nix.writers.rustSimpleLib { name = "exec-helpers"; } (builtins.readFile ./exec_helpers.rs); diff --git a/users/Profpatsch/imap-idle.nix b/users/Profpatsch/imap-idle.nix index afd033533f..3ad5375d89 100644 --- a/users/Profpatsch/imap-idle.nix +++ b/users/Profpatsch/imap-idle.nix @@ -1,7 +1,7 @@ { depot, pkgs, lib, ... }: let - imap-idle = depot.users.Profpatsch.writers.rustSimple { + imap-idle = depot.nix.writers.rustSimple { name = "imap-idle"; dependencies = [ depot.users.Profpatsch.arglib.netencode.rust diff --git a/users/Profpatsch/netencode/default.nix b/users/Profpatsch/netencode/default.nix index 33209276f9..6662e622e1 100644 --- a/users/Profpatsch/netencode/default.nix +++ b/users/Profpatsch/netencode/default.nix @@ -1,12 +1,7 @@ { depot, pkgs, lib, ... }: let - imports = { - inherit (depot.users.Profpatsch) - writers; - }; - - netencode-rs = imports.writers.rustSimpleLib { + netencode-rs = depot.nix.writers.rustSimpleLib { name = "netencode"; dependencies = [ depot.third_party.rust-crates.nom @@ -18,14 +13,14 @@ let gen = import ./gen.nix { inherit lib; }; - pretty-rs = imports.writers.rustSimpleLib { + pretty-rs = depot.nix.writers.rustSimpleLib { name = "netencode-pretty"; dependencies = [ netencode-rs ]; } (builtins.readFile ./pretty.rs); - pretty = depot.users.Profpatsch.writers.rustSimple { + pretty = depot.nix.writers.rustSimple { name = "netencode-pretty"; dependencies = [ netencode-rs @@ -48,7 +43,7 @@ let } ''; - netencode-mustache = imports.writers.rustSimple { + netencode-mustache = depot.nix.writers.rustSimple { name = "netencode_mustache"; dependencies = [ depot.users.Profpatsch.arglib.netencode.rust @@ -58,7 +53,7 @@ let } (builtins.readFile ./netencode-mustache.rs); - record-get = imports.writers.rustSimple { + record-get = depot.nix.writers.rustSimple { name = "record-get"; dependencies = [ netencode-rs @@ -87,7 +82,7 @@ let } ''; - record-splice-env = imports.writers.rustSimple { + record-splice-env = depot.nix.writers.rustSimple { name = "record-splice-env"; dependencies = [ netencode-rs @@ -116,7 +111,7 @@ let } ''; - env-splice-record = imports.writers.rustSimple { + env-splice-record = depot.nix.writers.rustSimple { name = "env-splice-record"; dependencies = [ netencode-rs diff --git a/users/Profpatsch/netstring/default.nix b/users/Profpatsch/netstring/default.nix index 333244a0f7..2b21cde388 100644 --- a/users/Profpatsch/netstring/default.nix +++ b/users/Profpatsch/netstring/default.nix @@ -27,7 +27,7 @@ let return res ''; - rust-netstring = depot.users.Profpatsch.writers.rustSimpleLib { + rust-netstring = depot.nix.writers.rustSimpleLib { name = "netstring"; } '' pub fn to_netstring(s: &[u8]) -> Vec { diff --git a/users/Profpatsch/netstring/tests/default.nix b/users/Profpatsch/netstring/tests/default.nix index b9fb5835e5..f64beb9e92 100644 --- a/users/Profpatsch/netstring/tests/default.nix +++ b/users/Profpatsch/netstring/tests/default.nix @@ -2,15 +2,10 @@ let - inherit (depot.users.Profpatsch.netstring) - python-netstring - rust-netstring - ; - python-netstring-test = depot.users.Profpatsch.writers.python3 { name = "python-netstring-test"; libraries = p: [ - python-netstring + depot.users.Profpatsch.netstring.python-netstring ]; } '' import netstring @@ -38,10 +33,10 @@ let ) ''; - rust-netstring-test = depot.users.Profpatsch.writers.rustSimple { + rust-netstring-test = depot.nix.writers.rustSimple { name = "rust-netstring-test"; dependencies = [ - rust-netstring + depot.users.Profpatsch.netstring.rust-netstring ]; } '' extern crate netstring; diff --git a/users/Profpatsch/read-http.nix b/users/Profpatsch/read-http.nix index 2b7465dab8..854a11b7d0 100644 --- a/users/Profpatsch/read-http.nix +++ b/users/Profpatsch/read-http.nix @@ -2,7 +2,7 @@ let - read-http = depot.users.Profpatsch.writers.rustSimple { + read-http = depot.nix.writers.rustSimple { name = "read-http"; dependencies = [ depot.third_party.rust-crates.ascii diff --git a/users/Profpatsch/tree-sitter.nix b/users/Profpatsch/tree-sitter.nix index 101ee03d4f..1e3f378019 100644 --- a/users/Profpatsch/tree-sitter.nix +++ b/users/Profpatsch/tree-sitter.nix @@ -6,7 +6,7 @@ let // depot.nix.getBins pkgs.bc [ "bc" ] // depot.nix.getBins pkgs.ocamlPackages.sexp [ "sexp" ]; - print-ast = depot.users.Profpatsch.writers.rustSimple { + print-ast = depot.nix.writers.rustSimple { name = "print-ast"; dependencies = with depot.third_party.rust-crates; [ libloading @@ -58,7 +58,7 @@ let }; }; - watch-file-modified = depot.users.Profpatsch.writers.rustSimple { + watch-file-modified = depot.nix.writers.rustSimple { name = "watch-file-modified"; dependencies = [ depot.third_party.rust-crates.inotify diff --git a/users/Profpatsch/writers/default.nix b/users/Profpatsch/writers/default.nix index 3cb105b5ed..3151a9d3bd 100644 --- a/users/Profpatsch/writers/default.nix +++ b/users/Profpatsch/writers/default.nix @@ -67,90 +67,10 @@ let doCheck = false; }; - rustSimple = args@{name, ...}: src: - linkTo name "${rustSimpleBin args src}/bin/${name}"; - - linkTo = name: path: depot.nix.runExecline.local name {} [ - "importas" "out" "out" - bins.s6-ln "-s" path "$out" - ]; - - rustSimpleBin = { - name, - dependencies ? [], - doCheck ? true, - ... - }@args: src: - (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 - ''; - } // args)); - - rustSimpleLib = { - name, - dependencies ? [], - doCheck ? true, - ... - }@args: src: - (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 - ''; - } // args)); - - /* 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 drvSeqL [ tests ] (crate false); in { inherit python3 python3Lib - rustSimple - rustSimpleBin - rustSimpleLib ; } diff --git a/users/Profpatsch/writers/tests/default.nix b/users/Profpatsch/writers/tests/default.nix index e61bf482ee..c4769a28c6 100644 --- a/users/Profpatsch/writers/tests/default.nix +++ b/users/Profpatsch/writers/tests/default.nix @@ -4,9 +4,6 @@ let inherit (depot.users.Profpatsch.writers) python3Lib python3 - rustSimple - rustSimpleLib - rustSimpleBin ; inherit (pkgs) @@ -44,54 +41,8 @@ let assert(test_lib.test() == "test 1 2 3") ''); - - rustTransitiveLib = rustSimpleLib { - name = "transitive"; - } '' - pub fn transitive(s: &str) -> String { - let mut new = s.to_string(); - new.push_str(" 1 2 3"); - new - } - - #[cfg(test)] - mod tests { - use super::*; - - #[test] - fn test_transitive() { - assert_eq!(transitive("foo").as_str(), "foo 1 2 3") - } - } - ''; - - rustTestLib = rustSimpleLib { - name = "test_lib"; - dependencies = [ rustTransitiveLib ]; - } '' - extern crate transitive; - use transitive::{transitive}; - pub fn test() -> String { - transitive("test") - } - ''; - - rustWithLib = run (rustSimple { - name = "rust-with-lib"; - dependencies = [ rustTestLib ]; - } '' - extern crate test_lib; - - fn main() { - assert_eq!(test_lib::test(), String::from("test 1 2 3")); - } - ''); - - in depot.nix.utils.drvTargets { inherit pythonWithLib - rustTransitiveLib - rustWithLib ; } diff --git a/users/sterni/nint/default.nix b/users/sterni/nint/default.nix index a7952393c6..5cf83d15d6 100644 --- a/users/sterni/nint/default.nix +++ b/users/sterni/nint/default.nix @@ -1,7 +1,7 @@ { depot, pkgs, ... }: let - inherit (depot.users.Profpatsch.writers) + inherit (depot.nix.writers) rustSimpleBin ; in diff --git a/users/sterni/nix/utf8/tests/default.nix b/users/sterni/nix/utf8/tests/default.nix index 7569f8f071..ed38bd1241 100644 --- a/users/sterni/nix/utf8/tests/default.nix +++ b/users/sterni/nix/utf8/tests/default.nix @@ -14,7 +14,7 @@ let assertDoesNotThrow ; - inherit (depot.users.Profpatsch.writers) + inherit (depot.nix.writers) rustSimple ; -- cgit 1.4.1