diff options
| -rw-r--r-- | flake.nix | 124 | ||||
| -rw-r--r-- | zkvmLib.nix | 118 |
2 files changed, 119 insertions, 123 deletions
@@ -25,135 +25,13 @@ craneLib-default = crane.mkLib pkgs; callPackage = pkgs.lib.callPackageWith pkgs; - fixDeps = commonArgs: commonArgs // { - postUnpack = '' - ${commonArgs.postUnpack or ""} - ln -s ../../../guests ./source/zkvms/${commonArgs.pname}/guest/ - ln -s ../../../guests_macro ./source/zkvms/${commonArgs.pname}/guest/ - ''; - - preBuild = '' - ${commonArgs.preBuild or ""} - cd zkvms/${commonArgs.pname}/host - cargo check --release --offline --all-targets - ''; - }; - - withGeneratedLockfile = guest: commonArgs: with pkgs; { - cargoVendorDir = craneLib-default.vendorCargoDeps { - src = stdenv.mkDerivation { - name = "cargolock"; - src = lib.fileset.toSource { - root = ./.; - fileset = ./.; - }; - - installPhase = '' - mkdir -p "$out" - cd zkvms/${commonArgs.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" - ''; - }; - }; - } // commonArgs; - - # Creates custom build and install phases - # Adds the "buildGuest" phase - # Adds the "run" pseudo-phase (running your zkVM is done with a shell script, - # this "phase" allows one to add things to the script) - # Requirements: - # - zkVM is inside zkvms/pname/ - # - guest crate is located at zkvms/pname/guest and is named "guest" - withCustomPhases = guest: currentPackage: let - hostBin = currentPackage.hostBin or ("host-" + currentPackage.pname); - in with currentPackage; { - 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/${currentPackage.pname}/guest/Cargo.toml - ''; - - buildGuestPhase = '' - pushd zkvms/${currentPackage.pname}/guest - runHook preBuildGuest - - ${currentPackage.buildGuestCommand or "cargo build --release"} \ - ${if currentPackage ? guestTarget then "--target " + currentPackage.guestTarget else ""} \ - ${currentPackage.guestExtraArgs or ""} - - ${if currentPackage ? guestTarget then "ln -s ../../guest/target/${currentPackage.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/${currentPackage.pname}/host - runHook preBuild - - cargo build --release - - runHook postBuild - popd - ''; - - installPhase = let - preRunBinaries = - if currentPackage ? preRunBinaries && builtins.length currentPackage.preRunBinaries > 0 then - "export PATH=\"\\$PATH:" + pkgs.lib.makeBinPath currentPackage.preRunBinaries + "\"" - else - ""; - preRunLibraries = - if currentPackage ? preRunLibraries && builtins.length currentPackage.preRunLibraries > 0 then - "export LD_LIBRARY_PATH=\"\\$LD_LIBRARY_PATH:" + pkgs.lib.makeLibraryPath currentPackage.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/${pname} - #!/usr/bin/env sh - ${preRunBinaries} - ${preRunLibraries} - ${currentPackage.preRun or ""} - "$out"/bin/${hostBin} \$@ - EOF - chmod +x "$out"/bin/${pname} - - runHook postInstall - ''; - - doNotPostBuildInstallCargoBinaries = true; - } // currentPackage; - createPackages = guestName: let guest = if guestName == null then "graph_coloring" else guestName; postfix = if guestName == null then "" else "/" + guest; args-zkVM = { inherit craneLib-default; - zkVM-helpers = { - inherit fixDeps; - withGeneratedLockfile = withGeneratedLockfile guest; - withCustomPhases = withCustomPhases guest; - }; + zkvmLib = (import ./zkvmLib.nix) pkgs guest; }; in { "risc0${postfix}" = callPackage ./zkvms/risc0/default.nix args-zkVM; 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); +} |
