diff options
| -rw-r--r-- | zkvmLib.nix | 235 |
1 files changed, 127 insertions, 108 deletions
diff --git a/zkvmLib.nix b/zkvmLib.nix index 74eb855..686071d 100644 --- a/zkvmLib.nix +++ b/zkvmLib.nix @@ -96,128 +96,147 @@ pkgs: guest: let { })); }; -in { - buildDepsOnly = craneLib: args: let - cargoLocks = generateCargoLocks craneLib args; - in craneLib.buildDepsOnly (cargoLocks // (builtins.removeAttrs args ["overrideVendorCargoPackage" "overrideVendorGitCheckout"]) // { - postUnpack = '' - ${args.postUnpack or ""} - ln -s ../../../guests ./source/zkvms/${args.pname}/guest/ - ln -s ../../../guests_macro ./source/zkvms/${args.pname}/guest/ - - cp '${cargoLocks.cargoLockDrv}/Cargo.lock' ./source/zkvms/${args.pname}/guest/Cargo.lock - chmod +w ./source/zkvms/${args.pname}/guest/Cargo.lock - ''; +in +{ + buildDepsOnly = craneLib: args: if builtins.pathExists ./guests/${guest}/.no_${args.pname} then + { } + else let + cargoLocks = generateCargoLocks craneLib args; + in craneLib.buildDepsOnly (cargoLocks // (builtins.removeAttrs args ["overrideVendorCargoPackage" "overrideVendorGitCheckout"]) // { + postUnpack = '' + ${args.postUnpack or ""} + ln -s ../../../guests ./source/zkvms/${args.pname}/guest/ + ln -s ../../../guests_macro ./source/zkvms/${args.pname}/guest/ + + cp '${cargoLocks.cargoLockDrv}/Cargo.lock' ./source/zkvms/${args.pname}/guest/Cargo.lock + chmod +w ./source/zkvms/${args.pname}/guest/Cargo.lock + ''; - preBuild = '' - ${args.preBuild or ""} - cd zkvms/${args.pname}/guest - cargo check --release --offline --all-targets - ''; - } // { - pname = "${args.pname}_${guest}"; - }); - - buildPackage = craneLib: args: let - pname = "${args.pname}_${guest}"; - cargoLocks = generateCargoLocks craneLib args; - in craneLib.buildPackage (cargoLocks // { - phases = [ - "unpackPhase" "patchPhase" "configurePhase" # Standard phases - "cargoSetupGuest" "buildGuestPhase" # Custom phases - "buildPhase" "checkPhase" "installPhase" "fixupPhase" # Standard phases - ]; - - cargoSetupGuest = let - appended = '' - [features] - guest = [] # Only used in jolt - no_std = ["zkp/no_std"] - ${args.pname} = ["zkp/${args.pname}"] - ''; - in '' - pushd zkvms/${args.pname}/guest + preBuild = '' + ${args.preBuild or ""} + cd zkvms/${args.pname}/guest + cargo check --release --offline --all-targets + ''; + } // { + pname = "${args.pname}_${guest}"; + }); + + buildPackage = craneLib: args: if builtins.pathExists ./guests/${guest}/.no_${args.pname} then + pkgs.writeShellApplication { + name = "${args.pname}_${guest}"; + + text = let + contents = builtins.readFile ./guests/${guest}/.no_${args.pname}; + in '' + echo 'Guest program "${guest}" has blacklisted ${args.pname} zkVM!' + + '' + (if builtins.stringLength contents > 1 then '' + echo + echo 'Reason:' + echo '${contents}' + '' else '' + ''); + } + else let + pname = "${args.pname}_${guest}"; + cargoLocks = generateCargoLocks craneLib args; + in craneLib.buildPackage (cargoLocks // { + phases = [ + "unpackPhase" "patchPhase" "configurePhase" # Standard phases + "cargoSetupGuest" "buildGuestPhase" # Custom phases + "buildPhase" "checkPhase" "installPhase" "fixupPhase" # Standard phases + ]; + + cargoSetupGuest = let + appended = '' + [features] + guest = [] # Only used in jolt + no_std = ["zkp/no_std"] + ${args.pname} = ["zkp/${args.pname}"] + ''; + in '' + pushd zkvms/${args.pname}/guest - cp '${cargoLocks.cargoLockDrv}/Cargo.lock' Cargo.lock - cargo add --path "../../../guests/${guest}" --rename zkp --offline - echo '${appended}' >> Cargo.toml + cp '${cargoLocks.cargoLockDrv}/Cargo.lock' Cargo.lock + cargo add --path "../../../guests/${guest}" --rename zkp --offline + echo '${appended}' >> Cargo.toml - popd - ''; + popd + ''; - buildGuestPhase = '' - export INPUTS_DIR="$PWD/guests/${guest}" - export ZKVM="${args.pname}" GUEST="${guest}" - OLD_PATH="$PATH" + buildGuestPhase = '' + export INPUTS_DIR="$PWD/guests/${guest}" + export ZKVM="${args.pname}" GUEST="${guest}" + OLD_PATH="$PATH" - ${if args ? guestToolchain then "export PATH=\"${args.guestToolchain}/bin:$PATH\"" else ""} + ${if args ? guestToolchain then "export PATH=\"${args.guestToolchain}/bin:$PATH\"" else ""} - pushd zkvms/${args.pname}/guest - runHook preBuildGuest + pushd zkvms/${args.pname}/guest + runHook preBuildGuest - ${args.buildGuestCommand or "cargo build --release --features ${args.pname}"} \ - ${if args ? guestTarget then "--target " + args.guestTarget else ""} \ - ${args.guestExtraArgs or ""} + ${args.buildGuestCommand or "cargo build --release --features ${args.pname}"} \ + ${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 - export PATH="$OLD_PATH" + ${if args ? guestTarget then "ln -s ../../guest/target/${args.guestTarget}/release/guest ../host/src/guest" else ""} + unset RUSTUP_TOOLCHAIN RUSTFLAGS CARGO_ENCODED_RUSTFLAGS + export PATH="$OLD_PATH" - runHook postBuildGuest - popd - ''; + runHook postBuildGuest + popd + ''; - buildPhase = '' - export INPUTS_DIR="$PWD/guests/${guest}" - export ZKVM="${args.pname}" GUEST="${guest}" - OLD_PATH="$PATH" + buildPhase = '' + export INPUTS_DIR="$PWD/guests/${guest}" + export ZKVM="${args.pname}" GUEST="${guest}" + OLD_PATH="$PATH" - ${if args ? hostToolchain then "export PATH=\"${args.hostToolchain}/bin:$PATH\"" else ""} + ${if args ? hostToolchain then "export PATH=\"${args.hostToolchain}/bin:$PATH\"" else ""} - pushd zkvms/${args.pname}/host - runHook preBuild + pushd zkvms/${args.pname}/host + runHook preBuild - cargo --version - cargo build --release + cargo --version + cargo build --release - export PATH="$OLD_PATH" + export PATH="$OLD_PATH" - runHook postBuild - popd - ''; + 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/${pname} - #!/usr/bin/env sh - ${preRunBinaries} - ${preRunLibraries} - ${args.preRun or ""} - "$out"/bin/host-${args.pname} \$@ - EOF - chmod +x "$out"/bin/${pname} - - runHook postInstall - ''; - - doNotPostBuildInstallCargoBinaries = true; - } // (builtins.removeAttrs args ["overrideVendorCargoPackage" "overrideVendorGitCheckout"]) // { inherit pname; }); + 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/${pname} + #!/usr/bin/env sh + ${preRunBinaries} + ${preRunLibraries} + ${args.preRun or ""} + "$out"/bin/host-${args.pname} \$@ + EOF + chmod +x "$out"/bin/${pname} + + runHook postInstall + ''; + + doNotPostBuildInstallCargoBinaries = true; + } // (builtins.removeAttrs args ["overrideVendorCargoPackage" "overrideVendorGitCheckout"]) // { inherit pname; }); } |
