diff options
| author | Kamen Mladenov <kamen@syndamia.com> | 2025-01-30 11:04:10 +0200 |
|---|---|---|
| committer | Kamen Mladenov <kamen@syndamia.com> | 2025-01-30 11:04:10 +0200 |
| commit | ee610f5476dbab5a25e2532e77cca165dd141d08 (patch) | |
| tree | 39c1980aef2643966184b8a5230c931ed206b044 /zkvmLib.nix | |
| parent | 142f5b90e5e04bcdebc9d631427b3f009113fe7a (diff) | |
| download | zkVMs-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.nix | 118 |
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); +} |
