blob: f08cf1293d731719dec361e7d0c7eba121d436f9 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
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"
'';
};
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/
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}";
in 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 = let
appended = ''
zkp = { path = "../../../guests/${guest}", package = "${guest}" }
[features]
guest = [] # Only used in jolt
no_std = ["zkp/no_std"]
'';
in ''
echo '${appended}' >> zkvms/${args.pname}/guest/Cargo.toml
'';
buildGuestPhase = ''
export INPUTS_DIR="$PWD/guests/${guest}"
export ZKVM="${args.pname}" GUEST="${guest}"
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}"
export ZKVM="${args.pname}" GUEST="${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/${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;
} // args // { inherit pname; });
}
|