aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--flake.nix124
-rw-r--r--zkvmLib.nix118
2 files changed, 119 insertions, 123 deletions
diff --git a/flake.nix b/flake.nix
index a6d8282..d59043f 100644
--- a/flake.nix
+++ b/flake.nix
@@ -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);
+}