aboutsummaryrefslogtreecommitdiff
path: root/zkvmLib.nix
diff options
context:
space:
mode:
authorKamen Mladenov <kamen@syndamia.com>2025-01-30 11:04:10 +0200
committerKamen Mladenov <kamen@syndamia.com>2025-01-30 11:04:10 +0200
commitee610f5476dbab5a25e2532e77cca165dd141d08 (patch)
tree39c1980aef2643966184b8a5230c931ed206b044 /zkvmLib.nix
parent142f5b90e5e04bcdebc9d631427b3f009113fe7a (diff)
downloadzkVMs-benchmarks-ee610f5476dbab5a25e2532e77cca165dd141d08.tar
zkVMs-benchmarks-ee610f5476dbab5a25e2532e77cca165dd141d08.tar.gz
zkVMs-benchmarks-ee610f5476dbab5a25e2532e77cca165dd141d08.zip
feat(flake): Replace zkVM-helpers with zkvmLib
Diffstat (limited to 'zkvmLib.nix')
-rw-r--r--zkvmLib.nix118
1 files changed, 118 insertions, 0 deletions
diff --git a/zkvmLib.nix b/zkvmLib.nix
new file mode 100644
index 0000000..15af3f2
--- /dev/null
+++ b/zkvmLib.nix
@@ -0,0 +1,118 @@
+pkgs: guest: let
+ generateCargoLocks = craneLib: args: rec {
+ cargoLockDrv = pkgs.stdenv.mkDerivation {
+ name = "CargoLocks-${args.pname}";
+ src = pkgs.lib.fileset.toSource {
+ root = ./.;
+ fileset = ./.;
+ };
+
+ installPhase = ''
+ mkdir -p "$out"
+ cd zkvms/${args.pname}
+
+ cat ./host/Cargo.lock > "$out/Cargo.lock"
+ tail -n +4 ./guest/Cargo.lock >> "$out/Cargo.lock"
+ tail -n +4 ../../guests/${guest}/Cargo.lock >> "$out/Cargo.lock"
+
+ cp ./guest/Cargo.lock "$out/Guest-Cargo.lock"
+ '';
+ };
+
+ cargoVendorDir = craneLib.vendorCargoDeps {
+ src = cargoLockDrv;
+ };
+ };
+in {
+ buildDepsOnly = craneLib: args: let
+ cargoLocks = generateCargoLocks craneLib args;
+ in craneLib.buildDepsOnly (cargoLocks // args // {
+ postUnpack = ''
+ ${args.postUnpack or ""}
+ ln -s ../../../guests ./source/zkvms/${args.pname}/guest/
+ ln -s ../../../guests_macro ./source/zkvms/${args.pname}/guest/
+ ln -s '${cargoLocks.cargoLockDrv}/Guest-Cargo.lock' ./source/zkvms/${args.pname}/guest/Cargo.lock
+ '';
+
+ preBuild = ''
+ ${args.preBuild or ""}
+ cd zkvms/${args.pname}/guest
+ cargo check --release --offline --all-targets
+ '';
+ });
+
+ buildPackage = craneLib: args: craneLib.buildPackage ((generateCargoLocks craneLib args) // {
+ phases = [
+ "unpackPhase" # Standard phases
+ "linkGuest" # Custom phase
+ "patchPhase" "configurePhase" # Standard phases
+ "buildGuestPhase" # Custom phase
+ "buildPhase" "checkPhase" "installPhase" "fixupPhase" # Standard phases
+ ];
+
+ linkGuest = ''
+ echo 'zkp = { path = "../../../guests/${guest}", package = "${guest}" }' >> zkvms/${args.pname}/guest/Cargo.toml
+ '';
+
+ buildGuestPhase = ''
+ pushd zkvms/${args.pname}/guest
+ runHook preBuildGuest
+
+ ${args.buildGuestCommand or "cargo build --release"} \
+ ${if args ? guestTarget then "--target " + args.guestTarget else ""} \
+ ${args.guestExtraArgs or ""}
+
+ ${if args ? guestTarget then "ln -s ../../guest/target/${args.guestTarget}/release/guest ../host/src/guest" else ""}
+ unset RUSTUP_TOOLCHAIN RUSTFLAGS CARGO_ENCODED_RUSTFLAGS
+
+ runHook postBuildGuest
+ popd
+ '';
+
+ buildPhase = ''
+ export INPUTS_DIR="$PWD/guests/${guest}"
+
+ pushd zkvms/${args.pname}/host
+ runHook preBuild
+
+ cargo build --release
+
+ runHook postBuild
+ popd
+ '';
+
+ installPhase = let
+ preRunBinaries =
+ if args ? preRunBinaries && builtins.length args.preRunBinaries > 0 then
+ "export PATH=\"\\$PATH:" + pkgs.lib.makeBinPath args.preRunBinaries + "\""
+ else
+ "";
+ preRunLibraries =
+ if args ? preRunLibraries && builtins.length args.preRunLibraries > 0 then
+ "export LD_LIBRARY_PATH=\"\\$LD_LIBRARY_PATH:" + pkgs.lib.makeLibraryPath args.preRunLibraries + "\""
+ else
+ "";
+ in ''
+ runHook preInstall
+
+ mkdir -p "$out"/bin
+ for bin in $(find . -type f -regex "./zkvms/.*release/[^/]*" -executable -print)
+ do
+ mv "$bin" "$out"/bin/
+ done
+
+ cat <<EOF > "$out"/bin/${args.pname}
+ #!/usr/bin/env sh
+ ${preRunBinaries}
+ ${preRunLibraries}
+ ${args.preRun or ""}
+ "$out"/bin/host-${args.pname} \$@
+ EOF
+ chmod +x "$out"/bin/${args.pname}
+
+ runHook postInstall
+ '';
+
+ doNotPostBuildInstallCargoBinaries = true;
+ } // args);
+}