difftreelog
chore re-run benchmarks
in: master
9 files changed
README.adocdiffbeforeafterboth69* https://github.com/google/jsonnet[C++];69* https://github.com/google/jsonnet[C++];70* https://github.com/google/go-jsonnet/[Go];70* https://github.com/google/go-jsonnet/[Go];71* https://github.com/databricks/sjsonnet[Scala].71* https://github.com/databricks/sjsonnet[Scala].72* [NEW] https://github.com/eduardosm/rsjsonnet[Another Rust impl appears].72* https://github.com/eduardosm/rsjsonnet[Another Rust impl appears].737374This implementation shows performance better than all existing implementations.74This implementation shows performance better than all existing implementations.75For more information see link:./docs/benchmarks.md[benchmarks]75For more information see link:./docs/benchmarks.adoc[benchmarks]767677Also, I wanted to experiment on new syntax features, and jrsonnet implements some of them.77Also, I wanted to experiment on new syntax features, and jrsonnet implements some of them.78For more information see link:./docs/features.adoc[features]78For more information see link:./docs/features.adoc[features]docs/benchmarks.adocdiffbeforeafterbothno changes
docs/benchmarks.mddiffbeforeafterbothno changes
nix/benchmarks.adocdiffbeforeafterbothno changes
nix/benchmarks.mddiffbeforeafterbothno changes
nix/benchmarks.nixdiffbeforeafterboth79 skipGo ? "",79 skipGo ? "",80 vendor ? "",80 vendor ? "",81 }:81 }:82 ''82 ''83 echo >> $out83 echo >> $out84 echo "### ${name}" >> $out84 echo "=== ${name}" >> $out85 echo >> $out85 echo >> $out86 ${optionalString (skipRustAlternative != "") ''86 ${optionalString (skipRustAlternative != "") ''87 echo "> Note: No results for Rust (alternative), ${skipRustAlternative}" >> $out87 echo "> Note: No results for Rust (alternative), ${skipRustAlternative}" >> $out88 echo >> $out88 echo >> $out89 ''}89 ''}90 ${optionalString (skipGo != "") ''90 ${optionalString (skipGo != "") ''91 echo "> Note: No results for Go, ${skipGo}" >> $out91 echo "> Note: No results for Go, ${skipGo}" >> $out92 echo >> $out92 echo >> $out93 ''}93 ''}94 ${optionalString (skipScala != "") ''94 ${optionalString (skipScala != "") ''95 echo "> Note: No results for Scala/Scala (native)/Scala (GraalVM), ${skipScala}" >> $out95 echo "> Note: No results for Scala (native)/Scala (GraalVM), ${skipScala}" >> $out96 echo >> $out96 echo >> $out97 ''}97 ''}98 ${optionalString (skipCpp != "") ''98 ${optionalString (skipCpp != "") ''99 echo "> Note: No results for C++, ${skipCpp}" >> $out99 echo "> Note: No results for C++, ${skipCpp}" >> $out100 echo >> $out100 echo >> $out101 ''}101 ''}102 ${optionalString (!quick && !omitSource) ''102 ${optionalString (!quick && !omitSource) ''103 echo "<details>" >> $out103 echo ".Source" >> $out104 echo "<summary>Source</summary>" >> $out104 echo "[%collapsible]" >> $out105 echo "====" >> $out105 echo >> $out106 echo "[source,jsonnet]" >> $out106 echo "\`\`\`jsonnet" >> $out107 echo "----" >> $out107 ${optionalString pathIsGenerator "echo \"// Generator source\" >> $out"}108 ${optionalString pathIsGenerator "echo \"// Generator source\" >> $out"}108 cat ${path} >> $out109 cat ${path} >> $out109 echo >> $out110 echo >> $out110 echo "\`\`\`" >> $out111 echo "----" >> $out111 echo "</details>" >> $out112 echo "====" >> $out112 echo >> $out113 echo >> $out113 ''}114 ''}114 path=${path}115 path=${path}115 ${optionalString pathIsGenerator ''116 ${optionalString pathIsGenerator ''116 go-jsonnet $path > generated.jsonnet117 go-jsonnet $path > generated.jsonnet117 path=generated.jsonnet118 path=generated.jsonnet118 ''}119 ''}119 hyperfine -N -w4 -m20 --output=pipe --style=basic --export-asciidoc result.adoc \120 hyperfine -N -w4 -m20 --output=pipe --style=basic --export-asciidoc result.adoc \120 ${121 ${121 concatStringsSep " " (122 concatStringsSep " " (122 forEach jrsonnetVariants (123 forEach jrsonnetVariants (123 variant:124 variant:124 "\"${variant.drv}/bin/jrsonnet $path${optionalString (vendor != "") " -J${vendor}"}\" -n \"Rust${125 "\"${variant.drv}/bin/jrsonnet $path${optionalString (vendor != "") " -J${vendor}"}\" -n \"Rust${125 if variant.name != "" then " (${variant.name})" else ""126 if variant.name != "" then " (${variant.name})" else ""126 }\""127 }\""127 )128 )128 )129 )129 } \130 } \130 ${131 ${131 optionalString (skipRustAlternative == "")132 optionalString (skipRustAlternative == "")132 "\"rsjsonnet $path${133 "\"rsjsonnet $path${133 optionalString (vendor != "") " -J ${vendor}"134 optionalString (vendor != "") " -J ${vendor}"134 }\" -n \"Rust (alternative, rsjsonnet)\""135 }\" -n \"Rust (alternative, rsjsonnet)\""135 } \136 } \136 ${137 ${137 optionalString (skipGo == "")138 optionalString (skipGo == "")138 "\"go-jsonnet $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"Go\""139 "\"go-jsonnet $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"Go\""139 } \140 ${141 optionalString (skipScala == "")142 "\"sjsonnet $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"Scala\""140 } \143 } \141 ${144 ${142 optionalString (skipScala == "")145 optionalString (skipScala == "")143 "\"sjsonnet-native $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"Scala (native)\""146 "\"sjsonnet-native $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"Scala (native)\""144 } \147 } \145 ${148 ${146 optionalString (skipScala == "")149 optionalString (skipScala == "")147 "\"sjsonnet-graalvm $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"Scala (GraalVM)\""150 "\"sjsonnet-graalvm $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"Scala (GraalVM)\""148 } \151 } \149 ${optionalString (skipCpp == "")152 ${optionalString (skipCpp == "")150 "\"jsonnet $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"C++\""153 "\"jsonnet $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"C++\""151 }154 }152 cat result.adoc >> $out155 cat result.adoc >> $out153 '';156 '';157 in154 in158 ''155 ''159 set -oux156 set -oux160157 ulimit -s unlimited158161 temp=$(mktemp -d)159 temp=$(mktemp -d)162 cd $temp160 cd $temp163161164 touch $out162 touch $out165 ${optionalString (!quick) ''163 ${optionalString (!quick) ''166 cat ${./benchmarks.md} >> $out164 cat ${./benchmarks.adoc} >> $out167 echo >> $out165 echo >> $out168166169 echo "<details>" >> $out167 echo "CPU: $(grep 'model name' /proc/cpuinfo | head -1 | cut -d: -f2 | xargs), $(grep -c '^processor' /proc/cpuinfo) threads" >> $out170 echo "<summary>Tested versions</summary>" >> $out171 echo >> $out172 echo Go: $(go-jsonnet --version) >> $out168 echo >> $out173 echo >> $out169174 echo "\`\`\`" >> $out170 echo ".Tested versions" >> $out175 go-jsonnet --help >> $out171 echo "[%collapsible]" >> $out176 echo "\`\`\`" >> $out172 echo "====" >> $out177 echo >> $out173 echo "* Go: $(go-jsonnet --version)" >> $out178 echo C++: $(jsonnet --version) >> $out174 echo "* C++: $(jsonnet --version)" >> $out179 echo >> $out180 echo "\`\`\`" >> $out181 jsonnet --help >> $out175 echo "* Scala (native/GraalVM): $(sjsonnet-native 2>&1 | grep -oP 'Sjsonnet \S+')" >> $out182 echo "\`\`\`" >> $out183 echo >> $out184 echo Scala: >> $out185 echo >> $out186 echo "\`\`\`" >> $out187 sjsonnet 2>> $out || true188 echo "\`\`\`" >> $out176 echo "* Rust (alternative): rsjsonnet ${rsjsonnet.version} (${rsjsonnet.src.rev})" >> $out189 echo >> $out190 echo "Scala (native):" >> $out191 echo >> $out192 echo "\`\`\`" >> $out177 ${concatStringsSep "\n" (forEach jrsonnetVariants (variant:193 sjsonnet-native 2>> $out || true194 echo "\`\`\`" >> $out195 echo >> $out196 echo "Scala (GraalVM):" >> $out178 "echo \"* Rust${if variant.name != "" then " (${variant.name})" else ""}: $(${variant.drv}/bin/jrsonnet --version 2>&1)\" >> $out"197 echo >> $out198 echo "\`\`\`" >> $out199 sjsonnet-graalvm 2>> $out || true200 echo "\`\`\`" >> $out201 echo >> $out202 echo "Rust (alternative):" >> $out203 echo >> $out204 echo "\`\`\`" >> $out205 rsjsonnet --help 2>> $out || true206 echo "\`\`\`" >> $out179 ))}207 echo >> $out180 echo "====" >> $out208 echo "</details>" >> $out181 echo >> $out209 echo >> $out182 ''}210211 echo >> $out212 ''}183 echo "== Real world" >> $out213 echo "## Real world" >> $out184 ${mkBench {214 ${mkBench {185 name = "Graalvm CI";215 name = "Graalvm CI";186 path = "${graalvmBench}/ci.jsonnet";216 path = "${graalvmBench}/ci.jsonnet";187 omitSource = true;217 omitSource = true;188 skipCpp = "takes longer than a hour";218 skipCpp = "takes longer than a hour";189 skipGo = skipSlow;219 skipGo = skipSlow;190 skipScala = skipSlow;220 skipScala = skipSlow;191 }}221 }}192 ${mkBench {222 ${mkBench {193 name = "Kube-prometheus manifests";223 name = "Kube-prometheus manifests";194 vendor = "${kubePrometheusBench}/vendor";224 vendor = "${kubePrometheusBench}/vendor";195 path = "${kubePrometheusBench}/example.jsonnet";225 path = "${kubePrometheusBench}/example.jsonnet";196 omitSource = true;226 omitSource = true;197 skipCpp = "too slow, takes hours, skews results";227 skipCpp = "too slow, takes hours, skews results";198 skipGo = skipSlow;228 skipGo = skipSlow;199 skipScala = skipSlow;229 skipScala = skipSlow;200 }}230 }}201231202 echo >> $out232 echo >> $out203 echo "== Benchmarks from C++ jsonnet (/perf_tests)" >> $out233 echo "## Benchmarks from C++ jsonnet (/perf_tests)" >> $out204 ${mkBench {234 ${mkBench {205 name = "Large string join";235 name = "Large string join";206 path = "${jsonnetBench}/perf_tests/large_string_join.jsonnet";236 path = "${jsonnetBench}/perf_tests/large_string_join.jsonnet";207 skipScala = skipSlow;237 skipScala = skipSlow;208 }}238 }}209 ${mkBench {239 ${mkBench {210 name = "Large string template";240 name = "Large string template";211 omitSource = true;241 omitSource = true;212 path = "${jsonnetBench}/perf_tests/large_string_template.jsonnet";242 path = "${jsonnetBench}/perf_tests/large_string_template.jsonnet";213 skipGo = "fails with os stack size exhausion";243 skipGo = "fails with os stack size exhausion";214 skipCpp = "too slow, takes hours, skews results";244 skipCpp = "too slow, takes hours, skews results";215 skipScala = skipSlow;245 skipScala = skipSlow;216 }}246 }}217 ${mkBench {247 ${mkBench {218 name = "Realistic 1";248 name = "Realistic 1";219 path = "${jsonnetBench}/perf_tests/realistic1.jsonnet";249 path = "${jsonnetBench}/perf_tests/realistic1.jsonnet";220 skipGo = skipSlow;250 skipGo = skipSlow;221 skipCpp = "too slow, takes hours, skews results";251 skipCpp = "too slow, takes hours, skews results";222 skipScala = skipSlow;252 skipScala = skipSlow;223 }}253 }}224 ${mkBench {254 ${mkBench {225 name = "Realistic 2";255 name = "Realistic 2";226 path = "${jsonnetBench}/perf_tests/realistic2.jsonnet";256 path = "${jsonnetBench}/perf_tests/realistic2.jsonnet";227 skipGo = skipSlow;257 skipGo = skipSlow;228 skipCpp = "too slow, takes hours, skews results";258 skipCpp = "too slow, takes hours, skews results";229 skipScala = skipSlow;259 skipScala = skipSlow;230 }}260 }}231261232 echo >> $out262 echo >> $out233 echo "== Benchmarks from C++ jsonnet (/benchmarks)" >> $out263 echo "## Benchmarks from C++ jsonnet (/benchmarks)" >> $out234 ${mkBench {264 ${mkBench {235 name = "Tail call";265 name = "Tail call";236 path = "${jsonnetBench}/benchmarks/bench.01.jsonnet";266 path = "${jsonnetBench}/benchmarks/bench.01.jsonnet";237 skipScala = skipSlow;267 skipScala = skipSlow;238 }}268 }}239 ${mkBench {269 ${mkBench {240 name = "Inheritance recursion";270 name = "Inheritance recursion";241 path = "${jsonnetBench}/benchmarks/bench.02.jsonnet";271 path = "${jsonnetBench}/benchmarks/bench.02.jsonnet";242 skipCpp = skipSlow;272 skipCpp = skipSlow;243 skipGo = skipSlow;273 skipGo = skipSlow;244 }}274 }}245 ${mkBench {275 ${mkBench {246 name = "Simple recursive call";276 name = "Simple recursive call";247 path = "${jsonnetBench}/benchmarks/bench.03.jsonnet";277 path = "${jsonnetBench}/benchmarks/bench.03.jsonnet";248 skipScala = skipSlow;278 skipScala = skipSlow;249 skipGo = skipSlow;279 skipGo = skipSlow;250 }}280 }}251 ${mkBench {281 ${mkBench {252 name = "Foldl string concat";282 name = "Foldl string concat";253 path = "${jsonnetBench}/benchmarks/bench.04.jsonnet";283 path = "${jsonnetBench}/benchmarks/bench.04.jsonnet";254 skipCpp = skipSlow;284 skipCpp = skipSlow;255 skipScala = skipSlow;285 skipScala = skipSlow;256 }}286 }}257 ${mkBench {287 ${mkBench {258 name = "Array sorts";288 name = "Array sorts";259 path = "${jsonnetBench}/benchmarks/bench.06.jsonnet";289 path = "${jsonnetBench}/benchmarks/bench.06.jsonnet";260 skipCpp = skipSlow;290 skipCpp = skipSlow;261 }}291 }}262 ${mkBench {292 ${mkBench {263 name = "Lazy array";293 name = "Lazy array";264 path = "${jsonnetBench}/benchmarks/bench.07.jsonnet";294 path = "${jsonnetBench}/benchmarks/bench.07.jsonnet";265 skipGo = skipSlow;295 skipGo = skipSlow;266 }}296 skipScala = skipSlow;297 }}267 ${mkBench {298 ${mkBench {268 name = "Inheritance function recursion";299 name = "Inheritance function recursion";269 path = "${jsonnetBench}/benchmarks/bench.08.jsonnet";300 path = "${jsonnetBench}/benchmarks/bench.08.jsonnet";270 skipCpp = skipSlow;301 skipCpp = skipSlow;271 skipScala = skipSlow;302 skipScala = skipSlow;272 }}303 }}273 ${mkBench {304 ${mkBench {274 name = "String strips";305 name = "String strips";275 path = "${jsonnetBench}/benchmarks/bench.09.jsonnet";306 path = "${jsonnetBench}/benchmarks/bench.09.jsonnet";276 skipCpp = "too slow, takes hours, skews results";307 skipCpp = "too slow, takes hours, skews results";277 skipScala = skipSlow;308 skipScala = skipSlow;278 }}309 }}279 ${mkBench {310 ${mkBench {280 name = "Big object";311 name = "Big object";281 path = "${jsonnetBench}/benchmarks/gen_big_object.jsonnet";312 path = "${jsonnetBench}/benchmarks/gen_big_object.jsonnet";282 pathIsGenerator = true;313 pathIsGenerator = true;283 skipScala = skipSlow;314 skipScala = skipSlow;284 }}315 }}285316286 echo >> $out317 echo >> $out287 echo "== Benchmarks from Go jsonnet (builtins)" >> $out318 echo "## Benchmarks from Go jsonnet (builtins)" >> $out288 ${mkBench {319 ${mkBench {289 name = "std.base64";320 name = "std.base64";290 path = "${goJsonnetBench}/base64.jsonnet";321 path = "${goJsonnetBench}/base64.jsonnet";291 skipRustAlternative = skipSlow;322 skipRustAlternative = skipSlow;292 skipCpp = "too slow, takes hours, skews results";323 skipCpp = "too slow, takes hours, skews results";293 skipScala = skipSlow;324 skipScala = skipSlow;294 }}325 }}295 ${mkBench {326 ${mkBench {296 name = "std.base64Decode";327 name = "std.base64Decode";297 path = "${goJsonnetBench}/base64Decode.jsonnet";328 path = "${goJsonnetBench}/base64Decode.jsonnet";298 skipRustAlternative = skipSlow;329 skipRustAlternative = skipSlow;299 skipCpp = skipSlow;330 skipCpp = skipSlow;300 skipScala = skipSlow;331 skipScala = skipSlow;301 }}332 }}302 ${mkBench {333 ${mkBench {303 name = "std.base64DecodeBytes";334 name = "std.base64DecodeBytes";304 path = "${goJsonnetBench}/base64DecodeBytes.jsonnet";335 path = "${goJsonnetBench}/base64DecodeBytes.jsonnet";305 skipRustAlternative = skipSlow;336 skipRustAlternative = skipSlow;306 skipCpp = skipSlow;337 skipCpp = skipSlow;307 skipGo = skipSlow;338 skipGo = skipSlow;308 skipScala = skipSlow;339 skipScala = skipSlow;309 }}340 }}310 ${mkBench {341 ${mkBench {311 name = "std.base64 (byte array)";342 name = "std.base64 (byte array)";312 path = "${goJsonnetBench}/base64_byte_array.jsonnet";343 path = "${goJsonnetBench}/base64_byte_array.jsonnet";313 skipRustAlternative = skipSlow;344 skipRustAlternative = skipSlow;314 skipCpp = skipSlow;345 skipCpp = skipSlow;315 skipGo = skipSlow;346 skipGo = skipSlow;316 skipScala = skipSlow;347 skipScala = skipSlow;317 }}348 }}318 ${mkBench {349 ${mkBench {319 name = "std.foldl";350 name = "std.foldl";320 path = "${goJsonnetBench}/foldl.jsonnet";351 path = "${goJsonnetBench}/foldl.jsonnet";321 skipScala = skipSlow;352 skipScala = skipSlow;322 }}353 }}323 ${mkBench {354 ${mkBench {324 name = "std.manifestJsonEx";355 name = "std.manifestJsonEx";325 path = "${goJsonnetBench}/manifestJsonEx.jsonnet";356 path = "${goJsonnetBench}/manifestJsonEx.jsonnet";326 skipScala = skipSlow;357 skipScala = skipSlow;327 skipCpp = skipSlow;358 skipCpp = skipSlow;328 }}359 }}329 ${mkBench {360 ${mkBench {330 name = "std.manifestTomlEx";361 name = "std.manifestTomlEx";331 path = "${goJsonnetBench}/manifestTomlEx.jsonnet";362 path = "${goJsonnetBench}/manifestTomlEx.jsonnet";332 skipCpp = skipSlow;363 skipCpp = skipSlow;333 }}364 }}334 ${mkBench {365 ${mkBench {335 name = "std.parseInt";366 name = "std.parseInt";336 path = "${goJsonnetBench}/parseInt.jsonnet";367 path = "${goJsonnetBench}/parseInt.jsonnet";337 skipScala = skipSlow;368 skipScala = skipSlow;338 skipCpp = skipSlow;369 skipCpp = skipSlow;339 }}370 }}340 ${mkBench {371 ${mkBench {341 name = "std.reverse";372 name = "std.reverse";342 path = "${goJsonnetBench}/reverse.jsonnet";373 path = "${goJsonnetBench}/reverse.jsonnet";343 skipCpp = skipSlow;374 skipCpp = skipSlow;344 skipGo = skipSlow;375 skipGo = skipSlow;345 }}376 }}346 ${mkBench {377 ${mkBench {347 name = "std.substr";378 name = "std.substr";348 path = "${goJsonnetBench}/substr.jsonnet";379 path = "${goJsonnetBench}/substr.jsonnet";349 skipScala = skipSlow;380 skipScala = skipSlow;350 }}381 }}351 ${mkBench {382 ${mkBench {352 name = "Comparsion for array";383 name = "Comparsion for array";353 path = "${goJsonnetBench}/comparison.jsonnet";384 path = "${goJsonnetBench}/comparison.jsonnet";354 skipCpp = "too slow, takes hours, skews results";385 skipCpp = "too slow, takes hours, skews results";355 }}386 }}356 ${mkBench {387 ${mkBench {357 name = "Comparsion for primitives";388 name = "Comparsion for primitives";358 path = "${goJsonnetBench}/comparison2.jsonnet";389 path = "${goJsonnetBench}/comparison2.jsonnet";359 skipRustAlternative = skipSlow;390 skipRustAlternative = skipSlow;360 skipCpp = "can't run: uses up to 192GB of RAM";391 skipCpp = "can't run: uses up to 192GB of RAM";361 skipGo = skipSlow;392 skipGo = skipSlow;362 skipScala = skipSlow;393 skipScala = skipSlow;363 }}394 }}364 '';395 '';396}365}397366nix/jrsonnet-release.nixdiffbeforeafterboth232324 buildInputs = [makeWrapper];24 buildInputs = [makeWrapper];252526 postInstall = ''26 postInstall = ''27 wrapProgram $out/bin/jrsonnet --add-flags "--max-stack=200000 --os-stack=200000"27 wrapProgram $out/bin/jrsonnet --add-flags "--max-stack=200000"28 '';28 '';29}29}3030nix/jrsonnet.nixdiffbeforeafterboth21 nativeBuildInputs = [makeWrapper];21 nativeBuildInputs = [makeWrapper];222223 # To clean-up hyperfine output23 # To clean-up hyperfine output24 postInstall = optionalString forBenchmarks ''24 postInstall = optionalString forBenchmarks ''25 wrapProgram $out/bin/jrsonnet --add-flags "--max-stack=200000 --os-stack=200000"25 wrapProgram $out/bin/jrsonnet --add-flags "--max-stack=200000"26 '';26 '';27 }27 }2828nix/sjsonnet.nixdiffbeforeafterboth57 buildInputs = [ java ]57 buildInputs = [ java ]58 ++ lib.optionals stdenv.hostPlatform.isLinux [ zlib openssl stdenv.cc.cc.lib ];58 ++ lib.optionals stdenv.hostPlatform.isLinux [ zlib openssl stdenv.cc.cc.lib ];595960 installPhase = ''60 installPhase = ''61 mkdir -p $out/bin $out/lib61 mkdir -p $out/bin $out/lib62 cp $src $out/lib/sjsonnet.jar62 cp $src $out/lib/sjsonnet.jar63 makeWrapper ${java}/bin/java $out/bin/sjsonnet --add-flags "-Xss100m -XX:+UseStringDeduplication -jar $out/lib/sjsonnet.jar"63 makeWrapper ${java}/bin/java $out/bin/sjsonnet --add-flags "-Xss100m -XX:+UseStringDeduplication -jar $out/lib/sjsonnet.jar --max-stack 200000"646465 cp ${nativeSrc} $out/bin/sjsonnet-native65 cp ${nativeSrc} $out/bin/sjsonnet-native66 chmod +x $out/bin/sjsonnet-native66 chmod +x $out/bin/sjsonnet-native67 wrapProgram $out/bin/sjsonnet-native --add-flags "--max-stack 200000"67 wrapProgram $out/bin/sjsonnet-native --add-flags "--max-stack 200000"686869 cp ${graalvmSrc} $out/bin/sjsonnet-graalvm69 cp ${graalvmSrc} $out/bin/sjsonnet-graalvm70 chmod +x $out/bin/sjsonnet-graalvm70 chmod +x $out/bin/sjsonnet-graalvm71 wrapProgram $out/bin/sjsonnet-graalvm --add-flags "--max-stack 200000"71 wrapProgram $out/bin/sjsonnet-graalvm --add-flags "--max-stack 200000"72 '';72 '';73 separateDebugInfo = false;73 separateDebugInfo = false;74}74}7575