feat(Profpatsch/writers): add rustSimple writers

A bunch of writer functions wrapping the `buildRustCrate`
functionality of nixpkgs. Can be used to write inline rust code, or
rust code read from files with `builtins.readFile`.

Change-Id: I9d74e9381b858b485925e4dc3fbb7fc392877c0a
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2318
Reviewed-by: tazjin <mail@tazj.in>
Reviewed-by: Profpatsch <mail@profpatsch.de>
Tested-by: BuildkiteCI
This commit is contained in:
Profpatsch 2021-01-02 14:54:39 +01:00
parent e219c13328
commit 1261616bff
4 changed files with 110 additions and 10 deletions

View file

@ -135,6 +135,7 @@ let
runCommandNoCC
rustPlatform
rustc
buildRustCrate
s6-portable-utils
sbcl
shellcheck

View file

@ -7,7 +7,8 @@ let
;
};
python-netstring-test = imports.writers.python3 "python-netstring" {
python-netstring-test = imports.writers.python3 {
name = "python-netstring";
libraries = p: [
python-netstring
];

View file

@ -1,6 +1,6 @@
{ depot, pkgs, lib, ... }:
let
bins = depot.nix.getBins pkgs.coreutils ["printf" "mkdir" "cat"];
bins = depot.nix.getBins pkgs.coreutils ["printf" "mkdir" "cat" "ln"];
inherit (depot.nix.yants) defun struct restrict attrs list string drv any;
@ -11,7 +11,9 @@ let
[ "E" "W" ])
string;
Libraries = defun [ (attrs any) (list drv) ];
python3 = name: {
python3 = {
name,
libraries ? (_: []),
flakeIgnore ? []
}: pkgs.writers.writePython3 name {
@ -62,12 +64,61 @@ 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.ln "-sT" path "$out"
];
rustSimpleBin = {
name,
dependencies ? [],
...
}@args: src: 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 ? [],
...
}@args: src: 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);
tests = import ./tests.nix {
inherit
depot
pkgs
python3
python3Lib
rustSimpleLib
rustSimple
;
};
@ -75,6 +126,9 @@ in {
inherit
python3
python3Lib
rustSimple
rustSimpleBin
rustSimpleLib
tests
;
}

View file

@ -1,31 +1,75 @@
{ depot, pkgs, python3, python3Lib }:
{ depot, pkgs, python3, python3Lib, rustSimpleLib, rustSimple }:
let
transitiveLib = python3Lib {
run = drv: depot.nix.runExecline.local "run-${drv.name}" {} [
"if" [ drv ]
"importas" "out" "out"
"${pkgs.coreutils}/bin/touch" "$out"
];
pythonTransitiveLib = python3Lib {
name = "transitive";
} ''
def transitive(s):
return s + " 1 2 3"
'';
testLib = python3Lib {
pythonTestLib = python3Lib {
name = "test_lib";
libraries = _: [ transitiveLib ];
libraries = _: [ pythonTransitiveLib ];
} ''
import transitive
def test():
return transitive.transitive("test")
'';
pythonWithLib = python3 "python-with-lib" {
libraries = _: [ testLib ];
pythonWithLib = run (python3 {
name = "python-with-lib";
libraries = _: [ pythonTestLib ];
} ''
import test_lib
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
}
'';
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 {
inherit
pythonWithLib;
pythonWithLib
rustTransitiveLib
rustWithLib
;
}