6b7c936bc5
This switches the FUSE implementation from fuser to fuse-backend-rs. fuse-backend-rs is designed to work with both FUSE and virtiofs. Virtiofs support will make it possible to plug the tvix-store into a microvm and have `/nix/store` access without having to setup FUSE inside the guest. Additionally fuse-backend-rs has nice support for running multiple FUSE threads and has some async support. The goal of this commit is to mechanically switch over to fuse-backend-rs with minimal changes. I did have to add some locks here and there because fuse-backend-rs uses `&self` on all methods whereas fuser uses `&mut self`. `&self` is required for concurrent access to the FUSE server, so this makes sense. We can consider switching to concurrent maps and use some other techniques to reduce lock contention and critical section size. Issue: https://b.tvl.fyi/issues/305 Change-Id: Icde5a58c6eef98f8984c1e04e980b756dfb76b47 Reviewed-on: https://cl.tvl.fyi/c/depot/+/9341 Tested-by: BuildkiteCI Reviewed-by: flokli <flokli@flokli.de>
138 lines
3.9 KiB
Nix
138 lines
3.9 KiB
Nix
# Nix helpers for projects under //tvix
|
|
{ pkgs, lib, depot, ... }:
|
|
|
|
let
|
|
# crate override for crates that need protobuf
|
|
protobufDep = prev: (prev.nativeBuildInputs or [ ]) ++ [ pkgs.protobuf ];
|
|
iconvDarwinDep = lib.optionals pkgs.stdenv.isDarwin [ pkgs.libiconv ];
|
|
|
|
# Load the crate2nix crate tree.
|
|
crates = import ./Cargo.nix {
|
|
inherit pkgs;
|
|
nixpkgs = pkgs.path;
|
|
|
|
# Hack to fix Darwin build
|
|
# See https://github.com/NixOS/nixpkgs/issues/218712
|
|
buildRustCrateForPkgs = pkgs:
|
|
if pkgs.stdenv.isDarwin then
|
|
let
|
|
buildRustCrate = pkgs.buildRustCrate;
|
|
buildRustCrate_ = args: buildRustCrate args // { dontStrip = true; };
|
|
override = o: args: buildRustCrate.override o (args // { dontStrip = true; });
|
|
in
|
|
pkgs.makeOverridable override { }
|
|
else pkgs.buildRustCrate;
|
|
|
|
defaultCrateOverrides = pkgs.defaultCrateOverrides // {
|
|
zstd-sys = prev: {
|
|
nativeBuildInputs = prev.nativeBuildInputs or [ ] ++ iconvDarwinDep;
|
|
};
|
|
|
|
prost-build = prev: {
|
|
nativeBuildInputs = protobufDep prev;
|
|
};
|
|
|
|
tonic-reflection = prev: {
|
|
nativeBuildInputs = protobufDep prev;
|
|
};
|
|
|
|
tvix-store = prev: {
|
|
PROTO_ROOT = depot.tvix.store.protos;
|
|
nativeBuildInputs = protobufDep prev;
|
|
};
|
|
};
|
|
};
|
|
|
|
# Cargo dependencies to be used with nixpkgs rustPlatform functions.
|
|
cargoDeps = pkgs.rustPlatform.importCargoLock {
|
|
lockFile = ./Cargo.lock;
|
|
# Extract the hashes from `crates` / Cargo.nix, we already get them from cargo2nix.
|
|
# This returns an attribute set containing "${crateName}-${version}" as key,
|
|
# and the outputHash as value.
|
|
outputHashes = builtins.listToAttrs
|
|
(map
|
|
(crateName:
|
|
(lib.nameValuePair "${crateName}-${crates.internal.crates.${crateName}.version}" crates.internal.crates.${crateName}.src.outputHash)
|
|
) [
|
|
"fuse-backend-rs"
|
|
"test-generator"
|
|
"tonic-mock"
|
|
"wu-manber"
|
|
]);
|
|
};
|
|
in
|
|
{
|
|
inherit crates;
|
|
|
|
# Run crate2nix generate in the current working directory, then
|
|
# format the generated file with depotfmt.
|
|
crate2nixGenerate = pkgs.writeShellScriptBin "crate2nix-generate" ''
|
|
${pkgs.crate2nix}/bin/crate2nix generate
|
|
${depot.tools.depotfmt}/bin/depotfmt Cargo.nix
|
|
'';
|
|
|
|
# Provide the Tvix logo in both .webp and .png format.
|
|
logo = pkgs.runCommand "logo"
|
|
{
|
|
nativeBuildInputs = [ pkgs.imagemagick ];
|
|
} ''
|
|
mkdir -p $out
|
|
cp ${./logo.webp} $out/logo.webp
|
|
convert $out/logo.webp $out/logo.png
|
|
'';
|
|
|
|
# Provide a shell for the combined dependencies of all Tvix Rust
|
|
# projects. Note that as this is manually maintained it may be
|
|
# lacking something, but it is required for some people's workflows.
|
|
#
|
|
# This shell can be entered with e.g. `mg shell //tvix:shell`.
|
|
shell = pkgs.mkShell {
|
|
name = "tvix-rust-dev-env";
|
|
packages = [
|
|
pkgs.buf-language-server
|
|
pkgs.cargo
|
|
pkgs.clippy
|
|
pkgs.evans
|
|
pkgs.fuse
|
|
pkgs.pkg-config
|
|
pkgs.rust-analyzer
|
|
pkgs.rustc
|
|
pkgs.rustfmt
|
|
pkgs.protobuf
|
|
] ++ iconvDarwinDep;
|
|
};
|
|
|
|
# Builds and tests the code in store/protos.
|
|
store-protos-go = pkgs.buildGoModule {
|
|
name = "store-golang";
|
|
src = depot.third_party.gitignoreSource ./store/protos;
|
|
|
|
vendorHash = "sha256-7xfXBBU3xJz7ifjk7Owm/byTfCQ8oaZtqXzBKhLqo00=";
|
|
};
|
|
|
|
# Build the Rust documentation for publishing on docs.tvix.dev.
|
|
rust-docs = pkgs.stdenv.mkDerivation {
|
|
inherit cargoDeps;
|
|
name = "tvix-rust-docs";
|
|
src = depot.third_party.gitignoreSource ./.;
|
|
PROTO_ROOT = depot.tvix.store.protos;
|
|
|
|
buildInputs = [
|
|
pkgs.fuse
|
|
];
|
|
nativeBuildInputs = with pkgs; [
|
|
cargo
|
|
pkg-config
|
|
protobuf
|
|
rustc
|
|
rustPlatform.cargoSetupHook
|
|
] ++ iconvDarwinDep;
|
|
|
|
buildPhase = ''
|
|
cargo doc --document-private-items
|
|
mv target/doc $out
|
|
'';
|
|
};
|
|
|
|
meta.ci.targets = [ "store-protos-go" "shell" "rust-docs" ];
|
|
}
|