about summary refs log tree commit diff
path: root/tvix/default.nix
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2022-12-06T13·47+0300
committertazjin <tazjin@tvl.su>2022-12-15T17·26+0000
commitd9d627cdf0507e44f606519384fbebd726eb0593 (patch)
tree9dbe093db00ea5a49ca22e4d58493ec392773ce5 /tvix/default.nix
parent0fd956f2488899e3ef41065cc6e1e535cf962125 (diff)
refactor(tvix): share a Cargo.lock file between Rust projects r/5419
This relates to the (abandoned) cl/7256.

Introduces a Cargo workspace at //tvix that is primarily intended to
be used as a workaround for the annoying Nix+Rust tooling while having
a consistent set of dependencies.

This is driven in part by a desire to adopt crate2nix and get more
granular Nix builds for Tvix's Rust projects, and in part by a need to
split //tvix/eval into something providing the CLI (REPL etc.), and a
library providing eval, without significantly altering the structure
of build targets.

To accomplish this the workspace has been designed to allow projects
to remain independent build targets. I want to avoid lumping all the
projects together - something like //tvix/eval should always be
independent of other parts of tvix.

A helper function in //tvix/default.nix lets downstream naersk
projects construct a sparse root for the project which combines the
workspace's `Cargo.lock` with the project's own `Cargo.toml`.

Note that cargo commands in the workspace itself require the build
dependencies of _all_ projects to be present, which is currently a bit
annoying to accomplish.

This introduces some breakage:

1. It breaks usage of rust-analyser without being in a shell with the
   dependencies of *all* Tvix projects, as it is not capable of
   respecting only the subset of dependencies for a part of the
   workspace.

2. It is no longer possible to run tests using `cargo test`, as the
   test generation crate we use does not work with workspaces:

   https://github.com/frehberg/test-generator/issues/6

   This still works in the Nix build as we construct a Cargo project
   that looks like it's not in a workspace there. Until somebody fixes
   that crate / writes a new macro / does something else with the test
   suite, the way to run the tests is through the Nix build.

Long-term we'll probably want to get rid of cargo completely, it's
just a big wart and most tooling works without it if correctly
configured, but we don't have time for that now.

Change-Id: I846bff7a8429a25c077fd1e9ef4e3c34a299a4a1
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7533
Reviewed-by: flokli <flokli@flokli.de>
Autosubmit: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
Diffstat (limited to 'tvix/default.nix')
-rw-r--r--tvix/default.nix14
1 files changed, 14 insertions, 0 deletions
diff --git a/tvix/default.nix b/tvix/default.nix
new file mode 100644
index 000000000000..5b10748f3d29
--- /dev/null
+++ b/tvix/default.nix
@@ -0,0 +1,14 @@
+# Nix helpers for projects under //tvix
+
+{ pkgs, ... }:
+
+{
+  # Construct a sparse tree for naersk's `root` field, for
+  # compatibility with the workspace-workaround (see top-level comment
+  # in //tvix/Cargo.toml)
+  naerskRootFor = cargoToml: pkgs.runCommand "sparse-tvix-root" { } ''
+    mkdir $out
+    cp -aT ${./Cargo.lock} $out/Cargo.lock
+    cp -aT ${cargoToml} $out/Cargo.toml
+  '';
+}