refactor(web/tvixbolt): buildRustPackage -> crate2nix

With the recent changes to crate2nix and buildRustCrate in nixpkgs it is
now possible to build tvixbolt via crate2nix like we do for other tvix
crates. We can reuse a lot of the customizations done in //tvix in
tvixbolt to avoid repeating ourselves.

A script for serving tvixbolt locally for testing purposes is also
available now through the .serve attribute of tvixbolt.

This change supersedes https://cl.tvl.fyi/c/depot/+/11821.

Change-Id: I4864df8b75aec73cf5fee2428924ed4cfbb32902
Reviewed-on: https://cl.tvl.fyi/c/depot/+/11952
Tested-by: BuildkiteCI
Autosubmit: Ilan Joselevich <personal@ilanjoselevich.com>
Reviewed-by: flokli <flokli@flokli.de>
This commit is contained in:
Ilan Joselevich 2024-07-04 21:05:46 +03:00
parent 6a7069904e
commit 7ca32d9f0b
9 changed files with 4595 additions and 122 deletions

View file

@ -1,74 +1,30 @@
{ depot, lib, pkgs, ... }:
{ pkgs, lib, depot, ... }:
let
wasmRust = pkgs.rust-bin.stable.latest.default.override {
targets = [ "wasm32-unknown-unknown" ];
};
cargoToml = with builtins; fromTOML (readFile ./Cargo.toml);
wasmBindgenMatch =
cargoToml.dependencies.wasm-bindgen == "= ${pkgs.wasm-bindgen-cli.version}";
assertWasmBindgen = assert (lib.assertMsg wasmBindgenMatch ''
Due to instability in the Rust WASM ecosystem, the trunk build
tool enforces that the Cargo-dependency version of `wasm-bindgen`
MUST match the version of the CLI supplied in the environment.
This can get out of sync when nixpkgs is updated. To resolve it,
wasm-bindgen must be bumped in the Cargo.toml file and cargo needs
to be run to resolve the dependencies.
Versions of `wasm-bindgen` in Cargo.toml:
Expected: '= ${pkgs.wasm-bindgen-cli.version}'
Actual: '${cargoToml.dependencies.wasm-bindgen}'
''); pkgs.wasm-bindgen-cli;
deps = [
pkgs.binaryen
pkgs.sass
pkgs.trunk
wasmRust
assertWasmBindgen
];
# Cargo.toml needs to be patched with the /nix/store source path of
# tvix-eval.
cargoTomlPatch = pkgs.writeText "tvix-eval-src.patch" ''
diff --git a/Cargo.toml b/Cargo.toml
index 75006bec18..6ca244bbb2 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -16,7 +16,7 @@ rnix = "0.11.0"
wasm-bindgen = "= 0.2.83"
[dependencies.tvix-eval]
-path = "../../tvix/eval"
+path = "${../../tvix/eval}"
default-features = false
[dependencies.serde]
'';
pkgsCross = pkgs.pkgsCross.wasm32-unknown-none;
in
pkgs.rustPlatform.buildRustPackage rec {
pname = "tvixbolt";
version = "canon";
src = lib.cleanSource ./.;
(pkgsCross.callPackage ./Cargo.nix {
defaultCrateOverrides = (depot.tvix.utils.defaultCrateOverridesForPkgs pkgsCross) // {
tvixbolt = prev: {
src = depot.tvix.utils.filterRustCrateSrc { root = prev.src.origSrc; };
};
};
}).rootCrate.build.overrideAttrs (oldAttrs: {
installPhase = ''
${lib.getExe pkgs.wasm-bindgen-cli} \
--target web \
--out-dir $out \
--out-name ${oldAttrs.crateName} \
--no-typescript \
target/lib/${oldAttrs.crateName}-${oldAttrs.metadata}.wasm
cargoLock.lockFile = ./Cargo.lock;
patches = [
cargoTomlPatch
];
buildPhase = ''
export PATH=${lib.makeBinPath deps}:$PATH
mkdir home
export HOME=$PWD/home
trunk build --release -d $out
mv src/*.{html,css} $out
'';
dontInstall = true;
}
passthru.serve = pkgs.writeShellScriptBin "tvixbolt-serve" ''
${lib.getExe pkgs.simple-http-server} \
--index \
--nocache \
"$@" \
${depot.web.tvixbolt}
'';
})