dk1-quick-setup vs master · net diff 1f77823fb..60739ee81 · 28 files · generated 2026-09-20 21:50ZRead the full CLO.md adoption guide →
Adds dk, a Windows-friendly, incremental, remote cacheable build system, as a build path for ocamlearlybird. This is the Quick Setup branch: a from-source build of the full opam dependency closure. The OCaml toolchain (compiler, Dune, opam, build utilities) is prebuilt, and ocamlearlybird's own 53-package closure (lwt, dap, menhir, ppxlib, …) plus the in-tree earlybird package compile locally, each as its own cached dk object.
After cloning, a user needs one command (the vendored launcher self-installs):
./dk1 run-object NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 \
-s Release.execution_abi -m bin/ocamlearlybird.exe -- --help=plain
See CLO.md for the fully worked adoption guide (Users and Maintainers), including the six-command adoption sequence, the pin table delta, and the reason dap is held at {>= "1.0.6" & < "1.1.0"} on the 4.14.3 toolchain.
The dk packages this build depends on have been 100% AI generated and maintained since June 2026, and the dk build tool itself was hand built but AI assisted since June 2026.
Performance was measured on GitHub Actions runners with dk 2.4.3.22 and opam 2.5.2 (.github/workflows/measure-performance.yml, which also measures a conventional opam switch create + opam install . --deps-only + dune build on the same runners, compiler install included). The ± is the sample standard deviation over the mean; the dk numbers are the mean over 8 runs, and each opam and High Performance number the mean over 4:
| Step | dk Quick Setup | opam nocache + dune (desktop) | opam cache + dune |
|---|---|---|---|
| Linux: fresh checkout to a runnable binary | ~2 m 55 s ±6% | ~5 m 12 s ±10% | ~2 m 53 s ±3% |
| Linux: re-run the built binary | ~5 s ±17% | ~0.1 s ±10% | ~0.1 s ±10% |
| Linux: edit one file, rebuild | ~20 s ±12% | ~0.2 s ±8% | ~0.2 s ±8% |
| Windows: fresh checkout to a runnable binary | ~8 m 35 s ±9% | ~13 m 7 s ±15% | ~6 m 32 s ±3% |
| Windows: re-run the built binary | ~10 s ±9% | ~1.0 s ±19% | ~1.0 s ±19% |
| Windows: edit one file, rebuild | ~45 s ±11% | ~1.2 s ±18% | ~1.2 s ±18% |
What each fresh checkout figure includes. The columns reach a runnable binary through different work, and they also stop in different places, so the numbers are comparable only once both are named. The dk figure is one command, ./dk1 run-object ... -- --help=plain, and its timed region covers the vendored launcher self-installing the engine pinned in dk.u, the lazy fetch of the prebuilt toolchain objects, the build of the 53-package locked closure and the earlybird package, and then RUNNING the produced binary. Both opam figures run from a stamp taken after checkout, through setup-ocaml (switch create and compiler install) and opam install . --deps-only, to the end of dune build @install.
setup-ocaml has a cache: true mode (the default) which caches a portion of the opam state in a GitHub Actions cache. The nocache measurements disable the GitHub Actions cache, mimicking desktops that also do not have access to that cache.
The four rows that are not a fresh checkout repeat across both opam columns, and are pooled over all eight runs. The cache holds the compiler and the switch, not this project's dependencies, so opam install . --deps-only costs about the same either way. Splitting those rows would publish noise as a distinction.
The dk1-high-performance branch stacks on this one and requires GitHub Actions to maintain a per-ABI datastore of built objects for the 53-package closure, so a consumer fetches every opam package object prebuilt:
| Step | dk High Performance (dk1-high-performance) | Quick Setup, for comparison |
|---|---|---|
| Linux: fresh checkout to a runnable binary | ~1 m 31 s ±20% | ~2 m 55 s ±6% |
| Linux: re-run the built binary | ~5 s ±12% | ~5 s ±17% |
| Windows: fresh checkout to a runnable binary | ~2 m 31 s ±13% | ~8 m 35 s ±9% |
| Windows: re-run the built binary | ~12 s ±6% | ~10 s ±9% |
dk0/dk1/dk0.cmd/dk1.cmd: vendored self-installing launchers, pinned to dk engine 2.4.3.22dk.u: workspace script with the pinned CommonsLang_OCaml toolchain import and source-tree asset checksumsdune-project, earlybird.opam: the build inputs the dk recipe consumesdk-opam-pins.txt, dk.opam-lock.jsonc: the solver pin table and the solved per-slot dependency lockdk-src/dune-workspace: the dune workspace root marker staged into the assembled sourcesrc/adapter/state_initialized.ml: the one source adjustment the build needsetc/dk/v/NotHackwaly_Ocamlearlybird/*.values.jsonc: the generated localized-source form, the generated one-line closure driver (OpamBuild F_BuildLockedClosure), and the generated thin final form exposing bin/ocamlearlybirdetc/dk/t/: trust records (acceptances and capability grants) recorded by the quickstart from the recipe's declared trust statementsetc/dk/i/: verified import records and the closure manifest.github/workflows/measure-performance.yml: the dk-and-opam timing matrix behind the table above.github/workflows/repin-engine.yml: repins the engine and CommonsLang_OCaml on a hosted runnerscripts/check-measurement-complete.mjs, scripts/expected-measurement.json: the gate that fails the workflow if any expected slot's measurement is missing.gitattributes: LF policy on the dk assets. dk hashes raw bytes, so a CRLF checkout on Windows would break asset verification.CLO.md: the adoption guideThe change is additive. The existing dune/opam/esy workflows continue to work unchanged.
|
@@ -1,2 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
*.webp filter=lfs diff=lfs merge=lfs -text
|
| 2 |
*.gif filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Line-ending policy.
|
| 2 |
+
#
|
| 3 |
+
# Every workspace asset (the dune files, the
|
| 4 |
+
# src/ tree, the opam lock, the *.u scripts) is hashed by its raw bytes and that
|
| 5 |
+
# hash is pinned in dk.u and etc/dk. The hashes are computed with LF endings, so
|
| 6 |
+
# the working tree must check out LF on every platform. Without this file a
|
| 7 |
+
# Windows checkout with core.autocrlf=true rewrites the assets to CRLF and
|
| 8 |
+
# `dk1 run-object` fails asset verification (unexpected SHA256). The Windows
|
| 9 |
+
# launchers (*.cmd/*.bat/*.ps1) must stay CRLF.
|
| 10 |
+
|
| 11 |
+
# Normalize text in the repository; native endings on checkout unless overridden.
|
| 12 |
+
* text=auto
|
| 13 |
+
|
| 14 |
+
# Git LFS media.
|
| 15 |
*.webp filter=lfs diff=lfs merge=lfs -text
|
| 16 |
*.gif filter=lfs diff=lfs merge=lfs -text
|
| 17 |
+
|
| 18 |
+
# Always LF on checkout: the dk-hashed assets plus OCaml/dune sources.
|
| 19 |
+
dune text eol=lf
|
| 20 |
+
dune-project text eol=lf
|
| 21 |
+
dune-workspace text eol=lf
|
| 22 |
+
*.dune text eol=lf
|
| 23 |
+
*.ml text eol=lf
|
| 24 |
+
*.mli text eol=lf
|
| 25 |
+
*.mll text eol=lf
|
| 26 |
+
*.mly text eol=lf
|
| 27 |
+
opam text eol=lf
|
| 28 |
+
*.opam text eol=lf
|
| 29 |
+
*.opam.template text eol=lf
|
| 30 |
+
*.json text eol=lf
|
| 31 |
+
*.jsonc text eol=lf
|
| 32 |
+
*.u text eol=lf
|
| 33 |
+
*.t text eol=lf
|
| 34 |
+
*.sh text eol=lf
|
| 35 |
+
*.patch text eol=lf
|
| 36 |
+
*.sexp text eol=lf
|
| 37 |
+
*.pub text eol=lf
|
| 38 |
+
*.sec text eol=lf
|
| 39 |
+
*.sig text eol=lf
|
| 40 |
+
dk text eol=lf
|
| 41 |
+
dk0 text eol=lf
|
| 42 |
+
dk1 text eol=lf
|
| 43 |
+
configure text eol=lf
|
| 44 |
+
Makefile text eol=lf
|
| 45 |
+
|
| 46 |
+
# Always CRLF on checkout: Windows launchers/scripts.
|
| 47 |
+
*.bat text eol=crlf
|
| 48 |
+
*.cmd text eol=crlf
|
| 49 |
+
*.ps1 text working-tree-encoding=UTF-8 eol=crlf
|
| 50 |
+
*.psm1 text working-tree-encoding=UTF-8 eol=crlf
|
| 51 |
+
*.sln text eol=crlf
|
|
@@ -0,0 +1,251 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
name: measure-performance
|
| 2 |
+
# Head-to-head opam-vs-dk timing for the Quick Setup tier, which builds the
|
| 3 |
+
# dependency closure from source, on Linux_x86_64 (ubuntu-latest) and
|
| 4 |
+
# Windows_x86_64 (windows-latest). Each runner measures the host ABI natively.
|
| 5 |
+
# Trigger from the Actions tab (workflow_dispatch) or by pushing a perf-* tag;
|
| 6 |
+
# the perf workflow never runs on push or pull_request, so it stays off the PR
|
| 7 |
+
# status checks.
|
| 8 |
+
#
|
| 9 |
+
# Every timed step prints `PHASE <name> ms=<n>` lines and a final SUMMARY line.
|
| 10 |
+
# The dk track and the opam track produce the same runnable binary, so their
|
| 11 |
+
# SUMMARY lines are directly comparable:
|
| 12 |
+
# dk fresh -> binary : dk_build_cold (compiles the whole closure)
|
| 13 |
+
# opam fresh -> binary : (setup-ocaml step) + opam_deps + opam_build_cold
|
| 14 |
+
# dk re-run a binary : dk_run_warm
|
| 15 |
+
# opam re-run a binary : opam_run_warm
|
| 16 |
+
# dk edit one file : dk_run_edit (rebuilds the leaf package object)
|
| 17 |
+
# opam edit one file : opam_build_edit (dune's file-level incremental)
|
| 18 |
+
on:
|
| 19 |
+
workflow_dispatch:
|
| 20 |
+
inputs:
|
| 21 |
+
opam_cache:
|
| 22 |
+
description: >-
|
| 23 |
+
Whether setup-ocaml may restore its opam switch from the Actions cache.
|
| 24 |
+
Leave it at true for an ordinary run. Set it to false to measure the
|
| 25 |
+
cold-cache side of the opam track: this input is the only thing that
|
| 26 |
+
separates the two modes, and the published fresh checkout figure differs
|
| 27 |
+
by roughly a factor of two between them.
|
| 28 |
+
type: choice
|
| 29 |
+
options:
|
| 30 |
+
- 'true'
|
| 31 |
+
- 'false'
|
| 32 |
+
default: 'true'
|
| 33 |
+
push:
|
| 34 |
+
tags:
|
| 35 |
+
- 'perf-*'
|
| 36 |
+
|
| 37 |
+
jobs:
|
| 38 |
+
dk:
|
| 39 |
+
strategy:
|
| 40 |
+
fail-fast: false
|
| 41 |
+
matrix:
|
| 42 |
+
include:
|
| 43 |
+
- os: ubuntu-latest
|
| 44 |
+
slot: Release.Linux_x86_64
|
| 45 |
+
- os: windows-latest
|
| 46 |
+
slot: Release.Windows_x86_64
|
| 47 |
+
runs-on: ${{ matrix.os }}
|
| 48 |
+
# A cold from-source closure build plus native compilation; give the job
|
| 49 |
+
# generous headroom over the default and the ci.yml jobs.
|
| 50 |
+
timeout-minutes: 90
|
| 51 |
+
steps:
|
| 52 |
+
- name: Checkout repository
|
| 53 |
+
uses: actions/checkout@v7
|
| 54 |
+
with:
|
| 55 |
+
lfs: true
|
| 56 |
+
|
| 57 |
+
# Linux uses the POSIX ./dk1 launcher (curl is present) and date-based
|
| 58 |
+
# millisecond timing.
|
| 59 |
+
- name: dk cold build + warm run + edit rebuild (timed, Linux)
|
| 60 |
+
if: runner.os == 'Linux'
|
| 61 |
+
shell: bash
|
| 62 |
+
run: |
|
| 63 |
+
set -euo pipefail
|
| 64 |
+
now() { date +%s%3N; }
|
| 65 |
+
slot='${{ matrix.slot }}'
|
| 66 |
+
run() { ./dk1 run-object NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 \
|
| 67 |
+
-s "$slot" -m ./bin/ocamlearlybird.exe -- --help=plain >/dev/null; }
|
| 68 |
+
echo "DK MEASURE STARTED $(date -u +%H:%M:%S) slot=$slot"
|
| 69 |
+
|
| 70 |
+
a=$(now); run; b=$(now)
|
| 71 |
+
echo "PHASE dk_build_cold ms=$((b-a))"
|
| 72 |
+
|
| 73 |
+
c=$(now); run; d=$(now)
|
| 74 |
+
echo "PHASE dk_run_warm ms=$((d-c))"
|
| 75 |
+
|
| 76 |
+
printf '\n(* perf measurement touch *)\n' >> src/main/main.ml
|
| 77 |
+
./dk1 update --no-imports
|
| 78 |
+
e=$(now); run; f=$(now)
|
| 79 |
+
echo "PHASE dk_run_edit ms=$((f-e))"
|
| 80 |
+
|
| 81 |
+
echo "DK SUMMARY slot=$slot build_cold_ms=$((b-a)) run_warm_ms=$((d-c)) run_edit_ms=$((f-e))"
|
| 82 |
+
echo "DK MEASURE DONE $(date -u +%H:%M:%S)"
|
| 83 |
+
|
| 84 |
+
# The same three readings, machine readable, for the gate job. Written
|
| 85 |
+
# AFTER every stopwatch has stopped and outside the working tree, so it
|
| 86 |
+
# cannot move a number: an earlier repair to this workflow moved console
|
| 87 |
+
# writes inside a stopwatch and widened five of six Windows cells.
|
| 88 |
+
mkdir -p "$RUNNER_TEMP/dk-phases"
|
| 89 |
+
printf 'dk_build_cold=%s\ndk_run_warm=%s\ndk_run_edit=%s\n' \
|
| 90 |
+
"$((b-a))" "$((d-c))" "$((f-e))" > "$RUNNER_TEMP/dk-phases/$slot.txt"
|
| 91 |
+
|
| 92 |
+
- name: Upload this slot's readings for the gate
|
| 93 |
+
if: ${{ always() && runner.os == 'Linux' }}
|
| 94 |
+
uses: actions/upload-artifact@v4
|
| 95 |
+
with:
|
| 96 |
+
name: dk-phases-${{ matrix.slot }}
|
| 97 |
+
path: ${{ runner.temp }}/dk-phases
|
| 98 |
+
if-no-files-found: ignore
|
| 99 |
+
|
| 100 |
+
# Windows uses the dk1.cmd launcher (bootstraps via PowerShell, no curl
|
| 101 |
+
# dependency) and Stopwatch timing.
|
| 102 |
+
- name: dk cold build + warm run + edit rebuild (timed, Windows)
|
| 103 |
+
if: runner.os == 'Windows'
|
| 104 |
+
shell: pwsh
|
| 105 |
+
run: |
|
| 106 |
+
$ErrorActionPreference = 'Stop'
|
| 107 |
+
$slot = '${{ matrix.slot }}'
|
| 108 |
+
# The engine writes its progress stream to stderr. Console writes on
|
| 109 |
+
# the Windows runner are expensive enough to move the numbers, so it
|
| 110 |
+
# goes to a file and is printed after the stopwatch stops. The file
|
| 111 |
+
# sits in the runner temp rather than the working tree, which the
|
| 112 |
+
# edit rebuild measures a change to.
|
| 113 |
+
$errlog = Join-Path $env:RUNNER_TEMP 'dk-run.err'
|
| 114 |
+
function Run {
|
| 115 |
+
& .\dk1.cmd run-object NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 `
|
| 116 |
+
-s $slot -m ./bin/ocamlearlybird.exe -- --help=plain 2> $errlog > $null
|
| 117 |
+
if ($LASTEXITCODE -ne 0) { Get-Content $errlog; throw "run-object failed ($LASTEXITCODE)" }
|
| 118 |
+
}
|
| 119 |
+
Write-Host "DK MEASURE STARTED $(Get-Date -Format HH:mm:ss) slot=$slot"
|
| 120 |
+
|
| 121 |
+
$sw = [System.Diagnostics.Stopwatch]::StartNew(); Run; $cold = $sw.ElapsedMilliseconds
|
| 122 |
+
Write-Host "PHASE dk_build_cold ms=$cold"
|
| 123 |
+
|
| 124 |
+
$sw.Restart(); Run; $warm = $sw.ElapsedMilliseconds
|
| 125 |
+
Write-Host "PHASE dk_run_warm ms=$warm"
|
| 126 |
+
|
| 127 |
+
Add-Content -Path src/main/main.ml -Value "`n(* perf measurement touch *)`n"
|
| 128 |
+
& .\dk1.cmd update --no-imports
|
| 129 |
+
if ($LASTEXITCODE -ne 0) { throw "update failed ($LASTEXITCODE)" }
|
| 130 |
+
$sw.Restart(); Run; $edit = $sw.ElapsedMilliseconds
|
| 131 |
+
Write-Host "PHASE dk_run_edit ms=$edit"
|
| 132 |
+
|
| 133 |
+
Write-Host "DK SUMMARY slot=$slot build_cold_ms=$cold run_warm_ms=$warm run_edit_ms=$edit"
|
| 134 |
+
Write-Host "DK ENGINE OUTPUT from the last timed run, printed outside the stopwatch"
|
| 135 |
+
Get-Content $errlog
|
| 136 |
+
Write-Host "DK MEASURE DONE $(Get-Date -Format HH:mm:ss)"
|
| 137 |
+
|
| 138 |
+
# The same three readings, machine readable, for the gate job. Written
|
| 139 |
+
# AFTER every stopwatch has stopped and outside the working tree, so it
|
| 140 |
+
# cannot move a number.
|
| 141 |
+
$phaseDir = Join-Path $env:RUNNER_TEMP 'dk-phases'
|
| 142 |
+
New-Item -ItemType Directory -Force -Path $phaseDir | Out-Null
|
| 143 |
+
"dk_build_cold=$cold`ndk_run_warm=$warm`ndk_run_edit=$edit" |
|
| 144 |
+
Set-Content -NoNewline -Path (Join-Path $phaseDir "$slot.txt")
|
| 145 |
+
|
| 146 |
+
- name: Upload this slot's readings for the gate
|
| 147 |
+
if: ${{ always() && runner.os == 'Windows' }}
|
| 148 |
+
uses: actions/upload-artifact@v4
|
| 149 |
+
with:
|
| 150 |
+
name: dk-phases-${{ matrix.slot }}
|
| 151 |
+
path: ${{ runner.temp }}/dk-phases
|
| 152 |
+
if-no-files-found: ignore
|
| 153 |
+
|
| 154 |
+
# THE MEASUREMENT COVERED EVERY SLOT IT CLAIMS TO COVER, OR THIS FAILS.
|
| 155 |
+
#
|
| 156 |
+
# The dk matrix runs fail-fast: false, so a dead leg does not stop the others and
|
| 157 |
+
# the workflow can finish carrying numbers for only some slots. Those numbers then
|
| 158 |
+
# refresh CLO.md and both PR descriptions while describing a slot nobody measured.
|
| 159 |
+
# `needs: dk` with `if: always()` is what makes this reachable when a leg failed,
|
| 160 |
+
# which is the case it exists for.
|
| 161 |
+
measurement-gate:
|
| 162 |
+
needs: dk
|
| 163 |
+
if: ${{ always() }}
|
| 164 |
+
runs-on: ubuntu-latest
|
| 165 |
+
steps:
|
| 166 |
+
- name: Checkout repository
|
| 167 |
+
uses: actions/checkout@v7
|
| 168 |
+
|
| 169 |
+
- name: Download every slot's readings
|
| 170 |
+
uses: actions/download-artifact@v4
|
| 171 |
+
with:
|
| 172 |
+
pattern: dk-phases-*
|
| 173 |
+
merge-multiple: true
|
| 174 |
+
path: collected
|
| 175 |
+
|
| 176 |
+
# A check that has only ever been observed passing is evidence about the run
|
| 177 |
+
# and not about the check. This proves it rejects a missing slot, a missing
|
| 178 |
+
# phase and a zero reading BEFORE its verdict on real data is believed.
|
| 179 |
+
- name: Prove the gate fires
|
| 180 |
+
run: node scripts/check-measurement-complete.mjs --selftest
|
| 181 |
+
|
| 182 |
+
- name: Every declared slot reported every declared phase
|
| 183 |
+
run: node scripts/check-measurement-complete.mjs --dir collected
|
| 184 |
+
|
| 185 |
+
opam:
|
| 186 |
+
strategy:
|
| 187 |
+
fail-fast: false
|
| 188 |
+
matrix:
|
| 189 |
+
os:
|
| 190 |
+
- ubuntu-latest
|
| 191 |
+
- windows-latest
|
| 192 |
+
runs-on: ${{ matrix.os }}
|
| 193 |
+
steps:
|
| 194 |
+
- name: Checkout repository
|
| 195 |
+
uses: actions/checkout@v7
|
| 196 |
+
with:
|
| 197 |
+
lfs: true
|
| 198 |
+
|
| 199 |
+
# T0 is stamped after checkout but before switch create, so the opam
|
| 200 |
+
# fresh-to-binary number includes switch create + compiler install
|
| 201 |
+
# (setup-ocaml), the fair counterpart to dk fetching its toolchain.
|
| 202 |
+
- name: Stamp opam start time (before switch create)
|
| 203 |
+
shell: bash
|
| 204 |
+
run: echo "OPAM_T0=$(date +%s%3N)" >> "$GITHUB_ENV"
|
| 205 |
+
|
| 206 |
+
# Matches the dk-locked compiler (CommonsLang_OCaml.DkML@4.14.3001) so the
|
| 207 |
+
# opam and dk tracks build the same package set with the same compiler.
|
| 208 |
+
- name: Set up OCaml 4.14 (switch create + compiler install)
|
| 209 |
+
uses: ocaml/setup-ocaml@v3
|
| 210 |
+
with:
|
| 211 |
+
ocaml-compiler: 4.14.x
|
| 212 |
+
# Stated explicitly so the two cache modes are selectable. setup-ocaml's own
|
| 213 |
+
# default is true, which the run logs echo as `cache: true`, so an ordinary
|
| 214 |
+
# dispatch measures exactly what it measured before this input existed and the
|
| 215 |
+
# existing cache-mode samples stay valid. A tag-triggered run carries no inputs,
|
| 216 |
+
# so the expression falls back to 'true' rather than to an empty string.
|
| 217 |
+
cache: ${{ inputs.opam_cache || 'true' }}
|
| 218 |
+
|
| 219 |
+
- name: opam setup + deps + dune build cold/warm/edit (timed)
|
| 220 |
+
shell: bash
|
| 221 |
+
run: |
|
| 222 |
+
set -euo pipefail
|
| 223 |
+
now() { date +%s%3N; }
|
| 224 |
+
t0="$OPAM_T0"
|
| 225 |
+
echo "OPAM MEASURE STARTED $(date -u +%H:%M:%S) os=${{ matrix.os }}"
|
| 226 |
+
|
| 227 |
+
a=$(now)
|
| 228 |
+
echo "PHASE opam_setup ms=$((a-t0))"
|
| 229 |
+
|
| 230 |
+
opam install . --deps-only -y; b=$(now)
|
| 231 |
+
echo "PHASE opam_deps ms=$((b-a))"
|
| 232 |
+
|
| 233 |
+
# @install builds the library + executable (the shipped artifacts) and
|
| 234 |
+
# skips the test rules, which spawn the debugger and time out on the
|
| 235 |
+
# Windows runner. This measures the same deliverable the dk track runs.
|
| 236 |
+
c=$(now); opam exec -- dune build @install; d=$(now)
|
| 237 |
+
echo "PHASE opam_build_cold ms=$((d-c))"
|
| 238 |
+
echo "PHASE opam_fresh_to_binary ms=$((d-t0))"
|
| 239 |
+
|
| 240 |
+
e=$(now); opam exec -- dune build @install; f=$(now)
|
| 241 |
+
echo "PHASE opam_build_warm ms=$((f-e))"
|
| 242 |
+
|
| 243 |
+
g=$(now); opam exec -- dune exec -- ocamlearlybird --help=plain >/dev/null; h=$(now)
|
| 244 |
+
echo "PHASE opam_run_warm ms=$((h-g))"
|
| 245 |
+
|
| 246 |
+
printf '\n(* perf measurement touch *)\n' >> src/main/main.ml
|
| 247 |
+
i=$(now); opam exec -- dune build @install; j=$(now)
|
| 248 |
+
echo "PHASE opam_build_edit ms=$((j-i))"
|
| 249 |
+
|
| 250 |
+
echo "OPAM SUMMARY os=${{ matrix.os }} fresh_to_binary_ms=$((d-t0)) setup_ms=$((a-t0)) deps_ms=$((b-a)) build_cold_ms=$((d-c)) build_warm_ms=$((f-e)) run_warm_ms=$((h-g)) build_edit_ms=$((j-i))"
|
| 251 |
+
echo "OPAM MEASURE DONE $(date -u +%H:%M:%S)"
|
|
@@ -0,0 +1,303 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
name: repin-engine
|
| 2 |
+
# Repin dk.u to a chosen engine and CommonsLang_OCaml release ON A HOSTED RUNNER,
|
| 3 |
+
# regenerate etc/dk/i with the launcher's own update, and regenerate the etc/dk/v
|
| 4 |
+
# closure driver so it names rules the new import actually offers.
|
| 5 |
+
#
|
| 6 |
+
# SPLIT OUT OF measure-performance.yml at cycle 40. That file held this job and the
|
| 7 |
+
# timed measurement jobs behind mutually exclusive `if:` conditions, so a dispatch
|
| 8 |
+
# ran one half and skipped the other while the workflow's name promised a
|
| 9 |
+
# measurement either way. Two costs came with that. A reader could not tell from a
|
| 10 |
+
# run's name whether any figure had been produced, which cost a round of confusion
|
| 11 |
+
# when three jobs reported SKIPPED and no numbers changed. And every edit to this
|
| 12 |
+
# repin path touched the file holding the timed steps, which
|
| 13 |
+
# skills/update-ocamlearlybird-measurements says invalidates the measurement
|
| 14 |
+
# cohort: "samples taken before it describe a workflow that no longer exists".
|
| 15 |
+
#
|
| 16 |
+
# It does NOT commit unless asked. The first dispatch produces the diff as an
|
| 17 |
+
# artifact so it can be READ before anything is pushed; a second dispatch with
|
| 18 |
+
# commit=true lands it. The diff is the point rather than a formality.
|
| 19 |
+
on:
|
| 20 |
+
workflow_dispatch:
|
| 21 |
+
inputs:
|
| 22 |
+
engine_version:
|
| 23 |
+
description: >-
|
| 24 |
+
The dk actual_version to repin to. 2.4.3.9 is the earliest published
|
| 25 |
+
engine clearing the F_BuildLockedClosure object-form floor, and
|
| 26 |
+
2.4.3.8 itself is 404, so nothing below 2.4.3.9 is a valid choice.
|
| 27 |
+
type: string
|
| 28 |
+
default: '2.4.3.15'
|
| 29 |
+
clo_version:
|
| 30 |
+
description: >-
|
| 31 |
+
The CommonsLang_OCaml tag to import. It must match the release that
|
| 32 |
+
any CommonsBase_Dk object this build imports was itself built
|
| 33 |
+
against, which is the pin-guard rule in skills/bump-version-train.
|
| 34 |
+
type: string
|
| 35 |
+
default: '0.1.20260902235611'
|
| 36 |
+
commit:
|
| 37 |
+
description: >-
|
| 38 |
+
Commit the regenerated material back to this branch. Leave false on
|
| 39 |
+
the first dispatch so the diff is read before anything lands.
|
| 40 |
+
type: choice
|
| 41 |
+
options:
|
| 42 |
+
- 'false'
|
| 43 |
+
- 'true'
|
| 44 |
+
default: 'false'
|
| 45 |
+
|
| 46 |
+
jobs:
|
| 47 |
+
repin:
|
| 48 |
+
runs-on: ubuntu-latest
|
| 49 |
+
timeout-minutes: 60
|
| 50 |
+
permissions:
|
| 51 |
+
contents: write
|
| 52 |
+
steps:
|
| 53 |
+
- name: Checkout repository
|
| 54 |
+
uses: actions/checkout@v7
|
| 55 |
+
with:
|
| 56 |
+
lfs: true
|
| 57 |
+
|
| 58 |
+
- name: Record what is pinned before anything is touched
|
| 59 |
+
run: |
|
| 60 |
+
set -eu
|
| 61 |
+
mkdir -p .regen
|
| 62 |
+
echo "--- dk.u pins BEFORE ---"
|
| 63 |
+
grep -n 'actual_version' dk.u || true
|
| 64 |
+
grep -n 'CommonsLang_OCaml' dk.u || true
|
| 65 |
+
echo "--- etc/dk/i BEFORE ---"
|
| 66 |
+
ls -1 etc/dk/i/
|
| 67 |
+
cp -a etc/dk/i .regen/i-before
|
| 68 |
+
cp dk.u .regen/dk.u.before
|
| 69 |
+
# The CLO tag before the repin, for the values.json diff after regeneration.
|
| 70 |
+
sed -n 's/.*repo="dkpkg\/CommonsLang_OCaml", tag="\([^"]*\)".*/\1/p' dk.u | head -1 > .regen/old_clo
|
| 71 |
+
|
| 72 |
+
- name: Repin dk.u to the requested engine and CommonsLang_OCaml
|
| 73 |
+
env:
|
| 74 |
+
ENGINE: ${{ inputs.engine_version }}
|
| 75 |
+
CLO: ${{ inputs.clo_version }}
|
| 76 |
+
run: |
|
| 77 |
+
set -eu
|
| 78 |
+
test -n "$ENGINE" && test -n "$CLO" || { echo "::error::engine_version and clo_version must both be non-empty"; exit 1; }
|
| 79 |
+
echo "repinning: engine -> $ENGINE, CommonsLang_OCaml -> $CLO"
|
| 80 |
+
# Repin THROUGH THE ENGINE, never by text-editing dk.u. self-update rewrites
|
| 81 |
+
# the %% actual_version command and its regenerated output pair; add upserts
|
| 82 |
+
# the CommonsLang_OCaml import by repo IDENTITY (the tag is excluded from the
|
| 83 |
+
# match, so a wave timestamp shared by sibling imports is irrelevant) and
|
| 84 |
+
# clears its output block, so the update step below re-fetches and rewrites
|
| 85 |
+
# the version + checksums + etc/dk/i. Both are idempotent: re-running at the
|
| 86 |
+
# same engine/tag is a no-op-safe upsert, so no refresh flag and no
|
| 87 |
+
# version-uniqueness guard are needed (the old text edit needed both, and
|
| 88 |
+
# broke when sibling imports shared a wave release timestamp).
|
| 89 |
+
./dk1 self-update "$ENGINE"
|
| 90 |
+
./dk1 add github-l2 dkpkg/CommonsLang_OCaml@"$CLO"
|
| 91 |
+
echo "--- dk.u diff ---"
|
| 92 |
+
git --no-pager diff -- dk.u
|
| 93 |
+
|
| 94 |
+
- name: Run the launcher's update on this runner
|
| 95 |
+
run: |
|
| 96 |
+
set -eu
|
| 97 |
+
# KEEP THE EVIDENCE. A sibling step in this workflow once discarded a
|
| 98 |
+
# failing run's output and the engine's own error was unreadable.
|
| 99 |
+
# tee, so a failure is diagnosable from the log alone.
|
| 100 |
+
set +e
|
| 101 |
+
./dk1 update 2>&1 | tee .regen/update.log
|
| 102 |
+
rc=${PIPESTATUS[0]}
|
| 103 |
+
set -e
|
| 104 |
+
echo "update exit code: $rc"
|
| 105 |
+
if [ "$rc" -ne 0 ]; then
|
| 106 |
+
echo "::error::./dk1 update failed with exit code $rc; the log above is the evidence"
|
| 107 |
+
exit "$rc"
|
| 108 |
+
fi
|
| 109 |
+
|
| 110 |
+
- name: Regenerate the closure driver so it matches the rules the import offers
|
| 111 |
+
# WHY THIS STEP EXISTS. Repinning the import rewrites etc/dk/i and leaves
|
| 112 |
+
# etc/dk/v alone, and etc/dk/v holds a GENERATED driver that names a rule
|
| 113 |
+
# by version. On 2026-09-06 that cost a whole measurement: the driver named
|
| 114 |
+
# the CommonsLang_OCaml.Dk.OpamBuild.F_BuildLockedClosure rule at a stale
|
| 115 |
+
# version, while the newly imported CommonsLang_OCaml offered only a newer
|
| 116 |
+
# one, and
|
| 117 |
+
# both dk legs died with "Could not get rule ... does not exist" after the
|
| 118 |
+
# 90-minute matrix had already been dispatched.
|
| 119 |
+
#
|
| 120 |
+
# The driver is NOT hand-edited from one version to the other. Its own
|
| 121 |
+
# header says regenerate rather than hand-edit, the generator itself moved
|
| 122 |
+
# @1.1.16 to @1.1.20 between those releases, and nothing here can verify the
|
| 123 |
+
# two rule versions take the same parameters. A silently different build
|
| 124 |
+
# would corrupt the very number this workflow exists to produce.
|
| 125 |
+
env:
|
| 126 |
+
CLO: ${{ inputs.clo_version }}
|
| 127 |
+
run: |
|
| 128 |
+
set -eu
|
| 129 |
+
imp="etc/dk/i/CommonsLang_OCaml.${CLO}.values.json"
|
| 130 |
+
if [ ! -s "$imp" ]; then
|
| 131 |
+
echo "::error::$imp is missing or empty, so there is nothing to regenerate against"
|
| 132 |
+
exit 1
|
| 133 |
+
fi
|
| 134 |
+
|
| 135 |
+
# THE RULE VERSION IS DISCOVERED, NEVER PINNED HERE. Writing a literal
|
| 136 |
+
# would reintroduce exactly the defect this step removes: a checked-in
|
| 137 |
+
# reference to a version the import may no longer offer.
|
| 138 |
+
ref=$(grep -o 'CommonsLang_OCaml\.Dk\.OpamLock\.Refresh@[0-9][0-9.]*' "$imp" | sort -uV | tail -1)
|
| 139 |
+
if [ -z "$ref" ]; then
|
| 140 |
+
echo "::error::the import offers no CommonsLang_OCaml.Dk.OpamLock.Refresh rule, so the driver cannot be regenerated from it"
|
| 141 |
+
exit 1
|
| 142 |
+
fi
|
| 143 |
+
echo "regenerating with $ref"
|
| 144 |
+
|
| 145 |
+
# PROVE THE CHECK FIRES BEFORE TRUSTING THAT IT PASSES. CLO.md:194
|
| 146 |
+
# documents mode=check as read-only and nonzero when a driver is stale,
|
| 147 |
+
# so it must go RED here and GREEN below, in this same run. A check only
|
| 148 |
+
# ever observed passing is evidence about the run, not about the check.
|
| 149 |
+
set +e
|
| 150 |
+
./dk1 dialog "$ref" mode=check > .regen/driver-check-before.log 2>&1
|
| 151 |
+
before=$?
|
| 152 |
+
set -e
|
| 153 |
+
echo "driver staleness BEFORE regeneration: exit $before"
|
| 154 |
+
cat .regen/driver-check-before.log || true
|
| 155 |
+
if [ "$before" -eq 0 ]; then
|
| 156 |
+
echo "NOTE: the driver was already current for this import, so this run does not exercise the stale path."
|
| 157 |
+
fi
|
| 158 |
+
|
| 159 |
+
./dk1 dialog "$ref" 2>&1 | tee .regen/driver-refresh.log
|
| 160 |
+
|
| 161 |
+
# KEEP THE EVIDENCE, and fail loudly. A sibling step in this workflow once
|
| 162 |
+
# discarded a failing run's output and the engine's own error was unreadable.
|
| 163 |
+
set +e
|
| 164 |
+
./dk1 dialog "$ref" mode=check > .regen/driver-check-after.log 2>&1
|
| 165 |
+
after=$?
|
| 166 |
+
set -e
|
| 167 |
+
echo "driver staleness AFTER regeneration: exit $after"
|
| 168 |
+
cat .regen/driver-check-after.log || true
|
| 169 |
+
if [ "$after" -ne 0 ]; then
|
| 170 |
+
echo "::error::the driver is STILL stale after regenerating it; the log above is the evidence"
|
| 171 |
+
exit "$after"
|
| 172 |
+
fi
|
| 173 |
+
|
| 174 |
+
# Refresh regenerates ONLY the GenerateDriver (closure/DevPrefix) family.
|
| 175 |
+
# The Src and Final drivers are owned by the separate GenerateSrc and
|
| 176 |
+
# GenerateFinal rules; a CLO rule-version bump moves those too, and the
|
| 177 |
+
# closure refresh-check cannot see it, so they go stale undetected (the
|
| 178 |
+
# 2026-09-14 measurement hit exactly this). Regenerate both here,
|
| 179 |
+
# discovering the rule version from the same import and the root package
|
| 180 |
+
# id from the drivers. GenerateSrc/GenerateFinal self-discover the lock
|
| 181 |
+
# root from pkg=, so no root=/roots[]= is needed here.
|
| 182 |
+
srcref=$(grep -o 'CommonsLang_OCaml\.Dk\.OpamLock\.GenerateSrc@[0-9][0-9.]*' "$imp" | sort -uV | tail -1)
|
| 183 |
+
finalref=$(grep -o 'CommonsLang_OCaml\.Dk\.OpamLock\.GenerateFinal@[0-9][0-9.]*' "$imp" | sort -uV | tail -1)
|
| 184 |
+
pkgid=$(grep -ohE 'NotHackwaly_Ocamlearlybird\.Ocamlearlybird@[0-9][0-9.]*' etc/dk/v/NotHackwaly_Ocamlearlybird/*.values.jsonc | sort -uV | tail -1)
|
| 185 |
+
if [ -z "$srcref" ] || [ -z "$finalref" ] || [ -z "$pkgid" ]; then
|
| 186 |
+
echo "::error::could not discover GenerateSrc/GenerateFinal rule version or the earlybird pkg id"
|
| 187 |
+
exit 1
|
| 188 |
+
fi
|
| 189 |
+
echo "regenerating Src with $srcref and Final with $finalref for $pkgid"
|
| 190 |
+
./dk1 dialog "$srcref" pkg="$pkgid"
|
| 191 |
+
./dk1 dialog "$finalref" pkg="$pkgid"
|
| 192 |
+
|
| 193 |
+
echo "--- etc/dk/v diff ---"
|
| 194 |
+
git --no-pager diff -- etc/dk/v/ || true
|
| 195 |
+
|
| 196 |
+
- name: Every rule the driver names must exist in the import
|
| 197 |
+
# The guard that turns a 90-minute failure into a seconds-long one. It is a
|
| 198 |
+
# SEPARATE step from the regeneration above on purpose: presence and effect
|
| 199 |
+
# need separate reports, and this one still fires when the regeneration
|
| 200 |
+
# silently no-ops.
|
| 201 |
+
env:
|
| 202 |
+
CLO: ${{ inputs.clo_version }}
|
| 203 |
+
run: |
|
| 204 |
+
set -eu
|
| 205 |
+
imp="etc/dk/i/CommonsLang_OCaml.${CLO}.values.json"
|
| 206 |
+
drv=etc/dk/v/NotHackwaly_Ocamlearlybird/Ocamlearlybird.Closure.values.jsonc
|
| 207 |
+
if [ ! -s "$drv" ]; then
|
| 208 |
+
echo "::error::$drv is missing or empty after regeneration"
|
| 209 |
+
exit 1
|
| 210 |
+
fi
|
| 211 |
+
|
| 212 |
+
named=$(grep -o 'CommonsLang_OCaml\.[A-Za-z0-9_.]*@[0-9][0-9.]*' "$drv" | sort -u)
|
| 213 |
+
# An empty result must never impersonate a real answer: a driver naming no
|
| 214 |
+
# CommonsLang_OCaml rule at all would otherwise read as "nothing missing".
|
| 215 |
+
if [ -z "$named" ]; then
|
| 216 |
+
echo "::error::the driver names no CommonsLang_OCaml rule at all, which cannot be right"
|
| 217 |
+
exit 1
|
| 218 |
+
fi
|
| 219 |
+
|
| 220 |
+
missing=0
|
| 221 |
+
total=0
|
| 222 |
+
for r in $named; do
|
| 223 |
+
total=$((total + 1))
|
| 224 |
+
if grep -qF "\"$r\"" "$imp"; then
|
| 225 |
+
echo " OK $r"
|
| 226 |
+
else
|
| 227 |
+
echo " MISSING $r"
|
| 228 |
+
missing=$((missing + 1))
|
| 229 |
+
fi
|
| 230 |
+
done
|
| 231 |
+
echo "checked $total rule(s) named by the driver against $imp"
|
| 232 |
+
if [ "$missing" -ne 0 ]; then
|
| 233 |
+
echo "::error::$missing of $total rule(s) named by the driver are absent from the import. This is the 2026-09-06 failure, caught before the measurement instead of after it."
|
| 234 |
+
exit 1
|
| 235 |
+
fi
|
| 236 |
+
|
| 237 |
+
- name: The regeneration must have produced something
|
| 238 |
+
env:
|
| 239 |
+
CLO: ${{ inputs.clo_version }}
|
| 240 |
+
run: |
|
| 241 |
+
set -eu
|
| 242 |
+
want="etc/dk/i/CommonsLang_OCaml.${CLO}.values.json"
|
| 243 |
+
echo "--- etc/dk/i AFTER ---"
|
| 244 |
+
ls -1 etc/dk/i/
|
| 245 |
+
# An empty result must never impersonate a real answer.
|
| 246 |
+
if [ ! -s "$want" ]; then
|
| 247 |
+
echo "::error::$want is missing or empty after update; the regeneration produced nothing"
|
| 248 |
+
exit 1
|
| 249 |
+
fi
|
| 250 |
+
echo "PRESENT $want ($(wc -c < "$want") bytes)"
|
| 251 |
+
old=$(cat .regen/old_clo)
|
| 252 |
+
oldf=".regen/i-before/CommonsLang_OCaml.${old}.values.json"
|
| 253 |
+
echo "--- values.json: ${old} -> ${CLO} ---"
|
| 254 |
+
if [ -s "$oldf" ]; then
|
| 255 |
+
# diff exits 1 when the files differ, which is the expected case.
|
| 256 |
+
diff -u "$oldf" "$want" > .regen/values.diff || true
|
| 257 |
+
echo "diff lines: $(wc -l < .regen/values.diff)"
|
| 258 |
+
cat .regen/values.diff
|
| 259 |
+
else
|
| 260 |
+
echo "no prior values.json at $oldf to diff against"
|
| 261 |
+
echo "no prior values.json to diff" > .regen/values.diff
|
| 262 |
+
fi
|
| 263 |
+
echo "--- every change in the working tree ---"
|
| 264 |
+
git status --porcelain
|
| 265 |
+
git --no-pager diff --stat
|
| 266 |
+
|
| 267 |
+
- name: Upload the regenerated material so the diff can be read before it lands
|
| 268 |
+
uses: actions/upload-artifact@v4
|
| 269 |
+
with:
|
| 270 |
+
name: regenerated-import
|
| 271 |
+
path: |
|
| 272 |
+
dk.u
|
| 273 |
+
etc/dk/i/**
|
| 274 |
+
etc/dk/v/**
|
| 275 |
+
.regen/values.diff
|
| 276 |
+
.regen/update.log
|
| 277 |
+
.regen/driver-refresh.log
|
| 278 |
+
.regen/driver-check-before.log
|
| 279 |
+
.regen/driver-check-after.log
|
| 280 |
+
if-no-files-found: error
|
| 281 |
+
|
| 282 |
+
- name: Commit and push, only when asked
|
| 283 |
+
if: ${{ inputs.commit == 'true' }}
|
| 284 |
+
env:
|
| 285 |
+
ENGINE: ${{ inputs.engine_version }}
|
| 286 |
+
CLO: ${{ inputs.clo_version }}
|
| 287 |
+
run: |
|
| 288 |
+
set -eu
|
| 289 |
+
rm -rf .regen
|
| 290 |
+
if [ -z "$(git status --porcelain)" ]; then
|
| 291 |
+
echo "::error::commit was requested but the tree is clean; nothing was regenerated"
|
| 292 |
+
exit 1
|
| 293 |
+
fi
|
| 294 |
+
git config user.name "github-actions[bot]"
|
| 295 |
+
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
| 296 |
+
git add dk.u etc/dk/i etc/dk/v
|
| 297 |
+
git commit \
|
| 298 |
+
-m "Regenerate the import on a hosted runner" \
|
| 299 |
+
-m "+ repin the engine to ${ENGINE}" \
|
| 300 |
+
-m "+ repin CommonsLang_OCaml to ${CLO}" \
|
| 301 |
+
-m "+ regenerate etc/dk/i with ./dk1 update" \
|
| 302 |
+
-m "+ regenerate the etc/dk/v closure driver with the OpamLock.Refresh dialog"
|
| 303 |
+
git push origin "HEAD:${GITHUB_REF_NAME}"
|
|
@@ -2,3 +2,8 @@
|
|
| 2 |
node_modules
|
| 3 |
/_build
|
| 4 |
.merlin
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
node_modules
|
| 3 |
/_build
|
| 4 |
.merlin
|
| 5 |
+
|
| 6 |
+
# dk transient state (see CLO.md). dk writes self-ignoring .gitignore files
|
| 7 |
+
# into the other directories it creates (dk-dist/, opam-venv/, the etc/dk/i
|
| 8 |
+
# scratch download), so only the local store needs an entry here.
|
| 9 |
+
/t/
|
|
@@ -0,0 +1,207 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Building ocamlearlybird with the dk build tool
|
| 2 |
+
|
| 3 |
+
This document explains how to build the `ocamlearlybird` OCaml debug adapter
|
| 4 |
+
with [dk](https://diskuv.com/dk), a Windows-friendly, incremental, remote
|
| 5 |
+
cacheable build system. It is
|
| 6 |
+
written for two audiences, people who just want the binary (**Users**) and
|
| 7 |
+
people who maintain this repository's dk integration (**Maintainers**), and it
|
| 8 |
+
is meant to double as a worked, replayable example of adopting dk for an
|
| 9 |
+
existing opam/dune project.
|
| 10 |
+
|
| 11 |
+
## Provenance
|
| 12 |
+
|
| 13 |
+
The dk packages this build depends on have been **100% AI generated and
|
| 14 |
+
maintained since June 2026**, and the dk build tool itself was **hand built but
|
| 15 |
+
AI assisted since June 2026**.
|
| 16 |
+
|
| 17 |
+
---
|
| 18 |
+
|
| 19 |
+
## Quick Setup
|
| 20 |
+
|
| 21 |
+
The Quick Setup path builds ocamlearlybird from source once on your machine,
|
| 22 |
+
on top of a prebuilt toolchain: the OCaml compiler, Dune, opam, and the
|
| 23 |
+
supporting build utilities arrive as prebuilt
|
| 24 |
+
objects that dk lazily range-fetches from published Diskuv
|
| 25 |
+
package releases. An existing CI-backed dk package (here
|
| 26 |
+
`dkpkg/CommonsLang_OCaml`, which publishes the OCaml toolchain objects) gives
|
| 27 |
+
you that partial caching for free.
|
| 28 |
+
|
| 29 |
+
What you build locally in Quick Setup is ocamlearlybird's own opam dependency
|
| 30 |
+
closure (lwt, dap, menhir, ppxlib, …) plus ocamlearlybird itself, each as its
|
| 31 |
+
own cached dk object.
|
| 32 |
+
|
| 33 |
+
### Quick Setup for Users
|
| 34 |
+
|
| 35 |
+
You need two things: install dk1, then run one object.
|
| 36 |
+
|
| 37 |
+
**1. Install dk1** (installs both `dk0` and `dk1` into `~/.local/bin`, verified
|
| 38 |
+
with signify + SHA-256):
|
| 39 |
+
|
| 40 |
+
```sh
|
| 41 |
+
curl -fsSL https://diskuv.com/dk/install.sh | sh
|
| 42 |
+
# Windows PowerShell: irm https://diskuv.com/dk/install.ps1 | iex
|
| 43 |
+
```
|
| 44 |
+
|
| 45 |
+
(If you cloned this repository you can skip the install entirely and use the
|
| 46 |
+
vendored `./dk1` launcher, which self-installs the pinned version on first run.)
|
| 47 |
+
|
| 48 |
+
**2. Build and run the debug adapter** as a single object:
|
| 49 |
+
|
| 50 |
+
```sh
|
| 51 |
+
./dk1 run-object NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 \
|
| 52 |
+
-s Release.execution_abi \
|
| 53 |
+
-m bin/ocamlearlybird.exe \
|
| 54 |
+
-- --help
|
| 55 |
+
```
|
| 56 |
+
|
| 57 |
+
- `-s Release.execution_abi` selects the object built for the host you are on, so the
|
| 58 |
+
same command works on Linux, macOS and Windows without editing the slot.
|
| 59 |
+
- `-m bin/ocamlearlybird.exe` selects the member of the built object to execute.
|
| 60 |
+
- everything after `--` is passed to the debug adapter.
|
| 61 |
+
|
| 62 |
+
### Quick Setup for Maintainers
|
| 63 |
+
|
| 64 |
+
Adopting dk for an existing opam/dune project is the command sequence below,
|
| 65 |
+
shown for Linux. On macOS swap the slot in step 6 (`Release.Darwin_arm64`); on
|
| 66 |
+
Windows use PowerShell, `irm https://diskuv.com/dk/vendor.ps1 | iex` for step 1,
|
| 67 |
+
and `.\dk1.cmd` for the rest.
|
| 68 |
+
|
| 69 |
+
```sh
|
| 70 |
+
# 1. vendor the dk0/dk1 launchers into the repo
|
| 71 |
+
curl -fsSL https://diskuv.com/dk/vendor.sh | sh
|
| 72 |
+
# 2. scaffold dk.u, seed the pin table and .gitattributes, record the
|
| 73 |
+
# quickstart's declared trust statements, and import the toolchain
|
| 74 |
+
./dk1 quickstart ocaml opam414
|
| 75 |
+
# 3. fetch and verify the toolchain import
|
| 76 |
+
./dk1 update
|
| 77 |
+
# 4. adopt: solve the lock, generate the build forms, register the assets
|
| 78 |
+
./dk1 dialog CommonsLang_OCaml.Dk.OpamLock.Adopt@1.1.14 version=1.3.6 unit=Ocamlearlybird ns=NotHackwaly_Ocamlearlybird
|
| 79 |
+
# 5. recompute the checksums of the registered workspace assets
|
| 80 |
+
./dk1 update
|
| 81 |
+
# 6. build and run the debug adapter
|
| 82 |
+
./dk1 run-object NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 \
|
| 83 |
+
-s Release.execution_abi -m ./bin/ocamlearlybird.exe -- --help
|
| 84 |
+
```
|
| 85 |
+
|
| 86 |
+
`ns=` keeps this fork's committed third-party namespace; a maintainer adopting
|
| 87 |
+
their own project omits it and gets a namespace derived from the repository.
|
| 88 |
+
|
| 89 |
+
What the above sequence of commands produces:
|
| 90 |
+
|
| 91 |
+
| File | Role |
|
| 92 |
+
|---|---|
|
| 93 |
+
| `dk0`, `dk1`, `dk0.cmd`, `dk1.cmd` | vendored self-installing launchers (step 1) |
|
| 94 |
+
| `etc/dk/t/acceptances.json`, `etc/dk/t/capabilities.json` | trust records from the quickstart's declared trust statements (step 2) |
|
| 95 |
+
| `dk.u` | workspace script: pinned imports + registered asset declarations (steps 2, 4, 5) |
|
| 96 |
+
| `dk-opam-pins.txt` | opam solve pin table, seeded by the quickstart (see below) |
|
| 97 |
+
| `dk-src/dune-workspace` | dune workspace root marker staged into the assembled source |
|
| 98 |
+
| `dk.opam-lock.jsonc` | the solved, checked-in per-slot dependency lock (step 4) |
|
| 99 |
+
| `etc/dk/v/…/Ocamlearlybird.Src.values.jsonc` | generated localized-source form (step 4) |
|
| 100 |
+
| `etc/dk/v/…/Ocamlearlybird.Closure.values.jsonc` | generated one-line closure driver (step 4) |
|
| 101 |
+
| `etc/dk/v/…/Ocamlearlybird.values.jsonc` | generated thin final form exposing `bin/ocamlearlybird` (step 4) |
|
| 102 |
+
| `etc/dk/i/*.values.json`, `etc/dk/i/dk-closure-manifest.tsv` | verified import records (steps 2, 3) |
|
| 103 |
+
|
| 104 |
+
**Maintenance after adoption.** After a repin or a dependency change, the
|
| 105 |
+
zero-argument `Refresh` regenerates the committed driver from the stamped
|
| 106 |
+
parameters, and `mode=check` validates it read-only (CI-friendly):
|
| 107 |
+
|
| 108 |
+
```sh
|
| 109 |
+
./dk1 dialog CommonsLang_OCaml.Dk.OpamLock.Refresh@1.1.14 # regenerate the driver
|
| 110 |
+
./dk1 dialog CommonsLang_OCaml.Dk.OpamLock.Refresh@1.1.14 mode=solve # re-solve the lock, then the driver
|
| 111 |
+
./dk1 dialog CommonsLang_OCaml.Dk.OpamLock.Refresh@1.1.14 mode=check # read-only; nonzero if a driver is stale
|
| 112 |
+
./dk1 dialog CommonsLang_OCaml.Dk.OpamLock.Refresh@1.1.14 version=1.3.7 # bump earlybird across the coupled ids
|
| 113 |
+
```
|
| 114 |
+
|
| 115 |
+
After editing any workspace asset (`dune`, `dune-project`, `earlybird.opam`,
|
| 116 |
+
`src/`, or the lock) run `./dk1 update --no-imports` to refresh the recorded
|
| 117 |
+
checksums in `dk.u`, then rebuild, see *Editing a file and rebuilding*.
|
| 118 |
+
|
| 119 |
+
#### The pin table (`dk-opam-pins.txt`)
|
| 120 |
+
|
| 121 |
+
The quickstart seeds the pin table, and the
|
| 122 |
+
[dk for opam users guide](https://diskuv.com/dk/docs/OPAM/) explains its line
|
| 123 |
+
forms and purpose. This repository makes one change to the seeded table: the
|
| 124 |
+
`repo default` line pins the opam-repository to a single commit,
|
| 125 |
+
|
| 126 |
+
```
|
| 127 |
+
repo default git+https://github.com/ocaml/opam-repository.git#4f41495f12b15921ce982ac208c41b257d295515
|
| 128 |
+
```
|
| 129 |
+
|
| 130 |
+
so every maintainer and every CI run solves against the same package index and
|
| 131 |
+
produces the same lock. Bump the commit deliberately, then re-solve with
|
| 132 |
+
`Refresh mode=solve`.
|
| 133 |
+
|
| 134 |
+
---
|
| 135 |
+
|
| 136 |
+
<!-- The "## High Performance" section is added on the dk1-high-performance branch. -->
|
| 137 |
+
|
| 138 |
+
## Editing a file and rebuilding
|
| 139 |
+
|
| 140 |
+
The supported flow after editing a source file:
|
| 141 |
+
|
| 142 |
+
```sh
|
| 143 |
+
# edit e.g. src/main/main.ml, then:
|
| 144 |
+
./dk1 update --no-imports # recompute workspace-asset checksums in dk.u
|
| 145 |
+
./dk1 run-object NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 \
|
| 146 |
+
-s Release.execution_abi -m bin/ocamlearlybird.exe -- --help
|
| 147 |
+
```
|
| 148 |
+
|
| 149 |
+
dk0/dk1 re-checksum workspace assets **only on `update`**, so `dk1 update` is what
|
| 150 |
+
turns a working-tree edit into a new content hash, so only the objects whose
|
| 151 |
+
inputs actually changed rebuild, here
|
| 152 |
+
the localized-source object and the local `earlybird` package object, while every
|
| 153 |
+
external package object stays cached and is reused untouched.
|
| 154 |
+
|
| 155 |
+
## What gets cached
|
| 156 |
+
|
| 157 |
+
| Piece | Quick Setup source |
|
| 158 |
+
| --- | --- |
|
| 159 |
+
| OCaml compiler toolchain (`CommonsLang_OCaml.DkML@4.14.3`) | fetched prebuilt from the `dkpkg` release |
|
| 160 |
+
| Dune (`CommonsLang_OCaml.Dune@3.23.1`) | fetched prebuilt from the `dkpkg` release |
|
| 161 |
+
| opam and the build utilities (coreutils, 7-Zip, GNU make) | fetched prebuilt from the `dkpkg` releases |
|
| 162 |
+
| MSYS2 runtime (Windows slots) | fetched prebuilt from the `dkpkg` release |
|
| 163 |
+
| The 53 locked dependency packages (lwt, dap, menhir, ppxlib, …) | built locally once, then cached |
|
| 164 |
+
| The in-tree `earlybird` package | built locally, rebuilt on source edits |
|
| 165 |
+
| Localized source and final executable forms | built locally (copy and archive steps) |
|
| 166 |
+
|
| 167 |
+
A dk object id is a hash of the values-file content, the `module@version`, and
|
| 168 |
+
the slot, and the id embeds this project's namespace. A
|
| 169 |
+
project's own prior releases are the cache that pays off for the dependency
|
| 170 |
+
packages, which is what the High Performance CI path sets up.
|
| 171 |
+
|
| 172 |
+
## Supported OCaml versions
|
| 173 |
+
|
| 174 |
+
This build compiles ocamlearlybird with OCaml 4.14.3 (the
|
| 175 |
+
`CommonsLang_OCaml.DkML@4.14.3` toolchain). A bytecode debugger must be built
|
| 176 |
+
with the same compiler version as the program it debugs, so this build debugs
|
| 177 |
+
programs compiled with OCaml 4.14.x.
|
| 178 |
+
|
| 179 |
+
To debug a program compiled with a different OCaml version, build ocamlearlybird
|
| 180 |
+
with that compiler using upstream's opam instructions; the dk pipeline here
|
| 181 |
+
builds with 4.14.3.
|
| 182 |
+
|
| 183 |
+
### Why `dap` is held at `{>= "1.0.6" & < "1.1.0"}`
|
| 184 |
+
|
| 185 |
+
Upstream ocamlearlybird bumped `earlybird.opam` / `dune-project` to `dap {>= "1.1.0"}`
|
| 186 |
+
(the "dap 1.71 spec" change) and set the RunInTerminal field
|
| 187 |
+
`args_can_be_interpreted_by_shell`. **Do not re-bump `dap` here** while the build
|
| 188 |
+
targets the 4.14.3 toolchain: `dap` 1.1.0's dependency closure does not solve
|
| 189 |
+
against it. The `< "1.1.0"` upper bound is load-bearing on its own: this
|
| 190 |
+
branch's source does not set the RunInTerminal field that `dap` 1.1.0's record
|
| 191 |
+
type requires, so a plain `opam install` that selects `dap` 1.1.0 (which current
|
| 192 |
+
opam-repository permits on many compilers) fails to compile
|
| 193 |
+
(`Some record fields are undefined: args_can_be_interpreted_by_shell`). The
|
| 194 |
+
bound makes the opam metadata state what the source can actually build against.
|
| 195 |
+
Solving the closure per pinned OCaml gives:
|
| 196 |
+
|
| 197 |
+
| Pinned solve | Result |
|
| 198 |
+
| --- | --- |
|
| 199 |
+
| `ocaml 4.14.3` | no solution; the closure requires `ocaml (< 4.14.3 \| >= 5.0)` |
|
| 200 |
+
| `ocaml 5.5.0` | no solution; the closure requires `ocaml < 5.4` |
|
| 201 |
+
| `dap 1.1.0` on `ocaml 4.14.3` | no `dap` satisfies |
|
| 202 |
+
|
| 203 |
+
So the feasible OCaml window for `dap` 1.1.0 is `< 4.14.3` or `[5.0, 5.4)`, and
|
| 204 |
+
`CommonsLang_OCaml` ships compiler objects only at 4.14.3 / 5.4.1 / 5.5.0. The
|
| 205 |
+
`args_can_be_interpreted_by_shell` field is DAP-optional and was set to `None`
|
| 206 |
+
(the absent/default behaviour), so keeping `dap` at 1.0.6 and dropping that one
|
| 207 |
+
field is behaviour-neutral.
|
|
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Pin table for CommonsLang_OCaml.Dk.OpamLock.Solve (see CLO.md "Quick Setup
|
| 2 |
+
# for Maintainers"). Every line below is explained in that section.
|
| 3 |
+
#
|
| 4 |
+
# Line forms:
|
| 5 |
+
# repo NAME URL opam repository for the solve (pin a commit with #COMMIT)
|
| 6 |
+
# pin NAME VERSION hard version lock for one opam package
|
| 7 |
+
# float NAME remove a pin inherited from an existing switch
|
| 8 |
+
# archexclude NAME ARCH exclude a package on one architecture
|
| 9 |
+
#
|
| 10 |
+
# --- repositories ---
|
| 11 |
+
# Pin ocaml/opam-repository to a single commit so the solved closure is
|
| 12 |
+
# reproducible run-to-run (master on 2026-08-08):
|
| 13 |
+
repo default git+https://github.com/ocaml/opam-repository.git#4f41495f12b15921ce982ac208c41b257d295515
|
| 14 |
+
#
|
| 15 |
+
# --- version locks ---
|
| 16 |
+
# Lock the OCaml compiler to 4.14.3. The per-package build rule
|
| 17 |
+
# (CommonsLang_OCaml.Dk.OpamBuild) compiles every package with the relocatable
|
| 18 |
+
# CommonsLang_OCaml.DkML@4.14.3 toolchain, so the lock MUST resolve the 4.14.x
|
| 19 |
+
# dependency closure. Without this pin the solver picks the newest OCaml (5.x)
|
| 20 |
+
# and selects 5.x-only package versions that would not compile under 4.14.3.
|
| 21 |
+
pin ocaml 4.14.3
|
| 22 |
+
pin ocaml-base-compiler 4.14.3
|
| 23 |
+
#
|
| 24 |
+
# Lock dune to 3.23.1, the version the toolchain provides
|
| 25 |
+
# (CommonsLang_OCaml.Dune@3.23.1). The toolchain lags opam-repository master, so
|
| 26 |
+
# an unpinned solve pulls packages (e.g. dune-configurator 3.24.x) that declare
|
| 27 |
+
# "dune" {>= "3.24"} and ship `(lang dune 3.24)`, which the provided Dune 3.23.1
|
| 28 |
+
# refuses ("Version 3.24 of the dune language is not supported"). Pinning dune to
|
| 29 |
+
# the provided version makes the solver pick dune-3.23-compatible package
|
| 30 |
+
# versions. GENERAL RULE: pin every toolchain-provided tool (ocaml, dune) to the
|
| 31 |
+
# exact version dk ships, so the solved closure matches what actually builds it.
|
| 32 |
+
pin dune 3.23.1
|
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
(lang dune 2.8)
|
|
@@ -0,0 +1,2256 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"$schema": "https://diskuv.com/dk/schema/dk-opam-lock-1.0.json",
|
| 3 |
+
"generated": {
|
| 4 |
+
"opam_version": "2.5.1",
|
| 5 |
+
"tool": "CommonsLang_OCaml.Dk.OpamLock@1.1.0"
|
| 6 |
+
},
|
| 7 |
+
"opam_repositories": [
|
| 8 |
+
{
|
| 9 |
+
"commit": null,
|
| 10 |
+
"name": "default",
|
| 11 |
+
"url": "git+https://github.com/ocaml/opam-repository.git#4f41495f12b15921ce982ac208c41b257d295515"
|
| 12 |
+
}
|
| 13 |
+
],
|
| 14 |
+
"packages": {
|
| 15 |
+
"angstrom-lwt-unix.0.16.1": {
|
| 16 |
+
"build": "[\"dune\" \"subst\"] {dev}\n[\"dune\" \"build\" \"-p\" name \"-j\" jobs]\n[\"dune\" \"runtest\" \"-p\" name \"-j\" jobs] {with-test}",
|
| 17 |
+
"depends": [
|
| 18 |
+
"ocaml",
|
| 19 |
+
"dune",
|
| 20 |
+
"angstrom",
|
| 21 |
+
"lwt",
|
| 22 |
+
"base-unix"
|
| 23 |
+
],
|
| 24 |
+
"depends_raw": "\"ocaml\" {>= \"4.03.0\"} \"dune\" {>= \"1.8\"} \"angstrom\" \"lwt\" \"base-unix\"",
|
| 25 |
+
"install": null,
|
| 26 |
+
"name": "angstrom-lwt-unix",
|
| 27 |
+
"source": {
|
| 28 |
+
"archive": "tgz",
|
| 29 |
+
"checksums": [
|
| 30 |
+
"md5=a9e096b4b2b8e4e3bb17d472bbccaad0",
|
| 31 |
+
"sha256=143536fb4d049574c539b9990840615e078ed3dd94e1d24888293f68349a100b"
|
| 32 |
+
],
|
| 33 |
+
"size": 117544,
|
| 34 |
+
"url": "https://github.com/inhabitedtype/angstrom/archive/0.16.1.tar.gz"
|
| 35 |
+
},
|
| 36 |
+
"version": "0.16.1"
|
| 37 |
+
},
|
| 38 |
+
"angstrom.0.16.1": {
|
| 39 |
+
"build": "[\"dune\" \"subst\"] {dev}\n[\"dune\" \"build\" \"-p\" name \"-j\" jobs]\n[\"dune\" \"runtest\" \"-p\" name \"-j\" jobs] {with-test}",
|
| 40 |
+
"depends": [
|
| 41 |
+
"ocaml",
|
| 42 |
+
"dune",
|
| 43 |
+
"bigstringaf",
|
| 44 |
+
"ocaml-syntax-shims"
|
| 45 |
+
],
|
| 46 |
+
"depends_raw": "\"ocaml\" {>= \"4.04.0\"}\n\"dune\" {>= \"1.8\"}\n\"alcotest\" {with-test & >= \"0.8.1\"}\n\"bigstringaf\"\n\"ppx_let\" {with-test & >= \"v0.14.0\"}\n\"ocaml-syntax-shims\" {build}",
|
| 47 |
+
"install": null,
|
| 48 |
+
"name": "angstrom",
|
| 49 |
+
"source": {
|
| 50 |
+
"archive": "tgz",
|
| 51 |
+
"checksums": [
|
| 52 |
+
"md5=a9e096b4b2b8e4e3bb17d472bbccaad0",
|
| 53 |
+
"sha256=143536fb4d049574c539b9990840615e078ed3dd94e1d24888293f68349a100b"
|
| 54 |
+
],
|
| 55 |
+
"size": 117544,
|
| 56 |
+
"url": "https://github.com/inhabitedtype/angstrom/archive/0.16.1.tar.gz"
|
| 57 |
+
},
|
| 58 |
+
"version": "0.16.1"
|
| 59 |
+
},
|
| 60 |
+
"arch-x86_64.1": {
|
| 61 |
+
"build": null,
|
| 62 |
+
"depends": [
|
| 63 |
+
"ocaml-base-compiler",
|
| 64 |
+
"host-arch-x86_64"
|
| 65 |
+
],
|
| 66 |
+
"depends_raw": "(\"ocaml-base-compiler\" {post & >= \"4.13.0~\"} |\n \"ocaml-variants\" {post & >= \"4.13.0~\"})\n\"host-arch-x86_64\" {post}",
|
| 67 |
+
"install": null,
|
| 68 |
+
"name": "arch-x86_64",
|
| 69 |
+
"source": null,
|
| 70 |
+
"version": "1"
|
| 71 |
+
},
|
| 72 |
+
"base-bigarray.base": {
|
| 73 |
+
"build": null,
|
| 74 |
+
"depends": [],
|
| 75 |
+
"depends_raw": null,
|
| 76 |
+
"install": null,
|
| 77 |
+
"name": "base-bigarray",
|
| 78 |
+
"source": null,
|
| 79 |
+
"version": "base"
|
| 80 |
+
},
|
| 81 |
+
"base-bytes.base": {
|
| 82 |
+
"build": null,
|
| 83 |
+
"depends": [
|
| 84 |
+
"ocaml",
|
| 85 |
+
"ocamlfind"
|
| 86 |
+
],
|
| 87 |
+
"depends_raw": "\"ocaml\" {>= \"4.02.0\"} \"ocamlfind\" {>= \"1.5.3\"}",
|
| 88 |
+
"install": null,
|
| 89 |
+
"name": "base-bytes",
|
| 90 |
+
"source": null,
|
| 91 |
+
"version": "base"
|
| 92 |
+
},
|
| 93 |
+
"base-threads.base": {
|
| 94 |
+
"build": null,
|
| 95 |
+
"depends": [],
|
| 96 |
+
"depends_raw": null,
|
| 97 |
+
"install": null,
|
| 98 |
+
"name": "base-threads",
|
| 99 |
+
"source": null,
|
| 100 |
+
"version": "base"
|
| 101 |
+
},
|
| 102 |
+
"base-unix.base": {
|
| 103 |
+
"build": null,
|
| 104 |
+
"depends": [],
|
| 105 |
+
"depends_raw": null,
|
| 106 |
+
"install": null,
|
| 107 |
+
"name": "base-unix",
|
| 108 |
+
"source": null,
|
| 109 |
+
"version": "base"
|
| 110 |
+
},
|
| 111 |
+
"base.v0.16.5": {
|
| 112 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 113 |
+
"depends": [
|
| 114 |
+
"ocaml",
|
| 115 |
+
"sexplib0",
|
| 116 |
+
"dune",
|
| 117 |
+
"dune-configurator"
|
| 118 |
+
],
|
| 119 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"sexplib0\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"dune-configurator\"",
|
| 120 |
+
"install": null,
|
| 121 |
+
"name": "base",
|
| 122 |
+
"source": {
|
| 123 |
+
"archive": "tgz",
|
| 124 |
+
"checksums": [
|
| 125 |
+
"md5=109456ad2350671ad3159cbbca993e3e",
|
| 126 |
+
"sha512=445d08b965e0d559e4046b874f611c8f36de47fa5c23a047146f48ee638588c1b73789a7adb5ead235c0ad2f44b56fd513a6d60bcb8b6c9f11566d32fd7760f2",
|
| 127 |
+
"sha256=e34b3e18b404b5b71db599a35fcf32da463b759867981839670aff8b9e8813bc"
|
| 128 |
+
],
|
| 129 |
+
"size": 442654,
|
| 130 |
+
"url": "https://github.com/janestreet/base/archive/refs/tags/v0.16.5.tar.gz"
|
| 131 |
+
},
|
| 132 |
+
"version": "v0.16.5"
|
| 133 |
+
},
|
| 134 |
+
"bigstringaf.0.10.0": {
|
| 135 |
+
"build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test}\n \"@doc\" {with-doc}\n]",
|
| 136 |
+
"depends": [
|
| 137 |
+
"dune",
|
| 138 |
+
"dune-configurator",
|
| 139 |
+
"ocaml"
|
| 140 |
+
],
|
| 141 |
+
"depends_raw": "\"dune\" {>= \"3.0\"}\n\"dune-configurator\" {>= \"3.0\"}\n\"alcotest\" {with-test}\n\"ocaml\" {>= \"4.08.0\"}",
|
| 142 |
+
"install": null,
|
| 143 |
+
"name": "bigstringaf",
|
| 144 |
+
"source": {
|
| 145 |
+
"archive": "tgz",
|
| 146 |
+
"checksums": [
|
| 147 |
+
"sha512=b51c756925d7016ffd7eac49e69393a1897391ca2685a8c30c7b6e3917b4d66c9400b49e8986d0f03329197b95ad52e096ff83dea5e03571cb5bc3d9a5170602",
|
| 148 |
+
"sha256=ed92f5b05fbc11b9defcec734d59b1068f3717a9ae4f9705c16c7f7ac3729f28",
|
| 149 |
+
"md5=be0a44416840852777651150757a0a3b"
|
| 150 |
+
],
|
| 151 |
+
"size": 12175,
|
| 152 |
+
"url": "https://github.com/inhabitedtype/bigstringaf/archive/0.10.0.tar.gz"
|
| 153 |
+
},
|
| 154 |
+
"version": "0.10.0"
|
| 155 |
+
},
|
| 156 |
+
"cmdliner.2.1.1": {
|
| 157 |
+
"build": "make \"all\" \"PREFIX=%{prefix}%\"",
|
| 158 |
+
"depends": [
|
| 159 |
+
"ocaml"
|
| 160 |
+
],
|
| 161 |
+
"depends_raw": "\"ocaml\" {>= \"4.08.0\"}",
|
| 162 |
+
"install": "[\n make\n \"install\"\n \"BINDIR=%{_:bin}%\"\n \"LIBDIR=%{_:lib}%\"\n \"DOCDIR=%{_:doc}%\"\n \"SHAREDIR=%{share}%\"\n \"MANDIR=%{man}%\"\n]\n[\n make\n \"install-doc\"\n \"LIBDIR=%{_:lib}%\"\n \"DOCDIR=%{_:doc}%\"\n \"SHAREDIR=%{share}%\"\n \"MANDIR=%{man}%\"\n]",
|
| 163 |
+
"name": "cmdliner",
|
| 164 |
+
"source": {
|
| 165 |
+
"archive": "tbz",
|
| 166 |
+
"checksums": [
|
| 167 |
+
"sha512=cdc338ae2e56a72b7c75dae9564c57cca4e1fbfac454aabbf8303fcb612346284aede5984dfde7e8a7a496cc870bbd57ddf28cab3a38667279b31657f85c15dd",
|
| 168 |
+
"sha256=05b938d1def4f54c478178f1982822834510431ed98f2ac67cb4d90aa120d6b6"
|
| 169 |
+
],
|
| 170 |
+
"size": 98754,
|
| 171 |
+
"url": "https://erratique.ch/software/cmdliner/releases/cmdliner-2.1.1.tbz"
|
| 172 |
+
},
|
| 173 |
+
"version": "2.1.1"
|
| 174 |
+
},
|
| 175 |
+
"conf-mingw-w64-gcc-i686.1": {
|
| 176 |
+
"build": "[\"i686-w64-mingw32-gcc\" \"--version\"]\n[\n \"sh\"\n \"./install-shim.sh\"\n name\n \"mingw64-i686-binutils mingw64-i686-gcc-core\"\n bin\n \"i686-w64-mingw32-gcc\"\n \"_shim\"\n \"cygpath\" {host-arch-x86_32:installed}\n] {os = \"win32\" & os-distribution = \"cygwin\" & mingw-w64-shims:installed}",
|
| 177 |
+
"depends": [
|
| 178 |
+
"host-arch-x86_64",
|
| 179 |
+
"host-arch-x86_32"
|
| 180 |
+
],
|
| 181 |
+
"depends_raw": "\"msys2\" {os-distribution = \"msys2\"}\n\"msys2-mingw32\" {os-distribution = \"msys2\"}\n(\"host-arch-x86_64\" | \"host-arch-x86_32\")",
|
| 182 |
+
"install": null,
|
| 183 |
+
"name": "conf-mingw-w64-gcc-i686",
|
| 184 |
+
"source": {
|
| 185 |
+
"archive": "tgz",
|
| 186 |
+
"checksums": [
|
| 187 |
+
"sha256=d29e6141f02500f13534b6a0d77c290f2987c534c660a4f90cdb01618be32507",
|
| 188 |
+
"sha512=892c4b5d7eaab6ce846fe8fe2756f23c61c654605b6c3bf8698db392725b3be81d015536230dc8305e7d17eb451beae5c21f705237523c79cc11e99c17cbed95"
|
| 189 |
+
],
|
| 190 |
+
"size": 7749,
|
| 191 |
+
"url": "https://github.com/dra27/mingw-w64-shims/archive/refs/tags/1.0.1.tar.gz"
|
| 192 |
+
},
|
| 193 |
+
"version": "1"
|
| 194 |
+
},
|
| 195 |
+
"conf-mingw-w64-gcc-x86_64.1": {
|
| 196 |
+
"build": "[\"x86_64-w64-mingw32-gcc\" \"--version\"]\n[\n \"sh\"\n \"./install-shim.sh\"\n name\n \"mingw64-x86_64-binutils mingw64-x86_64-gcc-core\"\n bin\n \"x86_64-w64-mingw32-gcc\"\n \"shim\"\n \"cygpath\" {host-arch-x86_64:installed}\n] {os = \"win32\" & os-distribution = \"cygwin\" & mingw-w64-shims:installed}",
|
| 197 |
+
"depends": [
|
| 198 |
+
"host-arch-x86_64",
|
| 199 |
+
"host-arch-x86_32"
|
| 200 |
+
],
|
| 201 |
+
"depends_raw": "\"msys2\" {os-distribution = \"msys2\"}\n\"msys2-mingw64\" {os-distribution = \"msys2\"}\n(\"host-arch-x86_64\" | \"host-arch-x86_32\")",
|
| 202 |
+
"install": null,
|
| 203 |
+
"name": "conf-mingw-w64-gcc-x86_64",
|
| 204 |
+
"source": {
|
| 205 |
+
"archive": "tgz",
|
| 206 |
+
"checksums": [
|
| 207 |
+
"sha256=d29e6141f02500f13534b6a0d77c290f2987c534c660a4f90cdb01618be32507",
|
| 208 |
+
"sha512=892c4b5d7eaab6ce846fe8fe2756f23c61c654605b6c3bf8698db392725b3be81d015536230dc8305e7d17eb451beae5c21f705237523c79cc11e99c17cbed95"
|
| 209 |
+
],
|
| 210 |
+
"size": 7749,
|
| 211 |
+
"url": "https://github.com/dra27/mingw-w64-shims/archive/refs/tags/1.0.1.tar.gz"
|
| 212 |
+
},
|
| 213 |
+
"version": "1"
|
| 214 |
+
},
|
| 215 |
+
"cppo.1.8.0": {
|
| 216 |
+
"build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test & dune:version < \"3.24\"}\n \"@doc\" {with-doc}\n]",
|
| 217 |
+
"depends": [
|
| 218 |
+
"ocaml",
|
| 219 |
+
"dune",
|
| 220 |
+
"base-unix"
|
| 221 |
+
],
|
| 222 |
+
"depends_raw": "\"ocaml\" {>= \"4.02.3\"} \"dune\" {>= \"2.0\"} \"base-unix\"",
|
| 223 |
+
"install": null,
|
| 224 |
+
"name": "cppo",
|
| 225 |
+
"source": {
|
| 226 |
+
"archive": "tgz",
|
| 227 |
+
"checksums": [
|
| 228 |
+
"md5=a197cb393b84f6b30e0ff55080ac429b",
|
| 229 |
+
"sha512=3840725b767a0300bdc48f11d26d798bdcae0a764ed6798df3a08dfc8cc76fe124b14a19d47c9b5ea8e229d68b0311510afce77c0e4d9131fbda5116dc2689a2",
|
| 230 |
+
"sha256=6e62a8ee0217c9cc38d5860110eb18eb8d89c05c420353d298e1431fe8bac00f"
|
| 231 |
+
],
|
| 232 |
+
"size": 43588,
|
| 233 |
+
"url": "https://github.com/ocaml-community/cppo/archive/v1.8.0.tar.gz"
|
| 234 |
+
},
|
| 235 |
+
"version": "1.8.0"
|
| 236 |
+
},
|
| 237 |
+
"csexp.1.5.2": {
|
| 238 |
+
"build": "[\"dune\" \"subst\"] {dev}\n[\"dune\" \"build\" \"-p\" name \"-j\" jobs \"@install\" \"@doc\" {with-doc}]",
|
| 239 |
+
"depends": [
|
| 240 |
+
"dune",
|
| 241 |
+
"ocaml"
|
| 242 |
+
],
|
| 243 |
+
"depends_raw": "\"dune\" {>= \"3.4\"} \"ocaml\" {>= \"4.03.0\"} \"odoc\" {with-doc}",
|
| 244 |
+
"install": null,
|
| 245 |
+
"name": "csexp",
|
| 246 |
+
"source": {
|
| 247 |
+
"archive": "tbz",
|
| 248 |
+
"checksums": [
|
| 249 |
+
"sha256=1a14dd04bb4379a41990248550628c77913a9c07f3c35c1370b6960e697787ff",
|
| 250 |
+
"sha512=be281018bcfc20d4db14894ef51c4b836d6338d2fdfe22e63d46f405f8dea7349e16f1c0ecd65f73d4c85a2a80e618cdbb8c9dafcbb9f229f04f1adca5b1973c"
|
| 251 |
+
],
|
| 252 |
+
"size": 11447,
|
| 253 |
+
"url": "https://github.com/ocaml-dune/csexp/releases/download/1.5.2/csexp-1.5.2.tbz"
|
| 254 |
+
},
|
| 255 |
+
"version": "1.5.2"
|
| 256 |
+
},
|
| 257 |
+
"dap.1.0.6": {
|
| 258 |
+
"build": "[\"dune\" \"subst\"] {dev} [\"dune\" \"build\" \"-p\" name \"-j\" jobs]",
|
| 259 |
+
"depends": [
|
| 260 |
+
"ocaml",
|
| 261 |
+
"dune",
|
| 262 |
+
"yojson",
|
| 263 |
+
"ppx_here",
|
| 264 |
+
"ppx_deriving",
|
| 265 |
+
"ppx_deriving_yojson",
|
| 266 |
+
"ppx_expect",
|
| 267 |
+
"lwt",
|
| 268 |
+
"lwt_ppx",
|
| 269 |
+
"lwt_react",
|
| 270 |
+
"react",
|
| 271 |
+
"angstrom",
|
| 272 |
+
"angstrom-lwt-unix",
|
| 273 |
+
"logs"
|
| 274 |
+
],
|
| 275 |
+
"depends_raw": "\"ocaml\" {>= \"4.08\"}\n\"dune\" {>= \"2.7\"}\n\"yojson\"\n\"ppx_here\"\n\"ppx_deriving\"\n\"ppx_deriving_yojson\"\n\"ppx_expect\"\n\"lwt\"\n\"lwt_ppx\" {>= \"2.0.1\"}\n\"lwt_react\"\n\"react\"\n\"angstrom\"\n\"angstrom-lwt-unix\"\n\"logs\"",
|
| 276 |
+
"install": null,
|
| 277 |
+
"name": "dap",
|
| 278 |
+
"source": {
|
| 279 |
+
"archive": "tbz",
|
| 280 |
+
"checksums": [
|
| 281 |
+
"sha256=e0b249a3e7382125402ad15d71f4924eef60cfcec326383a5168d424087200ff",
|
| 282 |
+
"sha512=97805a383ad03ba24f1dabe20798c139678f958dfa2aed1664098f444aaeefd56d6dd7ff3650800eaefe5b17e09098427b78500316699e7267eb1fef233d6a99"
|
| 283 |
+
],
|
| 284 |
+
"size": 58908,
|
| 285 |
+
"url": "https://github.com/hackwaly/ocaml-dap/releases/download/1.0.6/dap-1.0.6.tbz"
|
| 286 |
+
},
|
| 287 |
+
"version": "1.0.6"
|
| 288 |
+
},
|
| 289 |
+
"dune-configurator.3.23.1": {
|
| 290 |
+
"build": "[\"dune\" \"subst\"] {dev}\n[\"dune\" \"build\" \"-p\" name \"-j\" jobs \"@install\" \"@doc\" {with-doc}]",
|
| 291 |
+
"depends": [
|
| 292 |
+
"dune",
|
| 293 |
+
"ocaml",
|
| 294 |
+
"base-unix",
|
| 295 |
+
"csexp"
|
| 296 |
+
],
|
| 297 |
+
"depends_raw": "\"dune\" {>= \"3.23\"}\n\"ocaml\" {>= \"4.14.0\"}\n\"base-unix\"\n\"csexp\" {>= \"1.5.0\"}\n\"odoc\" {with-doc}",
|
| 298 |
+
"install": null,
|
| 299 |
+
"name": "dune-configurator",
|
| 300 |
+
"source": {
|
| 301 |
+
"archive": "tbz",
|
| 302 |
+
"checksums": [
|
| 303 |
+
"sha256=93b4e7157f6ba8feb61cfc5f86008efd2c59037ba78a017d92b4abf30632348f",
|
| 304 |
+
"sha512=e5566bedc651292ae54d47ba1cdbcfff48962012c1436d0f9ece49a71aa10a674affc092058b0edee56ab2a2405c545b78fde1c472c0b4704c8f58570a2f46cd"
|
| 305 |
+
],
|
| 306 |
+
"size": 2930222,
|
| 307 |
+
"url": "https://github.com/ocaml/dune/releases/download/3.23.1/dune-3.23.1.tbz"
|
| 308 |
+
},
|
| 309 |
+
"version": "3.23.1"
|
| 310 |
+
},
|
| 311 |
+
"dune.3.23.1": {
|
| 312 |
+
"build": "[\"ocaml\" \"boot/bootstrap.ml\" \"-j\" jobs]\n[\n \"./_boot/dune.exe\"\n \"build\"\n \"dune.install\"\n \"--release\"\n \"--profile\"\n \"dune-bootstrap\"\n \"-j\"\n jobs\n]",
|
| 313 |
+
"depends": [
|
| 314 |
+
"ocaml",
|
| 315 |
+
"base-unix",
|
| 316 |
+
"base-threads"
|
| 317 |
+
],
|
| 318 |
+
"depends_raw": "(\"ocaml\" {>= \"4.14\"} |\n (\"ocaml\" {>= \"4.02\" & < \"4.14~~\"} & \"ocamlfind-secondary\" &\n \"ocaml-secondary-compiler\" {>= \"4.14\"}))\n\"base-unix\"\n\"base-threads\"\n\"lwt\" {with-dev-setup & os != \"win32\"}\n\"cinaps\" {with-dev-setup}\n\"csexp\" {with-dev-setup & >= \"1.3.0\"}\n\"js_of_ocaml\" {with-dev-setup & >= \"6.1.0\" & os != \"win32\"}\n\"js_of_ocaml-compiler\" {with-dev-setup & >= \"6.1.0\" & os != \"win32\"}\n\"mdx\" {with-dev-setup & >= \"2.3.0\" & os != \"win32\"}\n\"menhir\" {with-dev-setup & os != \"win32\"}\n\"ocamlfind\" {with-dev-setup & os != \"win32\"}\n\"odoc\" {with-dev-setup & >= \"2.4.0\" & os != \"win32\"}\n\"ppx_expect\" {with-dev-setup & >= \"v0.17\" & os != \"win32\"}\n\"spawn\" {with-dev-setup}\n\"ppx_inline_test\" {with-dev-setup & os != \"win32\"}\n\"ppxlib\" {with-dev-setup & >= \"0.37.0\" & os != \"win32\"}\n\"ctypes\" {with-dev-setup & os != \"win32\"}\n\"utop\" {with-dev-setup & >= \"2.6.0\" & os != \"win32\"}\n\"melange\" {with-dev-setup & >= \"5.1.0-51\" & os != \"win32\"}\n\"uutf\" {with-dev-setup}\n\"conf-git-daemon\" {with-test}",
|
| 319 |
+
"install": null,
|
| 320 |
+
"name": "dune",
|
| 321 |
+
"source": {
|
| 322 |
+
"archive": "tbz",
|
| 323 |
+
"checksums": [
|
| 324 |
+
"sha256=93b4e7157f6ba8feb61cfc5f86008efd2c59037ba78a017d92b4abf30632348f",
|
| 325 |
+
"sha512=e5566bedc651292ae54d47ba1cdbcfff48962012c1436d0f9ece49a71aa10a674affc092058b0edee56ab2a2405c545b78fde1c472c0b4704c8f58570a2f46cd"
|
| 326 |
+
],
|
| 327 |
+
"size": 2930222,
|
| 328 |
+
"url": "https://github.com/ocaml/dune/releases/download/3.23.1/dune-3.23.1.tbz"
|
| 329 |
+
},
|
| 330 |
+
"version": "3.23.1"
|
| 331 |
+
},
|
| 332 |
+
"earlybird.1.3.6": {
|
| 333 |
+
"build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test}\n \"@doc\" {with-doc}\n]",
|
| 334 |
+
"depends": [
|
| 335 |
+
"dune",
|
| 336 |
+
"ocaml",
|
| 337 |
+
"ppx_deriving",
|
| 338 |
+
"ppx_deriving_yojson",
|
| 339 |
+
"menhir",
|
| 340 |
+
"menhirLib",
|
| 341 |
+
"ocaml-compiler-libs",
|
| 342 |
+
"ppx_optcomp",
|
| 343 |
+
"iter",
|
| 344 |
+
"lwt",
|
| 345 |
+
"lwt_ppx",
|
| 346 |
+
"lwt_react",
|
| 347 |
+
"cmdliner",
|
| 348 |
+
"logs",
|
| 349 |
+
"fmt",
|
| 350 |
+
"path_glob",
|
| 351 |
+
"sexplib",
|
| 352 |
+
"csexp",
|
| 353 |
+
"lru",
|
| 354 |
+
"dap"
|
| 355 |
+
],
|
| 356 |
+
"depends_raw": "\"dune\" {>= \"3.7\"}\n\"ocaml\" {>= \"4.12.0\"}\n\"ppx_deriving\" {>= \"5.1\"}\n\"ppx_deriving_yojson\" {>= \"3.6.1\"}\n\"menhir\" {>= \"20201216\" & build}\n\"menhirLib\" {>= \"20201216\"}\n\"ocaml-compiler-libs\" {>= \"v0.12.3\"}\n\"ppx_optcomp\" {>= \"v0.11\"}\n\"iter\" {>= \"1.2.1\"}\n\"lwt\" {>= \"5.4.0\"}\n\"lwt_ppx\" {>= \"2.0.1\"}\n\"lwt_react\" {>= \"1.1.3\"}\n\"cmdliner\" {>= \"1.1.0\"}\n\"logs\" {>= \"0.7.0\"}\n\"fmt\" {>= \"0.8.9\"}\n\"path_glob\" {>= \"0.2\"}\n\"sexplib\" {>= \"v0.14.0\"}\n\"csexp\" {>= \"1.3.2\"}\n\"lru\" {>= \"0.3.0\"}\n\"dap\" {>= \"1.0.6\" & < \"1.1.0\"}\n\"odoc\" {with-doc}",
|
| 357 |
+
"install": null,
|
| 358 |
+
"local": "t",
|
| 359 |
+
"name": "earlybird",
|
| 360 |
+
"source": null,
|
| 361 |
+
"version": "1.3.6"
|
| 362 |
+
},
|
| 363 |
+
"flexdll.0.44": {
|
| 364 |
+
"build": null,
|
| 365 |
+
"depends": [],
|
| 366 |
+
"depends_raw": null,
|
| 367 |
+
"install": null,
|
| 368 |
+
"name": "flexdll",
|
| 369 |
+
"source": {
|
| 370 |
+
"archive": "tgz",
|
| 371 |
+
"checksums": [
|
| 372 |
+
"sha256=b7c6a92286f1f3065324d51083dcb16eec436a4e6e3b8df7cf836b6d7a8b9491",
|
| 373 |
+
"sha512=87c5e38810dcf4bba43472e6c4e2ea25081a92664e37269f782ef9412e81d37d53edbbeb0acbf5eb821cc5105085a99337b30e55409057121a68472eb51db7c8"
|
| 374 |
+
],
|
| 375 |
+
"size": 74690,
|
| 376 |
+
"url": "https://github.com/ocaml/flexdll/archive/refs/tags/0.44.tar.gz"
|
| 377 |
+
},
|
| 378 |
+
"version": "0.44"
|
| 379 |
+
},
|
| 380 |
+
"fmt.0.11.0": {
|
| 381 |
+
"build": "\"ocaml\"\n\"pkg/pkg.ml\"\n\"build\"\n\"--dev-pkg\"\n\"%{dev}%\"\n\"--with-base-unix\"\n\"%{base-unix:installed}%\"\n\"--with-cmdliner\"\n\"%{cmdliner:installed}%\"",
|
| 382 |
+
"depends": [
|
| 383 |
+
"ocaml",
|
| 384 |
+
"ocamlfind",
|
| 385 |
+
"ocamlbuild",
|
| 386 |
+
"topkg",
|
| 387 |
+
"base-unix",
|
| 388 |
+
"cmdliner"
|
| 389 |
+
],
|
| 390 |
+
"depends_raw": "\"ocaml\" {>= \"4.08.0\"}\n\"ocamlfind\" {build}\n\"ocamlbuild\" {build}\n\"topkg\" {build & >= \"1.1.0\"}",
|
| 391 |
+
"install": null,
|
| 392 |
+
"name": "fmt",
|
| 393 |
+
"source": {
|
| 394 |
+
"archive": "tbz",
|
| 395 |
+
"checksums": [
|
| 396 |
+
"sha512=3f40155fc6a7315202e410585964307d63416c8001fd243667ed9d8d1a02b67deecacb25e9c2feb409c537bbdfb7817d91168de4ddd643532ff51d6c1c696a4a",
|
| 397 |
+
"sha256=857cfd47a54b52429cd9b3e2665e44173cd1bd3b435bece7172f984ad5376a1b"
|
| 398 |
+
],
|
| 399 |
+
"size": 23336,
|
| 400 |
+
"url": "https://erratique.ch/software/fmt/releases/fmt-0.11.0.tbz"
|
| 401 |
+
},
|
| 402 |
+
"version": "0.11.0"
|
| 403 |
+
},
|
| 404 |
+
"host-arch-x86_32.1": {
|
| 405 |
+
"build": null,
|
| 406 |
+
"depends": [],
|
| 407 |
+
"depends_raw": null,
|
| 408 |
+
"install": null,
|
| 409 |
+
"name": "host-arch-x86_32",
|
| 410 |
+
"source": null,
|
| 411 |
+
"version": "1"
|
| 412 |
+
},
|
| 413 |
+
"host-arch-x86_64.1": {
|
| 414 |
+
"build": null,
|
| 415 |
+
"depends": [],
|
| 416 |
+
"depends_raw": null,
|
| 417 |
+
"install": null,
|
| 418 |
+
"name": "host-arch-x86_64",
|
| 419 |
+
"source": null,
|
| 420 |
+
"version": "1"
|
| 421 |
+
},
|
| 422 |
+
"host-system-mingw.1": {
|
| 423 |
+
"build": null,
|
| 424 |
+
"depends": [],
|
| 425 |
+
"depends_raw": null,
|
| 426 |
+
"install": null,
|
| 427 |
+
"name": "host-system-mingw",
|
| 428 |
+
"source": null,
|
| 429 |
+
"version": "1"
|
| 430 |
+
},
|
| 431 |
+
"iter.1.9": {
|
| 432 |
+
"build": "[\"dune\" \"build\" \"@install\" \"-p\" name \"-j\" jobs]\n[\"dune\" \"build\" \"@doc\" \"-p\" name \"-j\" jobs] {with-doc}\n[\"dune\" \"runtest\" \"-p\" name \"-j\" jobs]\n {with-test & arch != \"arm32\" & arch != \"x86_32\"}",
|
| 433 |
+
"depends": [
|
| 434 |
+
"ocaml",
|
| 435 |
+
"dune",
|
| 436 |
+
"base-bigarray"
|
| 437 |
+
],
|
| 438 |
+
"depends_raw": "\"ocaml\" {>= \"4.08.0\"}\n\"dune\" {>= \"2.0\"}\n\"qcheck-core\" {with-test}\n\"ounit2\" {with-test}\n\"mdx\" {with-test & >= \"1.3\"}\n\"odoc\" {with-doc}",
|
| 439 |
+
"install": null,
|
| 440 |
+
"name": "iter",
|
| 441 |
+
"source": {
|
| 442 |
+
"archive": "tbz",
|
| 443 |
+
"checksums": [
|
| 444 |
+
"sha256=dba9e5bb152e0d0db0054c36b2a9476747a284a7738f15f1195a3e2035c7e968",
|
| 445 |
+
"sha512=6c8e0fd57ebca9db642ef6105cb23353fb4f4aa2a37b49ceb61adc9881d0d42e0212326efddea183fae7e27313321680036c3932863004b1853b5fbf37c521de"
|
| 446 |
+
],
|
| 447 |
+
"size": 34177,
|
| 448 |
+
"url": "https://github.com/c-cube/iter/releases/download/v1.9/iter-1.9.tbz"
|
| 449 |
+
},
|
| 450 |
+
"version": "1.9"
|
| 451 |
+
},
|
| 452 |
+
"jane-street-headers.v0.16.0": {
|
| 453 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 454 |
+
"depends": [
|
| 455 |
+
"ocaml",
|
| 456 |
+
"dune"
|
| 457 |
+
],
|
| 458 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"} \"dune\" {>= \"2.0.0\"}",
|
| 459 |
+
"install": null,
|
| 460 |
+
"name": "jane-street-headers",
|
| 461 |
+
"source": {
|
| 462 |
+
"archive": "tgz",
|
| 463 |
+
"checksums": [
|
| 464 |
+
"sha256=876d409feeb495487b10010fb601c64829d2aa15f1b156b704ec141337d360ea"
|
| 465 |
+
],
|
| 466 |
+
"size": 4844,
|
| 467 |
+
"url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/jane-street-headers-v0.16.0.tar.gz"
|
| 468 |
+
},
|
| 469 |
+
"version": "v0.16.0"
|
| 470 |
+
},
|
| 471 |
+
"jst-config.v0.16.0": {
|
| 472 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 473 |
+
"depends": [
|
| 474 |
+
"ocaml",
|
| 475 |
+
"base",
|
| 476 |
+
"ppx_assert",
|
| 477 |
+
"dune",
|
| 478 |
+
"dune-configurator"
|
| 479 |
+
],
|
| 480 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_assert\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"dune-configurator\"",
|
| 481 |
+
"install": null,
|
| 482 |
+
"name": "jst-config",
|
| 483 |
+
"source": {
|
| 484 |
+
"archive": "tgz",
|
| 485 |
+
"checksums": [
|
| 486 |
+
"sha256=faead56d8582868cdc099ad54f9bae059cc48710b724600cc64013e73c14d95b"
|
| 487 |
+
],
|
| 488 |
+
"size": 4886,
|
| 489 |
+
"url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/jst-config-v0.16.0.tar.gz"
|
| 490 |
+
},
|
| 491 |
+
"version": "v0.16.0"
|
| 492 |
+
},
|
| 493 |
+
"logs.0.10.0": {
|
| 494 |
+
"build": "\"ocaml\"\n\"pkg/pkg.ml\"\n\"build\"\n\"--dev-pkg\"\n\"%{dev}%\"\n\"--with-js_of_ocaml-compiler\"\n\"%{js_of_ocaml-compiler:installed}%\"\n\"--with-fmt\"\n\"%{fmt:installed}%\"\n\"--with-cmdliner\"\n\"%{cmdliner:installed}%\"\n\"--with-lwt\"\n\"%{lwt:installed}%\"\n\"--with-base-threads\"\n\"%{base-threads:installed}%\"",
|
| 495 |
+
"depends": [
|
| 496 |
+
"ocaml",
|
| 497 |
+
"ocamlfind",
|
| 498 |
+
"ocamlbuild",
|
| 499 |
+
"topkg",
|
| 500 |
+
"cmdliner",
|
| 501 |
+
"fmt",
|
| 502 |
+
"lwt",
|
| 503 |
+
"base-threads"
|
| 504 |
+
],
|
| 505 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"ocamlfind\" {build}\n\"ocamlbuild\" {build}\n\"topkg\" {build & >= \"1.1.0\"}\n\"mtime\" {with-test}",
|
| 506 |
+
"install": null,
|
| 507 |
+
"name": "logs",
|
| 508 |
+
"source": {
|
| 509 |
+
"archive": "tbz",
|
| 510 |
+
"checksums": [
|
| 511 |
+
"sha512=122b7a77bd07aee1e0cb8e07e82b195a12528cf015e72fa0dd5afaae26ce04bad9b29f32a6d3bd3547fe522b8a036608785e8adb900e31580a0d555719bbb7e7",
|
| 512 |
+
"sha256=760ec291c128d75b74826091337764f925b5ca414b02e2d336a0b37bf30df4ea"
|
| 513 |
+
],
|
| 514 |
+
"size": 20044,
|
| 515 |
+
"url": "https://erratique.ch/software/logs/releases/logs-0.10.0.tbz"
|
| 516 |
+
},
|
| 517 |
+
"version": "0.10.0"
|
| 518 |
+
},
|
| 519 |
+
"lru.0.3.1": {
|
| 520 |
+
"build": "[\"dune\" \"subst\"] {dev}\n[\"dune\" \"build\" \"-p\" name \"-j\" jobs]\n[\"dune\" \"runtest\" \"-p\" name] {with-test & ocaml:version >= \"4.07.0\"}",
|
| 521 |
+
"depends": [
|
| 522 |
+
"ocaml",
|
| 523 |
+
"dune",
|
| 524 |
+
"psq"
|
| 525 |
+
],
|
| 526 |
+
"depends_raw": "\"ocaml\" {>= \"4.03.0\"}\n\"dune\" {>= \"1.7\"}\n\"psq\" {>= \"0.2.0\"}\n\"qcheck-core\" {with-test}\n\"qcheck-alcotest\" {with-test}\n\"alcotest\" {with-test}",
|
| 527 |
+
"install": null,
|
| 528 |
+
"name": "lru",
|
| 529 |
+
"source": {
|
| 530 |
+
"archive": "tbz",
|
| 531 |
+
"checksums": [
|
| 532 |
+
"sha256=6cbe23d27a7d5b244f869c0b88140d47f70f413a6462ef35c0009325d4b236fd",
|
| 533 |
+
"sha512=81144e258d6e488d4677ade91132401b6f8871c72aadf2f1c190c4dee918c71c5df10c4e690c5bf1ab0f364d87989d44aec3695310a3477f6473eb17c1261734"
|
| 534 |
+
],
|
| 535 |
+
"size": 10201,
|
| 536 |
+
"url": "https://github.com/pqwy/lru/releases/download/v0.3.1/lru-0.3.1.tbz"
|
| 537 |
+
},
|
| 538 |
+
"version": "0.3.1"
|
| 539 |
+
},
|
| 540 |
+
"lwt.5.10.1": {
|
| 541 |
+
"build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"exec\"\n \"-p\"\n name\n \"src/unix/config/discover.exe\"\n \"--\"\n \"--save\"\n \"--use-libev\"\n \"%{conf-libev:installed}%\"\n]\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test}\n \"@doc\" {with-doc}\n]",
|
| 542 |
+
"depends": [
|
| 543 |
+
"dune",
|
| 544 |
+
"ocaml",
|
| 545 |
+
"cppo",
|
| 546 |
+
"ocamlfind",
|
| 547 |
+
"dune-configurator",
|
| 548 |
+
"ocplib-endian",
|
| 549 |
+
"base-threads",
|
| 550 |
+
"base-unix"
|
| 551 |
+
],
|
| 552 |
+
"depends_raw": "\"dune\" {>= \"3.15\"}\n\"ocaml\" {>= \"4.08\"}\n\"cppo\" {build & >= \"1.1\"}\n\"ocamlfind\" {dev & >= \"1.7.3-1\"}\n\"odoc\" {with-doc & >= \"2.3\"}\n\"dune-configurator\"\n\"ocplib-endian\"",
|
| 553 |
+
"install": null,
|
| 554 |
+
"name": "lwt",
|
| 555 |
+
"source": {
|
| 556 |
+
"archive": "tgz",
|
| 557 |
+
"checksums": [
|
| 558 |
+
"md5=3550f2448bf94379ecd3d480eb8cb070",
|
| 559 |
+
"sha512=361b4fe8b1613683a0cd89fea08d9ae1615f84e771363ba97843c2dda5c3f45b4a4b6c048c8d79fa58d609c45a7e1dfa2b3e9873d02bac82934fd892f8f4fce1",
|
| 560 |
+
"sha256=0086b73b57710a6b80deacb6256daee1cf56e24dcb56eb5a49ce4a4516e1b040"
|
| 561 |
+
],
|
| 562 |
+
"size": 312834,
|
| 563 |
+
"url": "https://github.com/ocsigen/lwt/archive/refs/tags/5.10.1.tar.gz"
|
| 564 |
+
},
|
| 565 |
+
"version": "5.10.1"
|
| 566 |
+
},
|
| 567 |
+
"lwt_ppx.5.9.1": {
|
| 568 |
+
"build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test}\n \"@doc\" {with-doc}\n]",
|
| 569 |
+
"depends": [
|
| 570 |
+
"dune",
|
| 571 |
+
"ocaml",
|
| 572 |
+
"ppxlib",
|
| 573 |
+
"lwt"
|
| 574 |
+
],
|
| 575 |
+
"depends_raw": "\"dune\" {>= \"2.7\"}\n\"ocaml\" {>= \"4.08\"}\n\"ppxlib\" {>= \"0.16.0\" & < \"0.36\"}\n\"ppx_let\" {with-test}\n\"lwt\" {>= \"5.7.0\" & < \"6.0.0\"}\n\"odoc\" {with-doc}",
|
| 576 |
+
"install": null,
|
| 577 |
+
"name": "lwt_ppx",
|
| 578 |
+
"source": {
|
| 579 |
+
"archive": "tgz",
|
| 580 |
+
"checksums": [
|
| 581 |
+
"md5=18742da8b8fe3618e3fa700b7a884fe7",
|
| 582 |
+
"sha512=1c51fdb4d0856c89e2df08a1c0095ef28ebd0f613b07b03d0f66501ca5486515562071291e6d0932e57587ed0c9362c8b92c5c9eddb4d2bb2f5e129986b484a7",
|
| 583 |
+
"sha256=03bf4bae6908a947582485c2a0b8f96428f39f97efd540573a613632be56ad2a"
|
| 584 |
+
],
|
| 585 |
+
"size": 312306,
|
| 586 |
+
"url": "https://github.com/ocsigen/lwt/archive/refs/tags/5.9.1.tar.gz"
|
| 587 |
+
},
|
| 588 |
+
"version": "5.9.1"
|
| 589 |
+
},
|
| 590 |
+
"lwt_react.1.2.0": {
|
| 591 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 592 |
+
"depends": [
|
| 593 |
+
"dune",
|
| 594 |
+
"lwt",
|
| 595 |
+
"ocaml",
|
| 596 |
+
"react",
|
| 597 |
+
"cppo"
|
| 598 |
+
],
|
| 599 |
+
"depends_raw": "\"dune\" {>= \"1.8.0\"}\n\"lwt\" {>= \"3.0.0\"}\n\"ocaml\" {>= \"4.08\"}\n\"react\" {>= \"1.0.0\"}\n\"cppo\" {build & >= \"1.1.0\"}",
|
| 600 |
+
"install": null,
|
| 601 |
+
"name": "lwt_react",
|
| 602 |
+
"source": {
|
| 603 |
+
"archive": "tgz",
|
| 604 |
+
"checksums": [
|
| 605 |
+
"md5=e63979ee40a80d5b9e9e5545f33323b4",
|
| 606 |
+
"sha512=d616389bc9e0da11f25843ab7541ac2d40c9543700a89455f14115b339bbe58cef2b8acf0ae97fd54e15a4cb93149cfe1ebfda301aa93933045f76b7d9344160",
|
| 607 |
+
"sha256=1bd4ef42e3c98af4581e53553e42bea0f01c560b9959496949a2d95ca9e4e5e1"
|
| 608 |
+
],
|
| 609 |
+
"size": 315425,
|
| 610 |
+
"url": "https://github.com/ocsigen/lwt/archive/5.6.0.tar.gz"
|
| 611 |
+
},
|
| 612 |
+
"version": "1.2.0"
|
| 613 |
+
},
|
| 614 |
+
"menhir.20260209": {
|
| 615 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 616 |
+
"depends": [
|
| 617 |
+
"ocaml",
|
| 618 |
+
"dune",
|
| 619 |
+
"menhirLib",
|
| 620 |
+
"menhirSdk",
|
| 621 |
+
"menhirCST",
|
| 622 |
+
"menhirGLR"
|
| 623 |
+
],
|
| 624 |
+
"depends_raw": "\"ocaml\" {>= \"4.08\"}\n\"dune\" {>= \"2.8.0\"}\n\"menhirLib\" {= version}\n\"menhirSdk\" {= version}\n\"menhirCST\" {= version}\n\"menhirGLR\" {= version}",
|
| 625 |
+
"install": null,
|
| 626 |
+
"name": "menhir",
|
| 627 |
+
"source": {
|
| 628 |
+
"archive": "tgz",
|
| 629 |
+
"checksums": [
|
| 630 |
+
"md5=e993231085db95ab011ffe0cd606d9dd",
|
| 631 |
+
"sha512=aafad186f328ae8dd4cc69af0f30c1a0b208cf5148a7a94c150099be03838503c5ec12918de26cd7f794b5a72f114bc1bae8d81058bd0ea10372a3b06818687e",
|
| 632 |
+
"sha256=69f0414b047d1d5b3507eb8277cd328a60d430bdff51de912b47adb2c25de4f3"
|
| 633 |
+
],
|
| 634 |
+
"size": 1612814,
|
| 635 |
+
"url": "https://gitlab.inria.fr/fpottier/menhir/-/archive/20260209/archive.tar.gz"
|
| 636 |
+
},
|
| 637 |
+
"version": "20260209"
|
| 638 |
+
},
|
| 639 |
+
"menhirCST.20260209": {
|
| 640 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 641 |
+
"depends": [
|
| 642 |
+
"ocaml",
|
| 643 |
+
"dune"
|
| 644 |
+
],
|
| 645 |
+
"depends_raw": "\"ocaml\" {>= \"4.08\"} \"dune\" {>= \"2.8.0\"}",
|
| 646 |
+
"install": null,
|
| 647 |
+
"name": "menhirCST",
|
| 648 |
+
"source": {
|
| 649 |
+
"archive": "tgz",
|
| 650 |
+
"checksums": [
|
| 651 |
+
"md5=e993231085db95ab011ffe0cd606d9dd",
|
| 652 |
+
"sha512=aafad186f328ae8dd4cc69af0f30c1a0b208cf5148a7a94c150099be03838503c5ec12918de26cd7f794b5a72f114bc1bae8d81058bd0ea10372a3b06818687e",
|
| 653 |
+
"sha256=69f0414b047d1d5b3507eb8277cd328a60d430bdff51de912b47adb2c25de4f3"
|
| 654 |
+
],
|
| 655 |
+
"size": 1612814,
|
| 656 |
+
"url": "https://gitlab.inria.fr/fpottier/menhir/-/archive/20260209/archive.tar.gz"
|
| 657 |
+
},
|
| 658 |
+
"version": "20260209"
|
| 659 |
+
},
|
| 660 |
+
"menhirGLR.20260209": {
|
| 661 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 662 |
+
"depends": [
|
| 663 |
+
"ocaml",
|
| 664 |
+
"dune"
|
| 665 |
+
],
|
| 666 |
+
"depends_raw": "\"ocaml\" {>= \"4.08\"} \"dune\" {>= \"2.8.0\"}",
|
| 667 |
+
"install": null,
|
| 668 |
+
"name": "menhirGLR",
|
| 669 |
+
"source": {
|
| 670 |
+
"archive": "tgz",
|
| 671 |
+
"checksums": [
|
| 672 |
+
"md5=e993231085db95ab011ffe0cd606d9dd",
|
| 673 |
+
"sha512=aafad186f328ae8dd4cc69af0f30c1a0b208cf5148a7a94c150099be03838503c5ec12918de26cd7f794b5a72f114bc1bae8d81058bd0ea10372a3b06818687e",
|
| 674 |
+
"sha256=69f0414b047d1d5b3507eb8277cd328a60d430bdff51de912b47adb2c25de4f3"
|
| 675 |
+
],
|
| 676 |
+
"size": 1612814,
|
| 677 |
+
"url": "https://gitlab.inria.fr/fpottier/menhir/-/archive/20260209/archive.tar.gz"
|
| 678 |
+
},
|
| 679 |
+
"version": "20260209"
|
| 680 |
+
},
|
| 681 |
+
"menhirLib.20260209": {
|
| 682 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 683 |
+
"depends": [
|
| 684 |
+
"ocaml",
|
| 685 |
+
"dune"
|
| 686 |
+
],
|
| 687 |
+
"depends_raw": "\"ocaml\" {>= \"4.08\"} \"dune\" {>= \"2.8.0\"}",
|
| 688 |
+
"install": null,
|
| 689 |
+
"name": "menhirLib",
|
| 690 |
+
"source": {
|
| 691 |
+
"archive": "tgz",
|
| 692 |
+
"checksums": [
|
| 693 |
+
"md5=e993231085db95ab011ffe0cd606d9dd",
|
| 694 |
+
"sha512=aafad186f328ae8dd4cc69af0f30c1a0b208cf5148a7a94c150099be03838503c5ec12918de26cd7f794b5a72f114bc1bae8d81058bd0ea10372a3b06818687e",
|
| 695 |
+
"sha256=69f0414b047d1d5b3507eb8277cd328a60d430bdff51de912b47adb2c25de4f3"
|
| 696 |
+
],
|
| 697 |
+
"size": 1612814,
|
| 698 |
+
"url": "https://gitlab.inria.fr/fpottier/menhir/-/archive/20260209/archive.tar.gz"
|
| 699 |
+
},
|
| 700 |
+
"version": "20260209"
|
| 701 |
+
},
|
| 702 |
+
"menhirSdk.20260209": {
|
| 703 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 704 |
+
"depends": [
|
| 705 |
+
"ocaml",
|
| 706 |
+
"dune"
|
| 707 |
+
],
|
| 708 |
+
"depends_raw": "\"ocaml\" {>= \"4.08\"} \"dune\" {>= \"2.8.0\"}",
|
| 709 |
+
"install": null,
|
| 710 |
+
"name": "menhirSdk",
|
| 711 |
+
"source": {
|
| 712 |
+
"archive": "tgz",
|
| 713 |
+
"checksums": [
|
| 714 |
+
"md5=e993231085db95ab011ffe0cd606d9dd",
|
| 715 |
+
"sha512=aafad186f328ae8dd4cc69af0f30c1a0b208cf5148a7a94c150099be03838503c5ec12918de26cd7f794b5a72f114bc1bae8d81058bd0ea10372a3b06818687e",
|
| 716 |
+
"sha256=69f0414b047d1d5b3507eb8277cd328a60d430bdff51de912b47adb2c25de4f3"
|
| 717 |
+
],
|
| 718 |
+
"size": 1612814,
|
| 719 |
+
"url": "https://gitlab.inria.fr/fpottier/menhir/-/archive/20260209/archive.tar.gz"
|
| 720 |
+
},
|
| 721 |
+
"version": "20260209"
|
| 722 |
+
},
|
| 723 |
+
"num.1.6": {
|
| 724 |
+
"build": "[\n make\n \"PROFILE=release\"\n \"opam-legacy\" {!ocaml:preinstalled & ocaml:version < \"5.0.0~~\"}\n \"opam-modern\" {ocaml:preinstalled | ocaml:version >= \"5.0.0~~\"}\n]\n[make \"test\"] {with-test}",
|
| 725 |
+
"depends": [
|
| 726 |
+
"ocaml"
|
| 727 |
+
],
|
| 728 |
+
"depends_raw": "\"ocaml\" {>= \"4.06.0\"}",
|
| 729 |
+
"install": null,
|
| 730 |
+
"name": "num",
|
| 731 |
+
"source": {
|
| 732 |
+
"archive": "tgz",
|
| 733 |
+
"checksums": [
|
| 734 |
+
"sha256=b5cce325449aac746d5ca963d84688a627cca5b38d41e636cf71c68b60495b3e",
|
| 735 |
+
"sha512=5cb32dfa9a9f0ad375bfd89079e9b1422979f3c089f61ef2300ad9cc64fb1fc25ed1f86b0267eb017f12ae41a574a959df5bfa39ab22c2be2f1ac84c3c671bdf"
|
| 736 |
+
],
|
| 737 |
+
"size": 67748,
|
| 738 |
+
"url": "https://github.com/ocaml/num/archive/refs/tags/v1.6.tar.gz"
|
| 739 |
+
},
|
| 740 |
+
"version": "1.6"
|
| 741 |
+
},
|
| 742 |
+
"ocaml-base-compiler.4.14.3": {
|
| 743 |
+
"build": "[\n \"./configure\"\n \"--host=x86_64-pc-windows\" {system-msvc:installed & arch-x86_64:installed}\n \"--host=x86_64-w64-mingw32\"\n {os-distribution = \"cygwin\" & system-mingw:installed &\n arch-x86_64:installed}\n \"--host=i686-pc-windows\" {system-msvc:installed & arch-x86_32:installed}\n \"--host=i686-w64-mingw32\"\n {os-distribution = \"cygwin\" & system-mingw:installed &\n arch-x86_32:installed}\n \"--prefix=%{prefix}%\"\n \"--docdir=%{doc}%/ocaml\"\n \"--with-flexdll=%{flexdll:share}%\" {os = \"win32\" & flexdll:installed}\n \"-C\"\n \"CC=cc\" {os = \"openbsd\" | os = \"macos\"}\n \"ASPP=cc -c\" {os = \"openbsd\" | os = \"macos\"}\n]\n[make \"-j%{jobs}%\"]",
|
| 744 |
+
"depends": [
|
| 745 |
+
"ocaml",
|
| 746 |
+
"base-unix",
|
| 747 |
+
"base-bigarray",
|
| 748 |
+
"base-threads",
|
| 749 |
+
"arch-x86_64",
|
| 750 |
+
"system-mingw",
|
| 751 |
+
"ocaml-options-vanilla",
|
| 752 |
+
"flexdll"
|
| 753 |
+
],
|
| 754 |
+
"depends_raw": "\"ocaml\" {= \"4.14.3\" & post}\n\"base-unix\" {post}\n\"base-bigarray\" {post}\n\"base-threads\" {post}\n((\"arch-x86_64\" {os = \"win32\" & arch = \"x86_64\"} &\n (\"system-mingw\" | \"system-msvc\")) |\n (\"arch-x86_32\" {os = \"win32\"} & (\"system-mingw\" | \"system-msvc\")) |\n \"base-unix\" {os != \"win32\" & post})\n\"ocaml-options-vanilla\" {post}\n\"flexdll\" {>= \"0.36\" & os = \"win32\"}",
|
| 755 |
+
"install": "make \"install\"",
|
| 756 |
+
"name": "ocaml-base-compiler",
|
| 757 |
+
"source": {
|
| 758 |
+
"archive": "tgz",
|
| 759 |
+
"checksums": [
|
| 760 |
+
"sha256=e510689183b2d62b0a7513ea7e47be80ddb9173377a2df436dbc1ca927a64689"
|
| 761 |
+
],
|
| 762 |
+
"size": 5513909,
|
| 763 |
+
"url": "https://github.com/ocaml/ocaml/archive/4.14.3.tar.gz"
|
| 764 |
+
},
|
| 765 |
+
"version": "4.14.3"
|
| 766 |
+
},
|
| 767 |
+
"ocaml-compiler-libs.v0.12.4": {
|
| 768 |
+
"build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test}\n \"@doc\" {with-doc}\n]",
|
| 769 |
+
"depends": [
|
| 770 |
+
"dune",
|
| 771 |
+
"ocaml"
|
| 772 |
+
],
|
| 773 |
+
"depends_raw": "\"dune\" {>= \"2.8\"} \"ocaml\" {>= \"4.04.1\" & < \"5.2.0\"} \"odoc\" {with-doc}",
|
| 774 |
+
"install": null,
|
| 775 |
+
"name": "ocaml-compiler-libs",
|
| 776 |
+
"source": {
|
| 777 |
+
"archive": "tbz",
|
| 778 |
+
"checksums": [
|
| 779 |
+
"sha256=4ec9c9ec35cc45c18c7a143761154ef1d7663036a29297f80381f47981a07760",
|
| 780 |
+
"sha512=978dba8dfa61f98fa24fda7a9c26c2e837081f37d1685fe636dc19cfc3278a940cf01a10293504b185c406706bc1008bc54313d50f023bcdea6d5ac6c0788b35"
|
| 781 |
+
],
|
| 782 |
+
"size": 5160,
|
| 783 |
+
"url": "https://github.com/janestreet/ocaml-compiler-libs/releases/download/v0.12.4/ocaml-compiler-libs-v0.12.4.tbz"
|
| 784 |
+
},
|
| 785 |
+
"version": "v0.12.4"
|
| 786 |
+
},
|
| 787 |
+
"ocaml-config.2": {
|
| 788 |
+
"build": null,
|
| 789 |
+
"depends": [
|
| 790 |
+
"ocaml-base-compiler"
|
| 791 |
+
],
|
| 792 |
+
"depends_raw": "\"ocaml-base-compiler\" {>= \"4.12.0~\"} | \"ocaml-variants\" {>= \"4.12.0~\"} |\n\"ocaml-system\" {>= \"4.12.0~\"}",
|
| 793 |
+
"install": null,
|
| 794 |
+
"name": "ocaml-config",
|
| 795 |
+
"source": null,
|
| 796 |
+
"version": "2"
|
| 797 |
+
},
|
| 798 |
+
"ocaml-config.3": {
|
| 799 |
+
"build": null,
|
| 800 |
+
"depends": [
|
| 801 |
+
"ocaml-base-compiler"
|
| 802 |
+
],
|
| 803 |
+
"depends_raw": "\"ocaml-base-compiler\" {>= \"5.0.0~\" | os = \"win32\"} |\n\"ocaml-variants\" {>= \"5.0.0~\" | os = \"win32\"} |\n\"ocaml-system\" {>= \"5.0.0~\" | os = \"win32\"} |\n\"dkml-base-compiler\" {>= \"4.12.0~\"}",
|
| 804 |
+
"install": null,
|
| 805 |
+
"name": "ocaml-config",
|
| 806 |
+
"source": null,
|
| 807 |
+
"version": "3"
|
| 808 |
+
},
|
| 809 |
+
"ocaml-env-mingw32.1": {
|
| 810 |
+
"build": null,
|
| 811 |
+
"depends": [
|
| 812 |
+
"host-system-mingw",
|
| 813 |
+
"host-arch-x86_32",
|
| 814 |
+
"conf-mingw-w64-gcc-i686"
|
| 815 |
+
],
|
| 816 |
+
"depends_raw": "\"host-system-mingw\"\n\"host-arch-x86_32\"\n\"conf-mingw-w64-gcc-i686\"\n\"mingw-w64-shims\" {os-distribution = \"cygwin\"}",
|
| 817 |
+
"install": null,
|
| 818 |
+
"name": "ocaml-env-mingw32",
|
| 819 |
+
"source": null,
|
| 820 |
+
"version": "1"
|
| 821 |
+
},
|
| 822 |
+
"ocaml-env-mingw64.1": {
|
| 823 |
+
"build": null,
|
| 824 |
+
"depends": [
|
| 825 |
+
"host-system-mingw",
|
| 826 |
+
"host-arch-x86_64",
|
| 827 |
+
"conf-mingw-w64-gcc-x86_64"
|
| 828 |
+
],
|
| 829 |
+
"depends_raw": "\"host-system-mingw\"\n\"host-arch-x86_64\"\n\"conf-mingw-w64-gcc-x86_64\"\n\"mingw-w64-shims\" {os-distribution = \"cygwin\"}",
|
| 830 |
+
"install": null,
|
| 831 |
+
"name": "ocaml-env-mingw64",
|
| 832 |
+
"source": null,
|
| 833 |
+
"version": "1"
|
| 834 |
+
},
|
| 835 |
+
"ocaml-options-vanilla.1": {
|
| 836 |
+
"build": null,
|
| 837 |
+
"depends": [
|
| 838 |
+
"ocaml-base-compiler"
|
| 839 |
+
],
|
| 840 |
+
"depends_raw": "\"ocaml-base-compiler\" {post} | \"ocaml-system\" {post} |\n\"ocaml-variants\" {post & >= \"4.12.0~\"}",
|
| 841 |
+
"install": null,
|
| 842 |
+
"name": "ocaml-options-vanilla",
|
| 843 |
+
"source": null,
|
| 844 |
+
"version": "1"
|
| 845 |
+
},
|
| 846 |
+
"ocaml-syntax-shims.1.0.0": {
|
| 847 |
+
"build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test}\n \"@doc\" {with-doc}\n]",
|
| 848 |
+
"depends": [
|
| 849 |
+
"dune",
|
| 850 |
+
"ocaml"
|
| 851 |
+
],
|
| 852 |
+
"depends_raw": "\"dune\" {>= \"2.0\"} \"ocaml\" {>= \"4.02.3\"}",
|
| 853 |
+
"install": null,
|
| 854 |
+
"name": "ocaml-syntax-shims",
|
| 855 |
+
"source": {
|
| 856 |
+
"archive": "tbz",
|
| 857 |
+
"checksums": [
|
| 858 |
+
"sha256=89b2e193e90a0c168b6ec5ddf6fef09033681bdcb64e11913c97440a2722e8c8",
|
| 859 |
+
"sha512=75c4c6b0bfa1267a8a49a82ba494d08cf0823fc8350863d6d3d4971528cb09e5a2a29e2981d04c75e76ad0f49360b05a432c9efeff9a4fbc1ec6b28960399852"
|
| 860 |
+
],
|
| 861 |
+
"size": 5435,
|
| 862 |
+
"url": "https://github.com/ocaml-ppx/ocaml-syntax-shims/releases/download/1.0.0/ocaml-syntax-shims-1.0.0.tbz"
|
| 863 |
+
},
|
| 864 |
+
"version": "1.0.0"
|
| 865 |
+
},
|
| 866 |
+
"ocaml.4.14.3": {
|
| 867 |
+
"build": "\"ocaml\" \"%{ocaml-config:share}%/gen_ocaml_config.ml\" _:version _:name",
|
| 868 |
+
"depends": [
|
| 869 |
+
"ocaml-config",
|
| 870 |
+
"ocaml-base-compiler",
|
| 871 |
+
"ocaml-env-mingw64",
|
| 872 |
+
"ocaml-env-mingw32"
|
| 873 |
+
],
|
| 874 |
+
"depends_raw": "\"ocaml-config\" {>= \"2\"}\n\"ocaml-base-compiler\" {>= \"4.14.3~\" & < \"4.14.4~\"} |\n\"ocaml-variants\" {>= \"4.14.3~\" & < \"4.14.4~\"} |\n\"ocaml-system\" {>= \"4.14.3\" & < \"4.14.4~\"} |\n\"dkml-base-compiler\" {>= \"4.14.3~\" & < \"4.14.4~\"}\n(\"ocaml-env-mingw64\" {os = \"win32\"} | \"ocaml-env-mingw32\" {os = \"win32\"} |\n \"ocaml-env-msvc64\" {os = \"win32\"} |\n \"ocaml-env-msvc32\" {os = \"win32\"})",
|
| 875 |
+
"install": null,
|
| 876 |
+
"name": "ocaml",
|
| 877 |
+
"source": null,
|
| 878 |
+
"version": "4.14.3"
|
| 879 |
+
},
|
| 880 |
+
"ocamlbuild.0.16.1": {
|
| 881 |
+
"build": "[\n make\n \"-f\"\n \"configure.make\"\n \"all\"\n \"OCAMLBUILD_PREFIX=%{prefix}%\"\n \"OCAMLBUILD_BINDIR=%{bin}%\"\n \"OCAMLBUILD_LIBDIR=%{lib}%\"\n \"OCAMLBUILD_MANDIR=%{man}%\"\n \"OCAML_NATIVE=%{ocaml:native}%\"\n \"OCAML_NATIVE_TOOLS=%{ocaml:native}%\"\n]\n[make \"check-if-preinstalled\" \"all\" \"opam-install\"]",
|
| 882 |
+
"depends": [
|
| 883 |
+
"ocaml"
|
| 884 |
+
],
|
| 885 |
+
"depends_raw": "\"ocaml\" {>= \"4.08\"} \"ocamlfind\" {with-test} \"menhirLib\" {with-test}",
|
| 886 |
+
"install": null,
|
| 887 |
+
"name": "ocamlbuild",
|
| 888 |
+
"source": {
|
| 889 |
+
"archive": "tgz",
|
| 890 |
+
"checksums": [
|
| 891 |
+
"sha512=e918b9a0081f271e507c7a4f4d5d5a7cdf818ca51c52acec1bac85ddad5f6cad078cb3c568252fbcf5401c2d75323ed8f50fdd881bda1c9632840320408393ae",
|
| 892 |
+
"sha256=2ba6857f2991b7f69368e8db818b163d31cf5a367f15f5953bf8f01a77b3d4fc"
|
| 893 |
+
],
|
| 894 |
+
"size": 202416,
|
| 895 |
+
"url": "https://github.com/ocaml/ocamlbuild/archive/refs/tags/0.16.1.tar.gz"
|
| 896 |
+
},
|
| 897 |
+
"version": "0.16.1"
|
| 898 |
+
},
|
| 899 |
+
"ocamlfind.1.9.8": {
|
| 900 |
+
"build": "[\n \"./configure\"\n \"-bindir\"\n bin\n \"-sitelib\"\n lib\n \"-mandir\"\n man\n \"-config\"\n \"%{lib}%/findlib.conf\"\n \"-no-custom\"\n \"-no-camlp4\" {!ocaml:preinstalled & ocaml:version >= \"4.02.0\"}\n \"-no-topfind\" {ocaml:preinstalled}\n]\n[make \"all\"]\n[make \"opt\"] {ocaml:native}",
|
| 901 |
+
"depends": [
|
| 902 |
+
"ocaml"
|
| 903 |
+
],
|
| 904 |
+
"depends_raw": "\"ocaml\"\n {>= \"3.08.0\" & (os != \"cygwin\" & os-distribution != \"msys2\" | < \"5.0\") &\n < \"5.5.0~\"}",
|
| 905 |
+
"install": "[make \"install\"]\n[\"install\" \"-m\" \"0755\" \"ocaml-stub\" \"%{bin}%/ocaml\"] {ocaml:preinstalled}",
|
| 906 |
+
"name": "ocamlfind",
|
| 907 |
+
"source": {
|
| 908 |
+
"archive": "tgz",
|
| 909 |
+
"checksums": [
|
| 910 |
+
"md5=ca770e5806032a96131b670f6e07f146",
|
| 911 |
+
"sha512=8967986de2ab4ec5993f437b0a4206742adf37aa7a292a3bba0a04438d78539b84d001191e60b2d5bde98a695b38cba2593b7051f7749adbdb964a0df3c4b661",
|
| 912 |
+
"sha256=d6899935ccabf67f067a9af3f3f88d94e310075d13c648fa03ff498769ce039d"
|
| 913 |
+
],
|
| 914 |
+
"size": 169953,
|
| 915 |
+
"url": "https://github.com/ocaml/ocamlfind/archive/refs/tags/findlib-1.9.8.tar.gz"
|
| 916 |
+
},
|
| 917 |
+
"version": "1.9.8"
|
| 918 |
+
},
|
| 919 |
+
"ocplib-endian.1.2": {
|
| 920 |
+
"build": "\"dune\"\n\"build\"\n\"-p\"\nname\n\"-j\"\njobs\n\"@install\"\n\"@runtest\" {with-test}\n\"@doc\" {with-doc}",
|
| 921 |
+
"depends": [
|
| 922 |
+
"base-bytes",
|
| 923 |
+
"ocaml",
|
| 924 |
+
"cppo",
|
| 925 |
+
"dune"
|
| 926 |
+
],
|
| 927 |
+
"depends_raw": "\"base-bytes\"\n\"ocaml\" {>= \"4.03.0\"}\n\"cppo\" {>= \"1.1.0\" & build}\n\"dune\" {>= \"1.0\"}",
|
| 928 |
+
"install": null,
|
| 929 |
+
"name": "ocplib-endian",
|
| 930 |
+
"source": {
|
| 931 |
+
"archive": "tgz",
|
| 932 |
+
"checksums": [
|
| 933 |
+
"md5=8d5492eeb7c6815ade72a7415ea30949",
|
| 934 |
+
"sha512=2e70be5f3d6e377485c60664a0e235c3b9b24a8d6b6a03895d092c6e40d53810bfe1f292ee69e5181ce6daa8a582bfe3d59f3af889f417134f658812be5b8b85",
|
| 935 |
+
"sha256=97ae74e8aeead46a0475df14af637ce78e2372c07258619ad8967506f2d4b320"
|
| 936 |
+
],
|
| 937 |
+
"size": 18061,
|
| 938 |
+
"url": "https://github.com/OCamlPro/ocplib-endian/archive/refs/tags/1.2.tar.gz"
|
| 939 |
+
},
|
| 940 |
+
"version": "1.2"
|
| 941 |
+
},
|
| 942 |
+
"parsexp.v0.16.0": {
|
| 943 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 944 |
+
"depends": [
|
| 945 |
+
"ocaml",
|
| 946 |
+
"sexplib0",
|
| 947 |
+
"dune"
|
| 948 |
+
],
|
| 949 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"} \"sexplib0\" {>= \"v0.16\" & < \"v0.17\"} \"dune\" {>= \"2.0.0\"}",
|
| 950 |
+
"install": null,
|
| 951 |
+
"name": "parsexp",
|
| 952 |
+
"source": {
|
| 953 |
+
"archive": "tgz",
|
| 954 |
+
"checksums": [
|
| 955 |
+
"sha256=b6e2572c8e6191a85cb8f9c3276ed87fe00522c81ba7a268179fb08185e55e12"
|
| 956 |
+
],
|
| 957 |
+
"size": 56796,
|
| 958 |
+
"url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/parsexp-v0.16.0.tar.gz"
|
| 959 |
+
},
|
| 960 |
+
"version": "v0.16.0"
|
| 961 |
+
},
|
| 962 |
+
"path_glob.0.3": {
|
| 963 |
+
"build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test}\n \"@doc\" {with-doc}\n]",
|
| 964 |
+
"depends": [
|
| 965 |
+
"ocaml",
|
| 966 |
+
"dune"
|
| 967 |
+
],
|
| 968 |
+
"depends_raw": "\"ocaml\" {>= \"4.03\"} \"dune\" {>= \"2.7\"} \"odoc\" {with-doc}",
|
| 969 |
+
"install": null,
|
| 970 |
+
"name": "path_glob",
|
| 971 |
+
"source": {
|
| 972 |
+
"archive": "tgz",
|
| 973 |
+
"checksums": [
|
| 974 |
+
"sha256=332dae23b700fa050d1fd6e4f3d2e24b8dd1db2c8ea4f76c54e2e54851c9d226",
|
| 975 |
+
"sha512=205b0bbdf0d36b21e978603e4df264a0b185f3c1e3a20764fb254368977977d076a5b9c53b88110b721651d43a782e45742b14891412460101fb5fa8a5986173"
|
| 976 |
+
],
|
| 977 |
+
"size": 18313,
|
| 978 |
+
"url": "https://gasche.gitlab.io/path_glob/releases/path_glob-0.3.tgz"
|
| 979 |
+
},
|
| 980 |
+
"version": "0.3"
|
| 981 |
+
},
|
| 982 |
+
"ppx_assert.v0.16.0": {
|
| 983 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 984 |
+
"depends": [
|
| 985 |
+
"ocaml",
|
| 986 |
+
"base",
|
| 987 |
+
"ppx_cold",
|
| 988 |
+
"ppx_compare",
|
| 989 |
+
"ppx_here",
|
| 990 |
+
"ppx_sexp_conv",
|
| 991 |
+
"dune",
|
| 992 |
+
"ppxlib"
|
| 993 |
+
],
|
| 994 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_cold\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_compare\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_here\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_sexp_conv\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\"}",
|
| 995 |
+
"install": null,
|
| 996 |
+
"name": "ppx_assert",
|
| 997 |
+
"source": {
|
| 998 |
+
"archive": "tgz",
|
| 999 |
+
"checksums": [
|
| 1000 |
+
"sha256=57dc6e241827eb1d5112c958f2f682ddd0addf5a8e9d589f5361ec2669883fd5"
|
| 1001 |
+
],
|
| 1002 |
+
"size": 7342,
|
| 1003 |
+
"url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_assert-v0.16.0.tar.gz"
|
| 1004 |
+
},
|
| 1005 |
+
"version": "v0.16.0"
|
| 1006 |
+
},
|
| 1007 |
+
"ppx_base.v0.16.0": {
|
| 1008 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 1009 |
+
"depends": [
|
| 1010 |
+
"ocaml",
|
| 1011 |
+
"ppx_cold",
|
| 1012 |
+
"ppx_compare",
|
| 1013 |
+
"ppx_enumerate",
|
| 1014 |
+
"ppx_globalize",
|
| 1015 |
+
"ppx_hash",
|
| 1016 |
+
"ppx_sexp_conv",
|
| 1017 |
+
"dune",
|
| 1018 |
+
"ppxlib"
|
| 1019 |
+
],
|
| 1020 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"ppx_cold\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_compare\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_enumerate\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_globalize\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_hash\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_sexp_conv\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\"}",
|
| 1021 |
+
"install": null,
|
| 1022 |
+
"name": "ppx_base",
|
| 1023 |
+
"source": {
|
| 1024 |
+
"archive": "tgz",
|
| 1025 |
+
"checksums": [
|
| 1026 |
+
"sha256=64835763153d3262a2fa56cf307a351ebfd10cedf504c488ab3bb93f3d9569a3"
|
| 1027 |
+
],
|
| 1028 |
+
"size": 2928,
|
| 1029 |
+
"url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_base-v0.16.0.tar.gz"
|
| 1030 |
+
},
|
| 1031 |
+
"version": "v0.16.0"
|
| 1032 |
+
},
|
| 1033 |
+
"ppx_cold.v0.16.0": {
|
| 1034 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 1035 |
+
"depends": [
|
| 1036 |
+
"ocaml",
|
| 1037 |
+
"base",
|
| 1038 |
+
"dune",
|
| 1039 |
+
"ppxlib"
|
| 1040 |
+
],
|
| 1041 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\"}",
|
| 1042 |
+
"install": null,
|
| 1043 |
+
"name": "ppx_cold",
|
| 1044 |
+
"source": {
|
| 1045 |
+
"archive": "tgz",
|
| 1046 |
+
"checksums": [
|
| 1047 |
+
"sha256=803bdb583b501aa246d8ae34be0c16b892d8ae96852bb593f3e355232e6aa4da"
|
| 1048 |
+
],
|
| 1049 |
+
"size": 3749,
|
| 1050 |
+
"url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_cold-v0.16.0.tar.gz"
|
| 1051 |
+
},
|
| 1052 |
+
"version": "v0.16.0"
|
| 1053 |
+
},
|
| 1054 |
+
"ppx_compare.v0.16.0": {
|
| 1055 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 1056 |
+
"depends": [
|
| 1057 |
+
"ocaml",
|
| 1058 |
+
"base",
|
| 1059 |
+
"dune",
|
| 1060 |
+
"ppxlib"
|
| 1061 |
+
],
|
| 1062 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\"}",
|
| 1063 |
+
"install": null,
|
| 1064 |
+
"name": "ppx_compare",
|
| 1065 |
+
"source": {
|
| 1066 |
+
"archive": "tgz",
|
| 1067 |
+
"checksums": [
|
| 1068 |
+
"sha256=7ac1dd852e62de6c4b6a879b8bd962c0167db822c39e8c972c8a6af4c48f26aa"
|
| 1069 |
+
],
|
| 1070 |
+
"size": 13953,
|
| 1071 |
+
"url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_compare-v0.16.0.tar.gz"
|
| 1072 |
+
},
|
| 1073 |
+
"version": "v0.16.0"
|
| 1074 |
+
},
|
| 1075 |
+
"ppx_derivers.1.2.1": {
|
| 1076 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 1077 |
+
"depends": [
|
| 1078 |
+
"ocaml",
|
| 1079 |
+
"dune"
|
| 1080 |
+
],
|
| 1081 |
+
"depends_raw": "\"ocaml\" \"dune\"",
|
| 1082 |
+
"install": null,
|
| 1083 |
+
"name": "ppx_derivers",
|
| 1084 |
+
"source": {
|
| 1085 |
+
"archive": "tgz",
|
| 1086 |
+
"checksums": [
|
| 1087 |
+
"sha256=b6595ee187dea792b31fc54a0e1524ab1e48bc6068d3066c45215a138cc73b95",
|
| 1088 |
+
"md5=5dc2bf130c1db3c731fe0fffc5648b41"
|
| 1089 |
+
],
|
| 1090 |
+
"size": 2530,
|
| 1091 |
+
"url": "https://github.com/ocaml-ppx/ppx_derivers/archive/1.2.1.tar.gz"
|
| 1092 |
+
},
|
| 1093 |
+
"version": "1.2.1"
|
| 1094 |
+
},
|
| 1095 |
+
"ppx_deriving.6.0.3": {
|
| 1096 |
+
"build": "[\"dune\" \"subst\"] {dev}\n[\"dune\" \"build\" \"-p\" name \"-j\" jobs]\n[\"dune\" \"runtest\" \"-p\" name \"-j\" jobs] {with-test}\n[\"dune\" \"build\" \"@doc\" \"-p\" name \"-j\" jobs] {with-doc}",
|
| 1097 |
+
"depends": [
|
| 1098 |
+
"ocaml",
|
| 1099 |
+
"dune",
|
| 1100 |
+
"cppo",
|
| 1101 |
+
"ocamlfind",
|
| 1102 |
+
"ppx_derivers",
|
| 1103 |
+
"ppxlib"
|
| 1104 |
+
],
|
| 1105 |
+
"depends_raw": "\"ocaml\" {>= \"4.05.0\" & < \"5.4\"}\n\"dune\" {>= \"1.6.3\"}\n\"cppo\" {>= \"1.1.0\" & build}\n\"ocamlfind\"\n\"ppx_derivers\"\n\"ppxlib\" {>= \"0.32.0\" & < \"0.36.0\"}\n\"ounit2\" {with-test}",
|
| 1106 |
+
"install": null,
|
| 1107 |
+
"name": "ppx_deriving",
|
| 1108 |
+
"source": {
|
| 1109 |
+
"archive": "tbz",
|
| 1110 |
+
"checksums": [
|
| 1111 |
+
"sha256=374aa97b32c5e01c09a97810a48bfa218c213b5b649e4452101455ac19c94a6d",
|
| 1112 |
+
"sha512=971443a5df0acbdad577360deed8c9af137695bec6d826ef517a382941371f3546aef53456dda7c89d0ed30fefadf45d5dae2a8b1940a75aee7f7382c68cedb0"
|
| 1113 |
+
],
|
| 1114 |
+
"size": 42216,
|
| 1115 |
+
"url": "https://github.com/ocaml-ppx/ppx_deriving/releases/download/v6.0.3/ppx_deriving-6.0.3.tbz"
|
| 1116 |
+
},
|
| 1117 |
+
"version": "6.0.3"
|
| 1118 |
+
},
|
| 1119 |
+
"ppx_deriving_yojson.3.9.1": {
|
| 1120 |
+
"build": "[\"dune\" \"subst\"] {dev}\n[\"dune\" \"build\" \"-p\" name \"-j\" jobs]\n[\"dune\" \"runtest\" \"-p\" name \"-j\" jobs] {with-test}",
|
| 1121 |
+
"depends": [
|
| 1122 |
+
"ocaml",
|
| 1123 |
+
"dune",
|
| 1124 |
+
"yojson",
|
| 1125 |
+
"ppx_deriving",
|
| 1126 |
+
"ppxlib"
|
| 1127 |
+
],
|
| 1128 |
+
"depends_raw": "\"ocaml\" {>= \"4.05.0\"}\n\"dune\" {>= \"1.0\"}\n\"yojson\" {>= \"1.6.0\"}\n\"yojson\" {with-test & < \"3\"}\n\"ppx_deriving\" {>= \"5.1\"}\n\"ppxlib\" {>= \"0.30.0\" & < \"0.36.0\"}\n\"ounit2\" {with-test}",
|
| 1129 |
+
"install": null,
|
| 1130 |
+
"name": "ppx_deriving_yojson",
|
| 1131 |
+
"source": {
|
| 1132 |
+
"archive": "tbz",
|
| 1133 |
+
"checksums": [
|
| 1134 |
+
"sha256=6a3ef7c7bb381f57448853f2a6d2287cf623628162a979587d1e8f7502114f4d",
|
| 1135 |
+
"sha512=df919be7c023cb9ff1b832de333f8d158e88746b4cc33ea5dcf511c64aba186628015b6ca29a0310642531e0640d79834d64b99d542a624168154a11736489a0"
|
| 1136 |
+
],
|
| 1137 |
+
"size": 20091,
|
| 1138 |
+
"url": "https://github.com/ocaml-ppx/ppx_deriving_yojson/releases/download/v3.9.1/ppx_deriving_yojson-3.9.1.tbz"
|
| 1139 |
+
},
|
| 1140 |
+
"version": "3.9.1"
|
| 1141 |
+
},
|
| 1142 |
+
"ppx_enumerate.v0.16.0": {
|
| 1143 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 1144 |
+
"depends": [
|
| 1145 |
+
"ocaml",
|
| 1146 |
+
"base",
|
| 1147 |
+
"dune",
|
| 1148 |
+
"ppxlib"
|
| 1149 |
+
],
|
| 1150 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\"}",
|
| 1151 |
+
"install": null,
|
| 1152 |
+
"name": "ppx_enumerate",
|
| 1153 |
+
"source": {
|
| 1154 |
+
"archive": "tgz",
|
| 1155 |
+
"checksums": [
|
| 1156 |
+
"sha256=2832635d6d9ac4c63d48ed51d72745cd8a548e226a6110909d5a412d40ef9953"
|
| 1157 |
+
],
|
| 1158 |
+
"size": 9339,
|
| 1159 |
+
"url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_enumerate-v0.16.0.tar.gz"
|
| 1160 |
+
},
|
| 1161 |
+
"version": "v0.16.0"
|
| 1162 |
+
},
|
| 1163 |
+
"ppx_expect.v0.16.0": {
|
| 1164 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 1165 |
+
"depends": [
|
| 1166 |
+
"ocaml",
|
| 1167 |
+
"base",
|
| 1168 |
+
"ppx_here",
|
| 1169 |
+
"ppx_inline_test",
|
| 1170 |
+
"stdio",
|
| 1171 |
+
"dune",
|
| 1172 |
+
"ppxlib",
|
| 1173 |
+
"re"
|
| 1174 |
+
],
|
| 1175 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_here\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_inline_test\" {>= \"v0.16\" & < \"v0.17\"}\n\"stdio\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\" & < \"0.36.0\"}\n\"re\" {>= \"1.8.0\"}",
|
| 1176 |
+
"install": null,
|
| 1177 |
+
"name": "ppx_expect",
|
| 1178 |
+
"source": {
|
| 1179 |
+
"archive": "tgz",
|
| 1180 |
+
"checksums": [
|
| 1181 |
+
"sha256=e0795a0ae2d576758aaaa685440951b28fe75d072d88f5c6bf415fb1a44e423c"
|
| 1182 |
+
],
|
| 1183 |
+
"size": 48328,
|
| 1184 |
+
"url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_expect-v0.16.0.tar.gz"
|
| 1185 |
+
},
|
| 1186 |
+
"version": "v0.16.0"
|
| 1187 |
+
},
|
| 1188 |
+
"ppx_expect.v0.16.2": {
|
| 1189 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 1190 |
+
"depends": [
|
| 1191 |
+
"ocaml",
|
| 1192 |
+
"base",
|
| 1193 |
+
"ppx_here",
|
| 1194 |
+
"ppx_inline_test",
|
| 1195 |
+
"stdio",
|
| 1196 |
+
"dune",
|
| 1197 |
+
"ppxlib",
|
| 1198 |
+
"re"
|
| 1199 |
+
],
|
| 1200 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_here\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_inline_test\" {>= \"v0.16\" & < \"v0.17\"}\n\"stdio\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\"}\n\"re\" {>= \"1.8.0\"}",
|
| 1201 |
+
"install": null,
|
| 1202 |
+
"name": "ppx_expect",
|
| 1203 |
+
"source": {
|
| 1204 |
+
"archive": "tgz",
|
| 1205 |
+
"checksums": [
|
| 1206 |
+
"md5=99759b6592f5f3e6207af78884b1f3e5",
|
| 1207 |
+
"sha512=1f1adf2bea04da27e6a2b1b3d2fe07773aed7043f83008018e724fc2c0334ac0e3c962f43fca53394e7954f40083539ad5108ac5aa945d2d6b65f99c7a4ee513",
|
| 1208 |
+
"sha256=1fc15e3842d7544e35a54a902520b146ef299cfee8956db4c300dadbfa71c706"
|
| 1209 |
+
],
|
| 1210 |
+
"size": 48495,
|
| 1211 |
+
"url": "https://github.com/janestreet/ppx_expect/archive/refs/tags/v0.16.2.tar.gz"
|
| 1212 |
+
},
|
| 1213 |
+
"version": "v0.16.2"
|
| 1214 |
+
},
|
| 1215 |
+
"ppx_globalize.v0.16.0": {
|
| 1216 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 1217 |
+
"depends": [
|
| 1218 |
+
"ocaml",
|
| 1219 |
+
"base",
|
| 1220 |
+
"dune",
|
| 1221 |
+
"ppxlib"
|
| 1222 |
+
],
|
| 1223 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\" & < \"0.36.0\"}",
|
| 1224 |
+
"install": null,
|
| 1225 |
+
"name": "ppx_globalize",
|
| 1226 |
+
"source": {
|
| 1227 |
+
"archive": "tgz",
|
| 1228 |
+
"checksums": [
|
| 1229 |
+
"sha256=9068d7b4b765112974b17dd354cadf007f044afb11d2f99cd45b2e3b99ab491b"
|
| 1230 |
+
],
|
| 1231 |
+
"size": 8266,
|
| 1232 |
+
"url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_globalize-v0.16.0.tar.gz"
|
| 1233 |
+
},
|
| 1234 |
+
"version": "v0.16.0"
|
| 1235 |
+
},
|
| 1236 |
+
"ppx_hash.v0.16.0": {
|
| 1237 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 1238 |
+
"depends": [
|
| 1239 |
+
"ocaml",
|
| 1240 |
+
"base",
|
| 1241 |
+
"ppx_compare",
|
| 1242 |
+
"ppx_sexp_conv",
|
| 1243 |
+
"dune",
|
| 1244 |
+
"ppxlib"
|
| 1245 |
+
],
|
| 1246 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_compare\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_sexp_conv\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\"}",
|
| 1247 |
+
"install": null,
|
| 1248 |
+
"name": "ppx_hash",
|
| 1249 |
+
"source": {
|
| 1250 |
+
"archive": "tgz",
|
| 1251 |
+
"checksums": [
|
| 1252 |
+
"sha256=9b012546b7b9278bfd536f802fb6da88a11ebb5340d8aa47e9bf49acbf13b6e5"
|
| 1253 |
+
],
|
| 1254 |
+
"size": 28570,
|
| 1255 |
+
"url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_hash-v0.16.0.tar.gz"
|
| 1256 |
+
},
|
| 1257 |
+
"version": "v0.16.0"
|
| 1258 |
+
},
|
| 1259 |
+
"ppx_here.v0.16.0": {
|
| 1260 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 1261 |
+
"depends": [
|
| 1262 |
+
"ocaml",
|
| 1263 |
+
"base",
|
| 1264 |
+
"dune",
|
| 1265 |
+
"ppxlib"
|
| 1266 |
+
],
|
| 1267 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\"}",
|
| 1268 |
+
"install": null,
|
| 1269 |
+
"name": "ppx_here",
|
| 1270 |
+
"source": {
|
| 1271 |
+
"archive": "tgz",
|
| 1272 |
+
"checksums": [
|
| 1273 |
+
"sha256=278198b92500c306fab3411e3dede264d678f203eb3295dd8dd79b70ed9273f0"
|
| 1274 |
+
],
|
| 1275 |
+
"size": 4964,
|
| 1276 |
+
"url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_here-v0.16.0.tar.gz"
|
| 1277 |
+
},
|
| 1278 |
+
"version": "v0.16.0"
|
| 1279 |
+
},
|
| 1280 |
+
"ppx_inline_test.v0.16.0": {
|
| 1281 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 1282 |
+
"depends": [
|
| 1283 |
+
"ocaml",
|
| 1284 |
+
"base",
|
| 1285 |
+
"time_now",
|
| 1286 |
+
"dune",
|
| 1287 |
+
"ppxlib"
|
| 1288 |
+
],
|
| 1289 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"time_now\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\" & < \"0.36.0\"}",
|
| 1290 |
+
"install": null,
|
| 1291 |
+
"name": "ppx_inline_test",
|
| 1292 |
+
"source": {
|
| 1293 |
+
"archive": "tgz",
|
| 1294 |
+
"checksums": [
|
| 1295 |
+
"sha256=216462f8fe988587d1e90f4a10aeb38664facb6eaeb3df60a32e9fb1a6bfbc67"
|
| 1296 |
+
],
|
| 1297 |
+
"size": 21826,
|
| 1298 |
+
"url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_inline_test-v0.16.0.tar.gz"
|
| 1299 |
+
},
|
| 1300 |
+
"version": "v0.16.0"
|
| 1301 |
+
},
|
| 1302 |
+
"ppx_inline_test.v0.16.1": {
|
| 1303 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 1304 |
+
"depends": [
|
| 1305 |
+
"ocaml",
|
| 1306 |
+
"base",
|
| 1307 |
+
"time_now",
|
| 1308 |
+
"dune",
|
| 1309 |
+
"ppxlib"
|
| 1310 |
+
],
|
| 1311 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"time_now\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"3.11.1\"}\n\"ppxlib\" {>= \"0.28.0\" & < \"0.36.0\"}",
|
| 1312 |
+
"install": null,
|
| 1313 |
+
"name": "ppx_inline_test",
|
| 1314 |
+
"source": {
|
| 1315 |
+
"archive": "tgz",
|
| 1316 |
+
"checksums": [
|
| 1317 |
+
"md5=470acc022eb7015862307dad8fe9bcba",
|
| 1318 |
+
"sha512=f82d6d9fe6d84b837d69eb35cc92e2a0b6d0802079437e291aa350b89af1df54a996d6c7843019d488a3afe1e635da070f7ca80595dfdfd8257b2d0722725bf9",
|
| 1319 |
+
"sha256=ea4e61e50529d76774904752f642e18eaf21dfe11844a084b133ccbc41e4295d"
|
| 1320 |
+
],
|
| 1321 |
+
"size": 21965,
|
| 1322 |
+
"url": "https://github.com/janestreet/ppx_inline_test/archive/refs/tags/v0.16.1.tar.gz"
|
| 1323 |
+
},
|
| 1324 |
+
"version": "v0.16.1"
|
| 1325 |
+
},
|
| 1326 |
+
"ppx_optcomp.v0.16.0": {
|
| 1327 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 1328 |
+
"depends": [
|
| 1329 |
+
"ocaml",
|
| 1330 |
+
"base",
|
| 1331 |
+
"stdio",
|
| 1332 |
+
"dune",
|
| 1333 |
+
"ppxlib"
|
| 1334 |
+
],
|
| 1335 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"stdio\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\" & < \"0.36.0\"}",
|
| 1336 |
+
"install": null,
|
| 1337 |
+
"name": "ppx_optcomp",
|
| 1338 |
+
"source": {
|
| 1339 |
+
"archive": "tgz",
|
| 1340 |
+
"checksums": [
|
| 1341 |
+
"sha256=99b209084a5375dafce4c6b128979661ab2ab6bf898a6872d596e65ded590ba2"
|
| 1342 |
+
],
|
| 1343 |
+
"size": 16720,
|
| 1344 |
+
"url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_optcomp-v0.16.0.tar.gz"
|
| 1345 |
+
},
|
| 1346 |
+
"version": "v0.16.0"
|
| 1347 |
+
},
|
| 1348 |
+
"ppx_sexp_conv.v0.16.0": {
|
| 1349 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 1350 |
+
"depends": [
|
| 1351 |
+
"ocaml",
|
| 1352 |
+
"base",
|
| 1353 |
+
"sexplib0",
|
| 1354 |
+
"dune",
|
| 1355 |
+
"ppxlib"
|
| 1356 |
+
],
|
| 1357 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"sexplib0\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\" & < \"0.36.0\"}",
|
| 1358 |
+
"install": null,
|
| 1359 |
+
"name": "ppx_sexp_conv",
|
| 1360 |
+
"source": {
|
| 1361 |
+
"archive": "tgz",
|
| 1362 |
+
"checksums": [
|
| 1363 |
+
"sha256=41bcb7a3b33bdf50428408bfaf1dbcede528a488ac8c436ce710681bcd91200d"
|
| 1364 |
+
],
|
| 1365 |
+
"size": 66899,
|
| 1366 |
+
"url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_sexp_conv-v0.16.0.tar.gz"
|
| 1367 |
+
},
|
| 1368 |
+
"version": "v0.16.0"
|
| 1369 |
+
},
|
| 1370 |
+
"ppxlib.0.35.0": {
|
| 1371 |
+
"build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test}\n \"@doc\" {with-doc}\n]",
|
| 1372 |
+
"depends": [
|
| 1373 |
+
"dune",
|
| 1374 |
+
"ocaml",
|
| 1375 |
+
"ocaml-compiler-libs",
|
| 1376 |
+
"ppx_derivers",
|
| 1377 |
+
"sexplib0",
|
| 1378 |
+
"stdlib-shims"
|
| 1379 |
+
],
|
| 1380 |
+
"depends_raw": "\"dune\" {>= \"3.8\"}\n\"ocaml\" {>= \"4.08.0\" & < \"5.4.0\"}\n\"ocaml-compiler-libs\" {>= \"v0.11.0\"}\n\"ppx_derivers\" {>= \"1.0\"}\n\"sexplib0\" {>= \"v0.12\"}\n\"sexplib0\" {with-test & >= \"v0.15\"}\n\"stdlib-shims\"\n\"ocamlfind\" {with-test}\n\"re\" {with-test & >= \"1.9.0\"}\n\"cinaps\" {with-test & >= \"v0.12.1\"}\n\"ocamlformat\" {with-dev-setup & = \"0.26.2\"}\n\"odoc\" {with-doc}",
|
| 1381 |
+
"install": null,
|
| 1382 |
+
"name": "ppxlib",
|
| 1383 |
+
"source": {
|
| 1384 |
+
"archive": "tbz",
|
| 1385 |
+
"checksums": [
|
| 1386 |
+
"sha256=d9d959fc9f84260487e45684dc741898a92fc5506b61a7f5cac65d21832db925",
|
| 1387 |
+
"sha512=e428b1e3b89261c7efdaa18016264d1afbf067cb9b0d41124b04796c2487ac7ca8ee9a24a60d56f20d1774cb44aaa9ecf1512f17455812ba8d62d4ef93616ee7"
|
| 1388 |
+
],
|
| 1389 |
+
"size": 390303,
|
| 1390 |
+
"url": "https://github.com/ocaml-ppx/ppxlib/releases/download/0.35.0/ppxlib-0.35.0.tbz"
|
| 1391 |
+
},
|
| 1392 |
+
"version": "0.35.0"
|
| 1393 |
+
},
|
| 1394 |
+
"psq.0.2.1": {
|
| 1395 |
+
"build": "[\"dune\" \"subst\"] {dev}\n[\"dune\" \"build\" \"-p\" name \"-j\" jobs]\n[\"dune\" \"runtest\" \"-p\" name] {with-test & ocaml:version >= \"4.07.0\"}",
|
| 1396 |
+
"depends": [
|
| 1397 |
+
"ocaml",
|
| 1398 |
+
"dune",
|
| 1399 |
+
"seq"
|
| 1400 |
+
],
|
| 1401 |
+
"depends_raw": "\"ocaml\" {>= \"4.03.0\"}\n\"dune\" {>= \"1.7\"}\n\"seq\"\n\"qcheck-core\" {with-test}\n\"qcheck-alcotest\" {with-test}\n\"alcotest\" {with-test}",
|
| 1402 |
+
"install": null,
|
| 1403 |
+
"name": "psq",
|
| 1404 |
+
"source": {
|
| 1405 |
+
"archive": "tbz",
|
| 1406 |
+
"checksums": [
|
| 1407 |
+
"sha256=42005f533eabe74b1799ee32b8905654cd66a22bed4af2bd266b28d8462cd344",
|
| 1408 |
+
"sha512=8a8dfe20dc77e1cf38a7b1a7fc76f815c71a4ffe04627151b855feaba8f1ae742594739d1b7a45580b5b24a2cd99b58516f6b5c8d858aa314201f4a6422101ee"
|
| 1409 |
+
],
|
| 1410 |
+
"size": 11341,
|
| 1411 |
+
"url": "https://github.com/pqwy/psq/releases/download/v0.2.1/psq-0.2.1.tbz"
|
| 1412 |
+
},
|
| 1413 |
+
"version": "0.2.1"
|
| 1414 |
+
},
|
| 1415 |
+
"re.1.14.0": {
|
| 1416 |
+
"build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test}\n \"@doc\" {with-doc}\n]",
|
| 1417 |
+
"depends": [
|
| 1418 |
+
"dune",
|
| 1419 |
+
"ocaml"
|
| 1420 |
+
],
|
| 1421 |
+
"depends_raw": "\"dune\" {>= \"3.17\"}\n\"ocaml\" {>= \"4.13.0\"}\n\"ppx_expect\" {with-test}\n\"ounit2\" {with-test}\n\"js_of_ocaml\" {with-test}\n\"conf-npm\" {with-test}\n\"odoc\" {with-doc}",
|
| 1422 |
+
"install": null,
|
| 1423 |
+
"name": "re",
|
| 1424 |
+
"source": {
|
| 1425 |
+
"archive": "tgz",
|
| 1426 |
+
"checksums": [
|
| 1427 |
+
"md5=03f4a83100cb9229a796b85c698076e1",
|
| 1428 |
+
"sha512=cd2cc39f951ca6b7be631bbb5531ed13bc040e629842671bf6fef3911b20ef1653fa9a1f0aa23b094d252cffc9a9efe7ffca69e50d362ab935bc0cc447548124",
|
| 1429 |
+
"sha256=e32eb4c6f319ff74241da9e1b00032f990241347271baf3adb468faaaa616147"
|
| 1430 |
+
],
|
| 1431 |
+
"size": 110936,
|
| 1432 |
+
"url": "https://github.com/ocaml/ocaml-re/archive/refs/tags/1.14.0.tar.gz"
|
| 1433 |
+
},
|
| 1434 |
+
"version": "1.14.0"
|
| 1435 |
+
},
|
| 1436 |
+
"react.1.2.2": {
|
| 1437 |
+
"build": "\"ocaml\" \"pkg/pkg.ml\" \"build\" \"--dev-pkg\" \"%{dev}%\"",
|
| 1438 |
+
"depends": [
|
| 1439 |
+
"ocaml",
|
| 1440 |
+
"ocamlfind",
|
| 1441 |
+
"ocamlbuild",
|
| 1442 |
+
"topkg"
|
| 1443 |
+
],
|
| 1444 |
+
"depends_raw": "\"ocaml\" {>= \"4.08.0\"}\n\"ocamlfind\" {build}\n\"ocamlbuild\" {build}\n\"topkg\" {build & >= \"1.0.3\"}",
|
| 1445 |
+
"install": null,
|
| 1446 |
+
"name": "react",
|
| 1447 |
+
"source": {
|
| 1448 |
+
"archive": "tbz",
|
| 1449 |
+
"checksums": [
|
| 1450 |
+
"sha512=18cdd544d484222ba02db6bd9351571516532e7a1c107b59bbe39193837298f5c745eab6754f8bc6ff125b387be7018c6d6e6ac99f91925a5e4f53af688522b1",
|
| 1451 |
+
"sha256=c4add315d6f1f153d115ee7ca8dd60c1265ff4d408c266125fcb5124fd228f99"
|
| 1452 |
+
],
|
| 1453 |
+
"size": 40013,
|
| 1454 |
+
"url": "https://erratique.ch/software/react/releases/react-1.2.2.tbz"
|
| 1455 |
+
},
|
| 1456 |
+
"version": "1.2.2"
|
| 1457 |
+
},
|
| 1458 |
+
"seq.base": {
|
| 1459 |
+
"build": null,
|
| 1460 |
+
"depends": [
|
| 1461 |
+
"ocaml"
|
| 1462 |
+
],
|
| 1463 |
+
"depends_raw": "\"ocaml\" {>= \"4.07.0\"}",
|
| 1464 |
+
"install": null,
|
| 1465 |
+
"name": "seq",
|
| 1466 |
+
"source": null,
|
| 1467 |
+
"version": "base"
|
| 1468 |
+
},
|
| 1469 |
+
"sexplib.v0.16.0": {
|
| 1470 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 1471 |
+
"depends": [
|
| 1472 |
+
"ocaml",
|
| 1473 |
+
"parsexp",
|
| 1474 |
+
"sexplib0",
|
| 1475 |
+
"dune",
|
| 1476 |
+
"num"
|
| 1477 |
+
],
|
| 1478 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"parsexp\" {>= \"v0.16\" & < \"v0.17\"}\n\"sexplib0\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"num\"",
|
| 1479 |
+
"install": null,
|
| 1480 |
+
"name": "sexplib",
|
| 1481 |
+
"source": {
|
| 1482 |
+
"archive": "tgz",
|
| 1483 |
+
"checksums": [
|
| 1484 |
+
"sha256=e564d5d1ca157314ba5fd64b4e89fa12c6cba8efee3becf6d09d7d9dda21ac5b"
|
| 1485 |
+
],
|
| 1486 |
+
"size": 54920,
|
| 1487 |
+
"url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/sexplib-v0.16.0.tar.gz"
|
| 1488 |
+
},
|
| 1489 |
+
"version": "v0.16.0"
|
| 1490 |
+
},
|
| 1491 |
+
"sexplib0.v0.16.0": {
|
| 1492 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 1493 |
+
"depends": [
|
| 1494 |
+
"ocaml",
|
| 1495 |
+
"dune"
|
| 1496 |
+
],
|
| 1497 |
+
"depends_raw": "\"ocaml\" {>= \"4.08.0\"} \"dune\" {>= \"2.0.0\"}",
|
| 1498 |
+
"install": null,
|
| 1499 |
+
"name": "sexplib0",
|
| 1500 |
+
"source": {
|
| 1501 |
+
"archive": "tgz",
|
| 1502 |
+
"checksums": [
|
| 1503 |
+
"sha256=86dba26468194512f789f2fb709063515a9cb4e5c4461c021c239a369590701d"
|
| 1504 |
+
],
|
| 1505 |
+
"size": 22101,
|
| 1506 |
+
"url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/sexplib0-v0.16.0.tar.gz"
|
| 1507 |
+
},
|
| 1508 |
+
"version": "v0.16.0"
|
| 1509 |
+
},
|
| 1510 |
+
"stdio.v0.16.0": {
|
| 1511 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 1512 |
+
"depends": [
|
| 1513 |
+
"ocaml",
|
| 1514 |
+
"base",
|
| 1515 |
+
"dune"
|
| 1516 |
+
],
|
| 1517 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"} \"base\" {>= \"v0.16\" & < \"v0.17\"} \"dune\" {>= \"2.0.0\"}",
|
| 1518 |
+
"install": null,
|
| 1519 |
+
"name": "stdio",
|
| 1520 |
+
"source": {
|
| 1521 |
+
"archive": "tgz",
|
| 1522 |
+
"checksums": [
|
| 1523 |
+
"sha256=61f0b75950614ac5378c6ec0d822cce6463402d919d5810b736fc46522b3a73e"
|
| 1524 |
+
],
|
| 1525 |
+
"size": 7779,
|
| 1526 |
+
"url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/stdio-v0.16.0.tar.gz"
|
| 1527 |
+
},
|
| 1528 |
+
"version": "v0.16.0"
|
| 1529 |
+
},
|
| 1530 |
+
"stdlib-shims.0.3.0": {
|
| 1531 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 1532 |
+
"depends": [
|
| 1533 |
+
"dune",
|
| 1534 |
+
"ocaml"
|
| 1535 |
+
],
|
| 1536 |
+
"depends_raw": "\"dune\" \"ocaml\" {>= \"4.02.3\"}",
|
| 1537 |
+
"install": null,
|
| 1538 |
+
"name": "stdlib-shims",
|
| 1539 |
+
"source": {
|
| 1540 |
+
"archive": "tbz",
|
| 1541 |
+
"checksums": [
|
| 1542 |
+
"sha256=babf72d3917b86f707885f0c5528e36c63fccb698f4b46cf2bab5c7ccdd6d84a",
|
| 1543 |
+
"sha512=1151d7edc8923516e9a36995a3f8938d323aaade759ad349ed15d6d8501db61ffbe63277e97c4d86149cf371306ac23df0f581ec7e02611f58335126e1870980"
|
| 1544 |
+
],
|
| 1545 |
+
"size": 10163,
|
| 1546 |
+
"url": "https://github.com/ocaml/stdlib-shims/releases/download/0.3.0/stdlib-shims-0.3.0.tbz"
|
| 1547 |
+
},
|
| 1548 |
+
"version": "0.3.0"
|
| 1549 |
+
},
|
| 1550 |
+
"system-mingw.1": {
|
| 1551 |
+
"build": null,
|
| 1552 |
+
"depends": [
|
| 1553 |
+
"ocaml-base-compiler",
|
| 1554 |
+
"ocaml-env-mingw32",
|
| 1555 |
+
"ocaml-env-mingw64"
|
| 1556 |
+
],
|
| 1557 |
+
"depends_raw": "(\"ocaml-base-compiler\" {post & >= \"4.13.0~\"} |\n \"ocaml-variants\" {post & >= \"4.13.0~\"})\n(\"ocaml-env-mingw32\" | \"ocaml-env-mingw64\")",
|
| 1558 |
+
"install": null,
|
| 1559 |
+
"name": "system-mingw",
|
| 1560 |
+
"source": null,
|
| 1561 |
+
"version": "1"
|
| 1562 |
+
},
|
| 1563 |
+
"time_now.v0.16.0": {
|
| 1564 |
+
"build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
|
| 1565 |
+
"depends": [
|
| 1566 |
+
"ocaml",
|
| 1567 |
+
"base",
|
| 1568 |
+
"jane-street-headers",
|
| 1569 |
+
"jst-config",
|
| 1570 |
+
"ppx_base",
|
| 1571 |
+
"ppx_optcomp",
|
| 1572 |
+
"dune"
|
| 1573 |
+
],
|
| 1574 |
+
"depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"jane-street-headers\" {>= \"v0.16\" & < \"v0.17\"}\n\"jst-config\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_base\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_optcomp\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}",
|
| 1575 |
+
"install": null,
|
| 1576 |
+
"name": "time_now",
|
| 1577 |
+
"source": {
|
| 1578 |
+
"archive": "tgz",
|
| 1579 |
+
"checksums": [
|
| 1580 |
+
"sha256=5fa084aadee6aaedbb8976e4a2bc0c1dfe69eecdd0576ff901f21eedd46dc3a1"
|
| 1581 |
+
],
|
| 1582 |
+
"size": 3668,
|
| 1583 |
+
"url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/time_now-v0.16.0.tar.gz"
|
| 1584 |
+
},
|
| 1585 |
+
"version": "v0.16.0"
|
| 1586 |
+
},
|
| 1587 |
+
"topkg.1.1.1": {
|
| 1588 |
+
"build": "\"ocaml\" \"pkg/pkg.ml\" \"build\" \"--pkg-name\" name \"--dev-pkg\" \"%{dev}%\"",
|
| 1589 |
+
"depends": [
|
| 1590 |
+
"ocaml",
|
| 1591 |
+
"ocamlfind",
|
| 1592 |
+
"ocamlbuild"
|
| 1593 |
+
],
|
| 1594 |
+
"depends_raw": "\"ocaml\" {>= \"4.08.0\"} \"ocamlfind\" {build & >= \"1.6.1\"} \"ocamlbuild\"",
|
| 1595 |
+
"install": null,
|
| 1596 |
+
"name": "topkg",
|
| 1597 |
+
"source": {
|
| 1598 |
+
"archive": "tbz",
|
| 1599 |
+
"checksums": [
|
| 1600 |
+
"sha512=c36c549a362ddf5b7fe3f6ff91c79b7ab531c43633bb9737576370bcbd69db7e1625d247c278a869b503d45a175e9753231ccf595e5bfa4e3b7e2602ac3d3b42",
|
| 1601 |
+
"sha256=20da062dc9cea21b5c728f22c986ed3e3d57310e643260160a802d559712f6fc"
|
| 1602 |
+
],
|
| 1603 |
+
"size": 96571,
|
| 1604 |
+
"url": "https://erratique.ch/software/topkg/releases/topkg-1.1.1.tbz"
|
| 1605 |
+
},
|
| 1606 |
+
"version": "1.1.1"
|
| 1607 |
+
},
|
| 1608 |
+
"yojson.3.0.0": {
|
| 1609 |
+
"build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test}\n \"@doc\" {with-doc}\n]",
|
| 1610 |
+
"depends": [
|
| 1611 |
+
"dune",
|
| 1612 |
+
"ocaml"
|
| 1613 |
+
],
|
| 1614 |
+
"depends_raw": "\"dune\" {>= \"2.7\"}\n\"ocaml\" {>= \"4.08\"}\n\"alcotest\" {with-test & >= \"0.8.5\"}\n\"odoc\" {with-doc}",
|
| 1615 |
+
"install": null,
|
| 1616 |
+
"name": "yojson",
|
| 1617 |
+
"source": {
|
| 1618 |
+
"archive": "tbz",
|
| 1619 |
+
"checksums": [
|
| 1620 |
+
"sha256=99414da7609b92a02474ef4b49ecda15edc8cbba5229341b124e7e4695c39610",
|
| 1621 |
+
"sha512=896d0ea829a36ccadba6628800369c1a3ab9e7c64dbda8b76331889c9db481cd64e137f467481ae80a8dd5fca45d748bfa71f58641806cc1bb1a007f8291789f"
|
| 1622 |
+
],
|
| 1623 |
+
"size": 44166,
|
| 1624 |
+
"url": "https://github.com/ocaml-community/yojson/releases/download/3.0.0/yojson-3.0.0.tbz"
|
| 1625 |
+
},
|
| 1626 |
+
"version": "3.0.0"
|
| 1627 |
+
}
|
| 1628 |
+
},
|
| 1629 |
+
"schema_version": {
|
| 1630 |
+
"major": 1,
|
| 1631 |
+
"minor": 0
|
| 1632 |
+
},
|
| 1633 |
+
"slots": {
|
| 1634 |
+
"Release.Darwin_arm64": {
|
| 1635 |
+
"opam_vars": {
|
| 1636 |
+
"arch": "arm64",
|
| 1637 |
+
"os": "macos"
|
| 1638 |
+
},
|
| 1639 |
+
"solution": [
|
| 1640 |
+
"angstrom-lwt-unix.0.16.1",
|
| 1641 |
+
"angstrom.0.16.1",
|
| 1642 |
+
"base-bigarray.base",
|
| 1643 |
+
"base-bytes.base",
|
| 1644 |
+
"base-threads.base",
|
| 1645 |
+
"base-unix.base",
|
| 1646 |
+
"base.v0.16.5",
|
| 1647 |
+
"bigstringaf.0.10.0",
|
| 1648 |
+
"cmdliner.2.1.1",
|
| 1649 |
+
"cppo.1.8.0",
|
| 1650 |
+
"csexp.1.5.2",
|
| 1651 |
+
"dap.1.0.6",
|
| 1652 |
+
"dune-configurator.3.23.1",
|
| 1653 |
+
"dune.3.23.1",
|
| 1654 |
+
"earlybird.1.3.6",
|
| 1655 |
+
"fmt.0.11.0",
|
| 1656 |
+
"iter.1.9",
|
| 1657 |
+
"jane-street-headers.v0.16.0",
|
| 1658 |
+
"jst-config.v0.16.0",
|
| 1659 |
+
"logs.0.10.0",
|
| 1660 |
+
"lru.0.3.1",
|
| 1661 |
+
"lwt.5.10.1",
|
| 1662 |
+
"lwt_ppx.5.9.1",
|
| 1663 |
+
"lwt_react.1.2.0",
|
| 1664 |
+
"menhir.20260209",
|
| 1665 |
+
"menhirCST.20260209",
|
| 1666 |
+
"menhirGLR.20260209",
|
| 1667 |
+
"menhirLib.20260209",
|
| 1668 |
+
"menhirSdk.20260209",
|
| 1669 |
+
"num.1.6",
|
| 1670 |
+
"ocaml-base-compiler.4.14.3",
|
| 1671 |
+
"ocaml-compiler-libs.v0.12.4",
|
| 1672 |
+
"ocaml-config.2",
|
| 1673 |
+
"ocaml-options-vanilla.1",
|
| 1674 |
+
"ocaml-syntax-shims.1.0.0",
|
| 1675 |
+
"ocaml.4.14.3",
|
| 1676 |
+
"ocamlbuild.0.16.1",
|
| 1677 |
+
"ocamlfind.1.9.8",
|
| 1678 |
+
"ocplib-endian.1.2",
|
| 1679 |
+
"parsexp.v0.16.0",
|
| 1680 |
+
"path_glob.0.3",
|
| 1681 |
+
"ppx_assert.v0.16.0",
|
| 1682 |
+
"ppx_base.v0.16.0",
|
| 1683 |
+
"ppx_cold.v0.16.0",
|
| 1684 |
+
"ppx_compare.v0.16.0",
|
| 1685 |
+
"ppx_derivers.1.2.1",
|
| 1686 |
+
"ppx_deriving.6.0.3",
|
| 1687 |
+
"ppx_deriving_yojson.3.9.1",
|
| 1688 |
+
"ppx_enumerate.v0.16.0",
|
| 1689 |
+
"ppx_expect.v0.16.2",
|
| 1690 |
+
"ppx_globalize.v0.16.0",
|
| 1691 |
+
"ppx_hash.v0.16.0",
|
| 1692 |
+
"ppx_here.v0.16.0",
|
| 1693 |
+
"ppx_inline_test.v0.16.1",
|
| 1694 |
+
"ppx_optcomp.v0.16.0",
|
| 1695 |
+
"ppx_sexp_conv.v0.16.0",
|
| 1696 |
+
"ppxlib.0.35.0",
|
| 1697 |
+
"psq.0.2.1",
|
| 1698 |
+
"re.1.14.0",
|
| 1699 |
+
"react.1.2.2",
|
| 1700 |
+
"seq.base",
|
| 1701 |
+
"sexplib.v0.16.0",
|
| 1702 |
+
"sexplib0.v0.16.0",
|
| 1703 |
+
"stdio.v0.16.0",
|
| 1704 |
+
"stdlib-shims.0.3.0",
|
| 1705 |
+
"time_now.v0.16.0",
|
| 1706 |
+
"topkg.1.1.1",
|
| 1707 |
+
"yojson.3.0.0"
|
| 1708 |
+
]
|
| 1709 |
+
},
|
| 1710 |
+
"Release.Darwin_x86_64": {
|
| 1711 |
+
"opam_vars": {
|
| 1712 |
+
"arch": "x86_64",
|
| 1713 |
+
"os": "macos"
|
| 1714 |
+
},
|
| 1715 |
+
"solution": [
|
| 1716 |
+
"angstrom-lwt-unix.0.16.1",
|
| 1717 |
+
"angstrom.0.16.1",
|
| 1718 |
+
"base-bigarray.base",
|
| 1719 |
+
"base-bytes.base",
|
| 1720 |
+
"base-threads.base",
|
| 1721 |
+
"base-unix.base",
|
| 1722 |
+
"base.v0.16.5",
|
| 1723 |
+
"bigstringaf.0.10.0",
|
| 1724 |
+
"cmdliner.2.1.1",
|
| 1725 |
+
"cppo.1.8.0",
|
| 1726 |
+
"csexp.1.5.2",
|
| 1727 |
+
"dap.1.0.6",
|
| 1728 |
+
"dune-configurator.3.23.1",
|
| 1729 |
+
"dune.3.23.1",
|
| 1730 |
+
"earlybird.1.3.6",
|
| 1731 |
+
"fmt.0.11.0",
|
| 1732 |
+
"iter.1.9",
|
| 1733 |
+
"jane-street-headers.v0.16.0",
|
| 1734 |
+
"jst-config.v0.16.0",
|
| 1735 |
+
"logs.0.10.0",
|
| 1736 |
+
"lru.0.3.1",
|
| 1737 |
+
"lwt.5.10.1",
|
| 1738 |
+
"lwt_ppx.5.9.1",
|
| 1739 |
+
"lwt_react.1.2.0",
|
| 1740 |
+
"menhir.20260209",
|
| 1741 |
+
"menhirCST.20260209",
|
| 1742 |
+
"menhirGLR.20260209",
|
| 1743 |
+
"menhirLib.20260209",
|
| 1744 |
+
"menhirSdk.20260209",
|
| 1745 |
+
"num.1.6",
|
| 1746 |
+
"ocaml-base-compiler.4.14.3",
|
| 1747 |
+
"ocaml-compiler-libs.v0.12.4",
|
| 1748 |
+
"ocaml-config.2",
|
| 1749 |
+
"ocaml-options-vanilla.1",
|
| 1750 |
+
"ocaml-syntax-shims.1.0.0",
|
| 1751 |
+
"ocaml.4.14.3",
|
| 1752 |
+
"ocamlbuild.0.16.1",
|
| 1753 |
+
"ocamlfind.1.9.8",
|
| 1754 |
+
"ocplib-endian.1.2",
|
| 1755 |
+
"parsexp.v0.16.0",
|
| 1756 |
+
"path_glob.0.3",
|
| 1757 |
+
"ppx_assert.v0.16.0",
|
| 1758 |
+
"ppx_base.v0.16.0",
|
| 1759 |
+
"ppx_cold.v0.16.0",
|
| 1760 |
+
"ppx_compare.v0.16.0",
|
| 1761 |
+
"ppx_derivers.1.2.1",
|
| 1762 |
+
"ppx_deriving.6.0.3",
|
| 1763 |
+
"ppx_deriving_yojson.3.9.1",
|
| 1764 |
+
"ppx_enumerate.v0.16.0",
|
| 1765 |
+
"ppx_expect.v0.16.2",
|
| 1766 |
+
"ppx_globalize.v0.16.0",
|
| 1767 |
+
"ppx_hash.v0.16.0",
|
| 1768 |
+
"ppx_here.v0.16.0",
|
| 1769 |
+
"ppx_inline_test.v0.16.1",
|
| 1770 |
+
"ppx_optcomp.v0.16.0",
|
| 1771 |
+
"ppx_sexp_conv.v0.16.0",
|
| 1772 |
+
"ppxlib.0.35.0",
|
| 1773 |
+
"psq.0.2.1",
|
| 1774 |
+
"re.1.14.0",
|
| 1775 |
+
"react.1.2.2",
|
| 1776 |
+
"seq.base",
|
| 1777 |
+
"sexplib.v0.16.0",
|
| 1778 |
+
"sexplib0.v0.16.0",
|
| 1779 |
+
"stdio.v0.16.0",
|
| 1780 |
+
"stdlib-shims.0.3.0",
|
| 1781 |
+
"time_now.v0.16.0",
|
| 1782 |
+
"topkg.1.1.1",
|
| 1783 |
+
"yojson.3.0.0"
|
| 1784 |
+
]
|
| 1785 |
+
},
|
| 1786 |
+
"Release.Linux_arm64": {
|
| 1787 |
+
"opam_vars": {
|
| 1788 |
+
"arch": "arm64",
|
| 1789 |
+
"os": "linux"
|
| 1790 |
+
},
|
| 1791 |
+
"solution": [
|
| 1792 |
+
"angstrom-lwt-unix.0.16.1",
|
| 1793 |
+
"angstrom.0.16.1",
|
| 1794 |
+
"base-bigarray.base",
|
| 1795 |
+
"base-bytes.base",
|
| 1796 |
+
"base-threads.base",
|
| 1797 |
+
"base-unix.base",
|
| 1798 |
+
"base.v0.16.5",
|
| 1799 |
+
"bigstringaf.0.10.0",
|
| 1800 |
+
"cmdliner.2.1.1",
|
| 1801 |
+
"cppo.1.8.0",
|
| 1802 |
+
"csexp.1.5.2",
|
| 1803 |
+
"dap.1.0.6",
|
| 1804 |
+
"dune-configurator.3.23.1",
|
| 1805 |
+
"dune.3.23.1",
|
| 1806 |
+
"earlybird.1.3.6",
|
| 1807 |
+
"fmt.0.11.0",
|
| 1808 |
+
"iter.1.9",
|
| 1809 |
+
"jane-street-headers.v0.16.0",
|
| 1810 |
+
"jst-config.v0.16.0",
|
| 1811 |
+
"logs.0.10.0",
|
| 1812 |
+
"lru.0.3.1",
|
| 1813 |
+
"lwt.5.10.1",
|
| 1814 |
+
"lwt_ppx.5.9.1",
|
| 1815 |
+
"lwt_react.1.2.0",
|
| 1816 |
+
"menhir.20260209",
|
| 1817 |
+
"menhirCST.20260209",
|
| 1818 |
+
"menhirGLR.20260209",
|
| 1819 |
+
"menhirLib.20260209",
|
| 1820 |
+
"menhirSdk.20260209",
|
| 1821 |
+
"num.1.6",
|
| 1822 |
+
"ocaml-base-compiler.4.14.3",
|
| 1823 |
+
"ocaml-compiler-libs.v0.12.4",
|
| 1824 |
+
"ocaml-config.2",
|
| 1825 |
+
"ocaml-options-vanilla.1",
|
| 1826 |
+
"ocaml-syntax-shims.1.0.0",
|
| 1827 |
+
"ocaml.4.14.3",
|
| 1828 |
+
"ocamlbuild.0.16.1",
|
| 1829 |
+
"ocamlfind.1.9.8",
|
| 1830 |
+
"ocplib-endian.1.2",
|
| 1831 |
+
"parsexp.v0.16.0",
|
| 1832 |
+
"path_glob.0.3",
|
| 1833 |
+
"ppx_assert.v0.16.0",
|
| 1834 |
+
"ppx_base.v0.16.0",
|
| 1835 |
+
"ppx_cold.v0.16.0",
|
| 1836 |
+
"ppx_compare.v0.16.0",
|
| 1837 |
+
"ppx_derivers.1.2.1",
|
| 1838 |
+
"ppx_deriving.6.0.3",
|
| 1839 |
+
"ppx_deriving_yojson.3.9.1",
|
| 1840 |
+
"ppx_enumerate.v0.16.0",
|
| 1841 |
+
"ppx_expect.v0.16.2",
|
| 1842 |
+
"ppx_globalize.v0.16.0",
|
| 1843 |
+
"ppx_hash.v0.16.0",
|
| 1844 |
+
"ppx_here.v0.16.0",
|
| 1845 |
+
"ppx_inline_test.v0.16.1",
|
| 1846 |
+
"ppx_optcomp.v0.16.0",
|
| 1847 |
+
"ppx_sexp_conv.v0.16.0",
|
| 1848 |
+
"ppxlib.0.35.0",
|
| 1849 |
+
"psq.0.2.1",
|
| 1850 |
+
"re.1.14.0",
|
| 1851 |
+
"react.1.2.2",
|
| 1852 |
+
"seq.base",
|
| 1853 |
+
"sexplib.v0.16.0",
|
| 1854 |
+
"sexplib0.v0.16.0",
|
| 1855 |
+
"stdio.v0.16.0",
|
| 1856 |
+
"stdlib-shims.0.3.0",
|
| 1857 |
+
"time_now.v0.16.0",
|
| 1858 |
+
"topkg.1.1.1",
|
| 1859 |
+
"yojson.3.0.0"
|
| 1860 |
+
]
|
| 1861 |
+
},
|
| 1862 |
+
"Release.Linux_x86": {
|
| 1863 |
+
"opam_vars": {
|
| 1864 |
+
"arch": "x86_32",
|
| 1865 |
+
"os": "linux"
|
| 1866 |
+
},
|
| 1867 |
+
"solution": [
|
| 1868 |
+
"angstrom-lwt-unix.0.16.1",
|
| 1869 |
+
"angstrom.0.16.1",
|
| 1870 |
+
"base-bigarray.base",
|
| 1871 |
+
"base-bytes.base",
|
| 1872 |
+
"base-threads.base",
|
| 1873 |
+
"base-unix.base",
|
| 1874 |
+
"base.v0.16.5",
|
| 1875 |
+
"bigstringaf.0.10.0",
|
| 1876 |
+
"cmdliner.2.1.1",
|
| 1877 |
+
"cppo.1.8.0",
|
| 1878 |
+
"csexp.1.5.2",
|
| 1879 |
+
"dap.1.0.6",
|
| 1880 |
+
"dune-configurator.3.23.1",
|
| 1881 |
+
"dune.3.23.1",
|
| 1882 |
+
"earlybird.1.3.6",
|
| 1883 |
+
"fmt.0.11.0",
|
| 1884 |
+
"iter.1.9",
|
| 1885 |
+
"jane-street-headers.v0.16.0",
|
| 1886 |
+
"jst-config.v0.16.0",
|
| 1887 |
+
"logs.0.10.0",
|
| 1888 |
+
"lru.0.3.1",
|
| 1889 |
+
"lwt.5.10.1",
|
| 1890 |
+
"lwt_ppx.5.9.1",
|
| 1891 |
+
"lwt_react.1.2.0",
|
| 1892 |
+
"menhir.20260209",
|
| 1893 |
+
"menhirCST.20260209",
|
| 1894 |
+
"menhirGLR.20260209",
|
| 1895 |
+
"menhirLib.20260209",
|
| 1896 |
+
"menhirSdk.20260209",
|
| 1897 |
+
"num.1.6",
|
| 1898 |
+
"ocaml-base-compiler.4.14.3",
|
| 1899 |
+
"ocaml-compiler-libs.v0.12.4",
|
| 1900 |
+
"ocaml-config.2",
|
| 1901 |
+
"ocaml-options-vanilla.1",
|
| 1902 |
+
"ocaml-syntax-shims.1.0.0",
|
| 1903 |
+
"ocaml.4.14.3",
|
| 1904 |
+
"ocamlbuild.0.16.1",
|
| 1905 |
+
"ocamlfind.1.9.8",
|
| 1906 |
+
"ocplib-endian.1.2",
|
| 1907 |
+
"parsexp.v0.16.0",
|
| 1908 |
+
"path_glob.0.3",
|
| 1909 |
+
"ppx_assert.v0.16.0",
|
| 1910 |
+
"ppx_base.v0.16.0",
|
| 1911 |
+
"ppx_cold.v0.16.0",
|
| 1912 |
+
"ppx_compare.v0.16.0",
|
| 1913 |
+
"ppx_derivers.1.2.1",
|
| 1914 |
+
"ppx_deriving.6.0.3",
|
| 1915 |
+
"ppx_deriving_yojson.3.9.1",
|
| 1916 |
+
"ppx_enumerate.v0.16.0",
|
| 1917 |
+
"ppx_expect.v0.16.0",
|
| 1918 |
+
"ppx_globalize.v0.16.0",
|
| 1919 |
+
"ppx_hash.v0.16.0",
|
| 1920 |
+
"ppx_here.v0.16.0",
|
| 1921 |
+
"ppx_inline_test.v0.16.0",
|
| 1922 |
+
"ppx_optcomp.v0.16.0",
|
| 1923 |
+
"ppx_sexp_conv.v0.16.0",
|
| 1924 |
+
"ppxlib.0.35.0",
|
| 1925 |
+
"psq.0.2.1",
|
| 1926 |
+
"re.1.14.0",
|
| 1927 |
+
"react.1.2.2",
|
| 1928 |
+
"seq.base",
|
| 1929 |
+
"sexplib.v0.16.0",
|
| 1930 |
+
"sexplib0.v0.16.0",
|
| 1931 |
+
"stdio.v0.16.0",
|
| 1932 |
+
"stdlib-shims.0.3.0",
|
| 1933 |
+
"time_now.v0.16.0",
|
| 1934 |
+
"topkg.1.1.1",
|
| 1935 |
+
"yojson.3.0.0"
|
| 1936 |
+
]
|
| 1937 |
+
},
|
| 1938 |
+
"Release.Linux_x86_64": {
|
| 1939 |
+
"opam_vars": {
|
| 1940 |
+
"arch": "x86_64",
|
| 1941 |
+
"os": "linux"
|
| 1942 |
+
},
|
| 1943 |
+
"solution": [
|
| 1944 |
+
"angstrom-lwt-unix.0.16.1",
|
| 1945 |
+
"angstrom.0.16.1",
|
| 1946 |
+
"base-bigarray.base",
|
| 1947 |
+
"base-bytes.base",
|
| 1948 |
+
"base-threads.base",
|
| 1949 |
+
"base-unix.base",
|
| 1950 |
+
"base.v0.16.5",
|
| 1951 |
+
"bigstringaf.0.10.0",
|
| 1952 |
+
"cmdliner.2.1.1",
|
| 1953 |
+
"cppo.1.8.0",
|
| 1954 |
+
"csexp.1.5.2",
|
| 1955 |
+
"dap.1.0.6",
|
| 1956 |
+
"dune-configurator.3.23.1",
|
| 1957 |
+
"dune.3.23.1",
|
| 1958 |
+
"earlybird.1.3.6",
|
| 1959 |
+
"fmt.0.11.0",
|
| 1960 |
+
"iter.1.9",
|
| 1961 |
+
"jane-street-headers.v0.16.0",
|
| 1962 |
+
"jst-config.v0.16.0",
|
| 1963 |
+
"logs.0.10.0",
|
| 1964 |
+
"lru.0.3.1",
|
| 1965 |
+
"lwt.5.10.1",
|
| 1966 |
+
"lwt_ppx.5.9.1",
|
| 1967 |
+
"lwt_react.1.2.0",
|
| 1968 |
+
"menhir.20260209",
|
| 1969 |
+
"menhirCST.20260209",
|
| 1970 |
+
"menhirGLR.20260209",
|
| 1971 |
+
"menhirLib.20260209",
|
| 1972 |
+
"menhirSdk.20260209",
|
| 1973 |
+
"num.1.6",
|
| 1974 |
+
"ocaml-base-compiler.4.14.3",
|
| 1975 |
+
"ocaml-compiler-libs.v0.12.4",
|
| 1976 |
+
"ocaml-config.2",
|
| 1977 |
+
"ocaml-options-vanilla.1",
|
| 1978 |
+
"ocaml-syntax-shims.1.0.0",
|
| 1979 |
+
"ocaml.4.14.3",
|
| 1980 |
+
"ocamlbuild.0.16.1",
|
| 1981 |
+
"ocamlfind.1.9.8",
|
| 1982 |
+
"ocplib-endian.1.2",
|
| 1983 |
+
"parsexp.v0.16.0",
|
| 1984 |
+
"path_glob.0.3",
|
| 1985 |
+
"ppx_assert.v0.16.0",
|
| 1986 |
+
"ppx_base.v0.16.0",
|
| 1987 |
+
"ppx_cold.v0.16.0",
|
| 1988 |
+
"ppx_compare.v0.16.0",
|
| 1989 |
+
"ppx_derivers.1.2.1",
|
| 1990 |
+
"ppx_deriving.6.0.3",
|
| 1991 |
+
"ppx_deriving_yojson.3.9.1",
|
| 1992 |
+
"ppx_enumerate.v0.16.0",
|
| 1993 |
+
"ppx_expect.v0.16.2",
|
| 1994 |
+
"ppx_globalize.v0.16.0",
|
| 1995 |
+
"ppx_hash.v0.16.0",
|
| 1996 |
+
"ppx_here.v0.16.0",
|
| 1997 |
+
"ppx_inline_test.v0.16.1",
|
| 1998 |
+
"ppx_optcomp.v0.16.0",
|
| 1999 |
+
"ppx_sexp_conv.v0.16.0",
|
| 2000 |
+
"ppxlib.0.35.0",
|
| 2001 |
+
"psq.0.2.1",
|
| 2002 |
+
"re.1.14.0",
|
| 2003 |
+
"react.1.2.2",
|
| 2004 |
+
"seq.base",
|
| 2005 |
+
"sexplib.v0.16.0",
|
| 2006 |
+
"sexplib0.v0.16.0",
|
| 2007 |
+
"stdio.v0.16.0",
|
| 2008 |
+
"stdlib-shims.0.3.0",
|
| 2009 |
+
"time_now.v0.16.0",
|
| 2010 |
+
"topkg.1.1.1",
|
| 2011 |
+
"yojson.3.0.0"
|
| 2012 |
+
]
|
| 2013 |
+
},
|
| 2014 |
+
"Release.Linux_x86_64_musl": {
|
| 2015 |
+
"opam_vars": {
|
| 2016 |
+
"arch": "x86_64",
|
| 2017 |
+
"os": "linux"
|
| 2018 |
+
},
|
| 2019 |
+
"solution": [
|
| 2020 |
+
"angstrom-lwt-unix.0.16.1",
|
| 2021 |
+
"angstrom.0.16.1",
|
| 2022 |
+
"base-bigarray.base",
|
| 2023 |
+
"base-bytes.base",
|
| 2024 |
+
"base-threads.base",
|
| 2025 |
+
"base-unix.base",
|
| 2026 |
+
"base.v0.16.5",
|
| 2027 |
+
"bigstringaf.0.10.0",
|
| 2028 |
+
"cmdliner.2.1.1",
|
| 2029 |
+
"cppo.1.8.0",
|
| 2030 |
+
"csexp.1.5.2",
|
| 2031 |
+
"dap.1.0.6",
|
| 2032 |
+
"dune-configurator.3.23.1",
|
| 2033 |
+
"dune.3.23.1",
|
| 2034 |
+
"earlybird.1.3.6",
|
| 2035 |
+
"fmt.0.11.0",
|
| 2036 |
+
"iter.1.9",
|
| 2037 |
+
"jane-street-headers.v0.16.0",
|
| 2038 |
+
"jst-config.v0.16.0",
|
| 2039 |
+
"logs.0.10.0",
|
| 2040 |
+
"lru.0.3.1",
|
| 2041 |
+
"lwt.5.10.1",
|
| 2042 |
+
"lwt_ppx.5.9.1",
|
| 2043 |
+
"lwt_react.1.2.0",
|
| 2044 |
+
"menhir.20260209",
|
| 2045 |
+
"menhirCST.20260209",
|
| 2046 |
+
"menhirGLR.20260209",
|
| 2047 |
+
"menhirLib.20260209",
|
| 2048 |
+
"menhirSdk.20260209",
|
| 2049 |
+
"num.1.6",
|
| 2050 |
+
"ocaml-base-compiler.4.14.3",
|
| 2051 |
+
"ocaml-compiler-libs.v0.12.4",
|
| 2052 |
+
"ocaml-config.2",
|
| 2053 |
+
"ocaml-options-vanilla.1",
|
| 2054 |
+
"ocaml-syntax-shims.1.0.0",
|
| 2055 |
+
"ocaml.4.14.3",
|
| 2056 |
+
"ocamlbuild.0.16.1",
|
| 2057 |
+
"ocamlfind.1.9.8",
|
| 2058 |
+
"ocplib-endian.1.2",
|
| 2059 |
+
"parsexp.v0.16.0",
|
| 2060 |
+
"path_glob.0.3",
|
| 2061 |
+
"ppx_assert.v0.16.0",
|
| 2062 |
+
"ppx_base.v0.16.0",
|
| 2063 |
+
"ppx_cold.v0.16.0",
|
| 2064 |
+
"ppx_compare.v0.16.0",
|
| 2065 |
+
"ppx_derivers.1.2.1",
|
| 2066 |
+
"ppx_deriving.6.0.3",
|
| 2067 |
+
"ppx_deriving_yojson.3.9.1",
|
| 2068 |
+
"ppx_enumerate.v0.16.0",
|
| 2069 |
+
"ppx_expect.v0.16.2",
|
| 2070 |
+
"ppx_globalize.v0.16.0",
|
| 2071 |
+
"ppx_hash.v0.16.0",
|
| 2072 |
+
"ppx_here.v0.16.0",
|
| 2073 |
+
"ppx_inline_test.v0.16.1",
|
| 2074 |
+
"ppx_optcomp.v0.16.0",
|
| 2075 |
+
"ppx_sexp_conv.v0.16.0",
|
| 2076 |
+
"ppxlib.0.35.0",
|
| 2077 |
+
"psq.0.2.1",
|
| 2078 |
+
"re.1.14.0",
|
| 2079 |
+
"react.1.2.2",
|
| 2080 |
+
"seq.base",
|
| 2081 |
+
"sexplib.v0.16.0",
|
| 2082 |
+
"sexplib0.v0.16.0",
|
| 2083 |
+
"stdio.v0.16.0",
|
| 2084 |
+
"stdlib-shims.0.3.0",
|
| 2085 |
+
"time_now.v0.16.0",
|
| 2086 |
+
"topkg.1.1.1",
|
| 2087 |
+
"yojson.3.0.0"
|
| 2088 |
+
]
|
| 2089 |
+
},
|
| 2090 |
+
"Release.Windows_x86": {
|
| 2091 |
+
"opam_vars": {
|
| 2092 |
+
"arch": "x86_32",
|
| 2093 |
+
"os": "win32"
|
| 2094 |
+
},
|
| 2095 |
+
"solution": [
|
| 2096 |
+
"angstrom-lwt-unix.0.16.1",
|
| 2097 |
+
"angstrom.0.16.1",
|
| 2098 |
+
"base-bigarray.base",
|
| 2099 |
+
"base-bytes.base",
|
| 2100 |
+
"base-threads.base",
|
| 2101 |
+
"base-unix.base",
|
| 2102 |
+
"base.v0.16.5",
|
| 2103 |
+
"bigstringaf.0.10.0",
|
| 2104 |
+
"cmdliner.2.1.1",
|
| 2105 |
+
"conf-mingw-w64-gcc-i686.1",
|
| 2106 |
+
"cppo.1.8.0",
|
| 2107 |
+
"csexp.1.5.2",
|
| 2108 |
+
"dap.1.0.6",
|
| 2109 |
+
"dune-configurator.3.23.1",
|
| 2110 |
+
"dune.3.23.1",
|
| 2111 |
+
"earlybird.1.3.6",
|
| 2112 |
+
"flexdll.0.44",
|
| 2113 |
+
"fmt.0.11.0",
|
| 2114 |
+
"host-arch-x86_32.1",
|
| 2115 |
+
"host-system-mingw.1",
|
| 2116 |
+
"iter.1.9",
|
| 2117 |
+
"jane-street-headers.v0.16.0",
|
| 2118 |
+
"jst-config.v0.16.0",
|
| 2119 |
+
"logs.0.10.0",
|
| 2120 |
+
"lru.0.3.1",
|
| 2121 |
+
"lwt.5.10.1",
|
| 2122 |
+
"lwt_ppx.5.9.1",
|
| 2123 |
+
"lwt_react.1.2.0",
|
| 2124 |
+
"menhir.20260209",
|
| 2125 |
+
"menhirCST.20260209",
|
| 2126 |
+
"menhirGLR.20260209",
|
| 2127 |
+
"menhirLib.20260209",
|
| 2128 |
+
"menhirSdk.20260209",
|
| 2129 |
+
"num.1.6",
|
| 2130 |
+
"ocaml-base-compiler.4.14.3",
|
| 2131 |
+
"ocaml-compiler-libs.v0.12.4",
|
| 2132 |
+
"ocaml-config.3",
|
| 2133 |
+
"ocaml-env-mingw32.1",
|
| 2134 |
+
"ocaml-options-vanilla.1",
|
| 2135 |
+
"ocaml-syntax-shims.1.0.0",
|
| 2136 |
+
"ocaml.4.14.3",
|
| 2137 |
+
"ocamlbuild.0.16.1",
|
| 2138 |
+
"ocamlfind.1.9.8",
|
| 2139 |
+
"ocplib-endian.1.2",
|
| 2140 |
+
"parsexp.v0.16.0",
|
| 2141 |
+
"path_glob.0.3",
|
| 2142 |
+
"ppx_assert.v0.16.0",
|
| 2143 |
+
"ppx_base.v0.16.0",
|
| 2144 |
+
"ppx_cold.v0.16.0",
|
| 2145 |
+
"ppx_compare.v0.16.0",
|
| 2146 |
+
"ppx_derivers.1.2.1",
|
| 2147 |
+
"ppx_deriving.6.0.3",
|
| 2148 |
+
"ppx_deriving_yojson.3.9.1",
|
| 2149 |
+
"ppx_enumerate.v0.16.0",
|
| 2150 |
+
"ppx_expect.v0.16.0",
|
| 2151 |
+
"ppx_globalize.v0.16.0",
|
| 2152 |
+
"ppx_hash.v0.16.0",
|
| 2153 |
+
"ppx_here.v0.16.0",
|
| 2154 |
+
"ppx_inline_test.v0.16.0",
|
| 2155 |
+
"ppx_optcomp.v0.16.0",
|
| 2156 |
+
"ppx_sexp_conv.v0.16.0",
|
| 2157 |
+
"ppxlib.0.35.0",
|
| 2158 |
+
"psq.0.2.1",
|
| 2159 |
+
"re.1.14.0",
|
| 2160 |
+
"react.1.2.2",
|
| 2161 |
+
"seq.base",
|
| 2162 |
+
"sexplib.v0.16.0",
|
| 2163 |
+
"sexplib0.v0.16.0",
|
| 2164 |
+
"stdio.v0.16.0",
|
| 2165 |
+
"stdlib-shims.0.3.0",
|
| 2166 |
+
"system-mingw.1",
|
| 2167 |
+
"time_now.v0.16.0",
|
| 2168 |
+
"topkg.1.1.1",
|
| 2169 |
+
"yojson.3.0.0"
|
| 2170 |
+
]
|
| 2171 |
+
},
|
| 2172 |
+
"Release.Windows_x86_64": {
|
| 2173 |
+
"opam_vars": {
|
| 2174 |
+
"arch": "x86_64",
|
| 2175 |
+
"os": "win32"
|
| 2176 |
+
},
|
| 2177 |
+
"solution": [
|
| 2178 |
+
"angstrom-lwt-unix.0.16.1",
|
| 2179 |
+
"angstrom.0.16.1",
|
| 2180 |
+
"arch-x86_64.1",
|
| 2181 |
+
"base-bigarray.base",
|
| 2182 |
+
"base-bytes.base",
|
| 2183 |
+
"base-threads.base",
|
| 2184 |
+
"base-unix.base",
|
| 2185 |
+
"base.v0.16.5",
|
| 2186 |
+
"bigstringaf.0.10.0",
|
| 2187 |
+
"cmdliner.2.1.1",
|
| 2188 |
+
"conf-mingw-w64-gcc-x86_64.1",
|
| 2189 |
+
"cppo.1.8.0",
|
| 2190 |
+
"csexp.1.5.2",
|
| 2191 |
+
"dap.1.0.6",
|
| 2192 |
+
"dune-configurator.3.23.1",
|
| 2193 |
+
"dune.3.23.1",
|
| 2194 |
+
"earlybird.1.3.6",
|
| 2195 |
+
"flexdll.0.44",
|
| 2196 |
+
"fmt.0.11.0",
|
| 2197 |
+
"host-arch-x86_64.1",
|
| 2198 |
+
"host-system-mingw.1",
|
| 2199 |
+
"iter.1.9",
|
| 2200 |
+
"jane-street-headers.v0.16.0",
|
| 2201 |
+
"jst-config.v0.16.0",
|
| 2202 |
+
"logs.0.10.0",
|
| 2203 |
+
"lru.0.3.1",
|
| 2204 |
+
"lwt.5.10.1",
|
| 2205 |
+
"lwt_ppx.5.9.1",
|
| 2206 |
+
"lwt_react.1.2.0",
|
| 2207 |
+
"menhir.20260209",
|
| 2208 |
+
"menhirCST.20260209",
|
| 2209 |
+
"menhirGLR.20260209",
|
| 2210 |
+
"menhirLib.20260209",
|
| 2211 |
+
"menhirSdk.20260209",
|
| 2212 |
+
"num.1.6",
|
| 2213 |
+
"ocaml-base-compiler.4.14.3",
|
| 2214 |
+
"ocaml-compiler-libs.v0.12.4",
|
| 2215 |
+
"ocaml-config.3",
|
| 2216 |
+
"ocaml-env-mingw64.1",
|
| 2217 |
+
"ocaml-options-vanilla.1",
|
| 2218 |
+
"ocaml-syntax-shims.1.0.0",
|
| 2219 |
+
"ocaml.4.14.3",
|
| 2220 |
+
"ocamlbuild.0.16.1",
|
| 2221 |
+
"ocamlfind.1.9.8",
|
| 2222 |
+
"ocplib-endian.1.2",
|
| 2223 |
+
"parsexp.v0.16.0",
|
| 2224 |
+
"path_glob.0.3",
|
| 2225 |
+
"ppx_assert.v0.16.0",
|
| 2226 |
+
"ppx_base.v0.16.0",
|
| 2227 |
+
"ppx_cold.v0.16.0",
|
| 2228 |
+
"ppx_compare.v0.16.0",
|
| 2229 |
+
"ppx_derivers.1.2.1",
|
| 2230 |
+
"ppx_deriving.6.0.3",
|
| 2231 |
+
"ppx_deriving_yojson.3.9.1",
|
| 2232 |
+
"ppx_enumerate.v0.16.0",
|
| 2233 |
+
"ppx_expect.v0.16.2",
|
| 2234 |
+
"ppx_globalize.v0.16.0",
|
| 2235 |
+
"ppx_hash.v0.16.0",
|
| 2236 |
+
"ppx_here.v0.16.0",
|
| 2237 |
+
"ppx_inline_test.v0.16.1",
|
| 2238 |
+
"ppx_optcomp.v0.16.0",
|
| 2239 |
+
"ppx_sexp_conv.v0.16.0",
|
| 2240 |
+
"ppxlib.0.35.0",
|
| 2241 |
+
"psq.0.2.1",
|
| 2242 |
+
"re.1.14.0",
|
| 2243 |
+
"react.1.2.2",
|
| 2244 |
+
"seq.base",
|
| 2245 |
+
"sexplib.v0.16.0",
|
| 2246 |
+
"sexplib0.v0.16.0",
|
| 2247 |
+
"stdio.v0.16.0",
|
| 2248 |
+
"stdlib-shims.0.3.0",
|
| 2249 |
+
"system-mingw.1",
|
| 2250 |
+
"time_now.v0.16.0",
|
| 2251 |
+
"topkg.1.1.1",
|
| 2252 |
+
"yojson.3.0.0"
|
| 2253 |
+
]
|
| 2254 |
+
}
|
| 2255 |
+
}
|
| 2256 |
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# NotHackwaly_Ocamlearlybird
|
| 2 |
+
|
| 3 |
+
## Overview
|
| 4 |
+
|
| 5 |
+
Builds the [ocamlearlybird](https://github.com/hackwaly/ocamlearlybird) OCaml
|
| 6 |
+
debug adapter with the dk build system. See CLO.md for setup instructions.
|
| 7 |
+
|
| 8 |
+
## License
|
| 9 |
+
|
| 10 |
+
MIT
|
| 11 |
+
|
| 12 |
+
## workspace
|
| 13 |
+
|
| 14 |
+
%% actual_version("2.4.3.22")
|
| 15 |
+
'actual_version'
|
| 16 |
+
'2.4.3.22'
|
| 17 |
+
|
| 18 |
+
The workspace assets below are the inputs of the dk build: the dune project
|
| 19 |
+
files, the `src/` tree, and the checked-in opam lock. After editing any of
|
| 20 |
+
them run `./dk1 update --no-imports` to refresh the recorded checksums.
|
| 21 |
+
|
| 22 |
+
### NotHackwaly_Ocamlearlybird.Apparatus@1.3.6
|
| 23 |
+
|
| 24 |
+
% unified.asset { name="DuneRoot", file="dune" }
|
| 25 |
+
\dk.asset(byteSize: "83", checksum: (sha256: "9a38938be58029f13436cf66d626b20b4fa14ecb32428efe123f93b36df96bac"))\;
|
| 26 |
+
|
| 27 |
+
% unified.asset { name="DuneWorkspace", file="dk-src/dune-workspace" }
|
| 28 |
+
\dk.asset(byteSize: "16", checksum: (sha256: "6dff6804e49533fc19ea7b0fbe988213a210fa7b9a2d5fd5f5b89eed6e380e53"))\;
|
| 29 |
+
|
| 30 |
+
% unified.asset { name="DuneProject", file="dune-project" }
|
| 31 |
+
\dk.asset(byteSize: "780", checksum: (sha256: "919033718df7d4b1546ef485a7b35d0bcd23a5b97dad73d9f70826d04951e714"))\;
|
| 32 |
+
|
| 33 |
+
% unified.asset { name="Opam", file="earlybird.opam" }
|
| 34 |
+
\dk.asset(byteSize: "1124", checksum: (sha256: "786504fe6aa5991f03cfa72e5fb830112044f5c76cb42945f51d72ad3f1566f2"))\;
|
| 35 |
+
|
| 36 |
+
% unified.asset { name="Src", dir="src" }
|
| 37 |
+
\dk.asset(byteSize: "51509", checksum: (sha256: "ca452ef1920f6c630882b146796b3adfbf44bb91f7eeda8a41e2e1656fcd1e1d"))\;
|
| 38 |
+
|
| 39 |
+
% unified.asset { name="Lock", file="dk.opam-lock.jsonc" }
|
| 40 |
+
\dk.asset(byteSize: "83240", checksum: (sha256: "8b0cbeeb0d8a11845f3cadc288bf4cb22cad3623c0673892d0b85f5256f0d967"))\;
|
| 41 |
+
|
| 42 |
+
%% import { type="github-l2", repo="dkpkg/CommonsBase_Std" }
|
| 43 |
+
\dk.import(type: "github-l2", library: "CommonsBase_Std",
|
| 44 |
+
version: "2.6.20260920144347",
|
| 45 |
+
checksum: (blake2b-256: "8f7d86924c66f6d1778c08214b1adab001f75677cb141c376b837ee6e39f57fa",
|
| 46 |
+
sha256: "b3c67724e09942596d8af32635b585698f931047e74332bc011a532a430d5438",
|
| 47 |
+
sha1: "f1d0701257aa61a5fbd480833e464263422a4135"))\;
|
| 48 |
+
|
| 49 |
+
%% import { type="github-l2", repo="dkpkg/CommonsLang_OCaml", tag="0.1.20260920144347" }
|
| 50 |
+
\dk.import(type: "github-l2", library: "CommonsLang_OCaml",
|
| 51 |
+
version: "0.1.20260920144347",
|
| 52 |
+
checksum: (blake2b-256: "f4908c307b22de34d24ae0349481f321cd46d5082cc92a89d99d18a13189d907",
|
| 53 |
+
sha256: "54c5ccfd53e87797ea4fea161b0fd6c869ba80a45b3b3870848407c6797741a8",
|
| 54 |
+
sha1: "b018ece3ee445cfd6414cd7f28a3c501b5469898"))\;
|
|
@@ -0,0 +1,864 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/sh
|
| 2 |
+
##########################################################################
|
| 3 |
+
# File: mlfront/dk0 #
|
| 4 |
+
# #
|
| 5 |
+
# Copyright 2025 Diskuv, Inc. #
|
| 6 |
+
# #
|
| 7 |
+
# Licensed under the Open Software License version 3.0 #
|
| 8 |
+
# (the "License"); you may not use this file except in compliance #
|
| 9 |
+
# with the License. You may obtain a copy of the License at #
|
| 10 |
+
# #
|
| 11 |
+
# https://opensource.org/license/osl-3-0-php/ #
|
| 12 |
+
# #
|
| 13 |
+
##########################################################################
|
| 14 |
+
|
| 15 |
+
# Recommendation: Place this file in source control.
|
| 16 |
+
#
|
| 17 |
+
# Invoking: ./dk0
|
| 18 |
+
# That works in Powershell on Windows, and in Unix. Copy-and-paste works!
|
| 19 |
+
#
|
| 20 |
+
# Purpose: Install dk0 if not present. Then invoke dk0.
|
| 21 |
+
|
| 22 |
+
# The cksum_signify_* constants below are read indirectly, through the dynamic
|
| 23 |
+
# eval lookup in dk_verify_manifest that builds the variable name from the host
|
| 24 |
+
# ABI; that reference is invisible to the linter, so the file-wide directive on
|
| 25 |
+
# the next line turns off its unused-variable warning.
|
| 26 |
+
# shellcheck disable=SC2034
|
| 27 |
+
set -euf
|
| 28 |
+
|
| 29 |
+
# ===== BAKED TRUST ROOT (rotates rarely; updated only on key/verifier rotation) =====
|
| 30 |
+
# The dk0 version is NOT baked here. It is pinned per project by a
|
| 31 |
+
# %% actual_version("X.Y.Z.W")
|
| 32 |
+
# line in dk.u's `## workspace` section (or the latest signed manifest if absent).
|
| 33 |
+
# dk0 and its checksum come from a signify-signed manifest verified at runtime:
|
| 34 |
+
# 1. download the pinned mlfront-signify verifier from its GitLab package (by
|
| 35 |
+
# the baked version below), check it against the SHA-256 baked below (the
|
| 36 |
+
# anchor -- not the manifest, so no circularity);
|
| 37 |
+
# 2. verify the signify signature over the manifest (manifest.txt) with the
|
| 38 |
+
# baked public key;
|
| 39 |
+
# 3. only then read the manifest's per-arch dk0 SHA-256.
|
| 40 |
+
# This file never rewrites itself (Windows batch/exe safety); `dk0 --self-update`
|
| 41 |
+
# edits only the dk.u actual_version line, and key rotation is followed at
|
| 42 |
+
# verify-time via the manifest's continuation chain.
|
| 43 |
+
SIGNIFY_PUBKEY_B64="RWTMq/GqeeJ06ACy7By/H05vvtpc3ZPEKlbnDm9fIQxpkgTV92is6YHD"
|
| 44 |
+
# The verifier is pinned by version+checksum and fetched from GitLab (a direct
|
| 45 |
+
# package download, not the throttled listing API); the site serves only the
|
| 46 |
+
# signed manifest and the wrappers.
|
| 47 |
+
signify_pkg_ver="2.4.2.271"
|
| 48 |
+
cksum_signify_linux_x86_64="9701ed5821ea57114890f2d54381ee29742b45292ea0c8a259b0d4187c728a4d"
|
| 49 |
+
cksum_signify_linux_x86="533ec71ef0c6081c57850c840d29df5ca8efd3c2722b54dc77c14224dda0c418"
|
| 50 |
+
cksum_signify_darwin_arm64="89513c94add01ef5e15fa4c3a171755cd3eb783f552b9d4a3dedd009fa89a062"
|
| 51 |
+
cksum_signify_darwin_x86_64="875ba2f6840bb705ed2346c9c3a165ee5fdfde559df4b9adfa0c6f915043eade"
|
| 52 |
+
cksum_signify_windows_x86_64="ebe1aa87a3eb87ed6769782a31916fab72bbdf0ced22d6ddd9a7a455e23e2c68"
|
| 53 |
+
# windows_x86 (32-bit) mlfront-signify is not published at signify_pkg_ver yet.
|
| 54 |
+
# Keep the slot maintained: the __ placeholder trips the not-provisioned guard
|
| 55 |
+
# in dk_verify_manifest until a real checksum is baked here (and dk0.cmd carries
|
| 56 |
+
# the matching x86 slot), so ./dk0 and .\dk0.cmd light up together.
|
| 57 |
+
cksum_signify_windows_x86="__CKSUM_SIGNIFY_WINDOWS_X86__"
|
| 58 |
+
DK_BASE_URL="${DK0_BASE_URL:-https://diskuv.com/dk}"
|
| 59 |
+
# ====================================================================================
|
| 60 |
+
|
| 61 |
+
dk_pwd=$PWD
|
| 62 |
+
|
| 63 |
+
# Get the dk project tree
|
| 64 |
+
DK_PROJECT_DIR=$(dirname "$0")
|
| 65 |
+
DK_PROJECT_DIR=$(cd "$DK_PROJECT_DIR" && pwd)
|
| 66 |
+
|
| 67 |
+
# --- Windows ---
|
| 68 |
+
# There is no shunt to dk0.cmd here. The block that used to live here required
|
| 69 |
+
# [ -x /usr/bin/cmd ], and no MSYS2, Cygwin, or Git Bash layout ships a `cmd` in
|
| 70 |
+
# /usr/bin, so it never fired on any host. This script handles Windows directly
|
| 71 |
+
# instead: autodetect_buildhost_arch resolves windows_x86_64 / windows_x86 via
|
| 72 |
+
# is_unixy_windows_build_machine, dk_extexe adds the .exe suffix, the data home
|
| 73 |
+
# below shares dk0.cmd's store, and MSYS converts POSIX paths in argv when
|
| 74 |
+
# exec'ing the native dk0.exe. A shunt could not be the whole answer anyway: a
|
| 75 |
+
# global install.sh install ships no dk0.cmd to shunt to.
|
| 76 |
+
|
| 77 |
+
# --- Quiet mode detection ---
|
| 78 |
+
DKCODER_QUIET=0
|
| 79 |
+
_DKEXE_OPTIONS=
|
| 80 |
+
run_maybe_quiet() {
|
| 81 |
+
"$@" >&2 # Always redirect stdout to stderr in this script
|
| 82 |
+
}
|
| 83 |
+
printf_maybe_quiet() {
|
| 84 |
+
# shellcheck disable=SC2059
|
| 85 |
+
printf "$@" >&2
|
| 86 |
+
}
|
| 87 |
+
|
| 88 |
+
# --- Launcher helpers (not from crossplatform-functions.sh) ---
|
| 89 |
+
|
| 90 |
+
# [dk_prog_path NAME] prints the path to NAME, or nothing when it is not
|
| 91 |
+
# installed. Absolute locations first, so the hardened Linux/macOS behavior is
|
| 92 |
+
# unchanged, then PATH. Git Bash (Git for Windows) ships curl at
|
| 93 |
+
# /mingw64/bin/curl and has no /usr/bin/curl or /bin/curl, so without the PATH
|
| 94 |
+
# fallback the launcher finds no downloader at all and every fetch fails.
|
| 95 |
+
# ci/dist/install.sh already resolves curl/wget through PATH for the same reason.
|
| 96 |
+
# This does not weaken the trust model: the mlfront-signify verifier is pinned by
|
| 97 |
+
# the SHA-256 baked above, the manifest is signify-verified, and every binary is
|
| 98 |
+
# checked against a signed checksum, so a hostile PATH curl can deny service but
|
| 99 |
+
# cannot substitute an artifact.
|
| 100 |
+
# The `|| true` matters under `set -e`: `command -v` exits nonzero for a missing
|
| 101 |
+
# program, and a bare assignment would propagate that status and abort the script.
|
| 102 |
+
dk_prog_path() {
|
| 103 |
+
if [ -x "/usr/bin/$1" ]; then printf '%s' "/usr/bin/$1"
|
| 104 |
+
elif [ -x "/bin/$1" ]; then printf '%s' "/bin/$1"
|
| 105 |
+
else command -v "$1" 2>/dev/null || true
|
| 106 |
+
fi
|
| 107 |
+
}
|
| 108 |
+
|
| 109 |
+
# Every download path funnels here when neither curl nor wget resolved. Name what
|
| 110 |
+
# was searched and the escape hatch; a bare "not available" leaves the reader with
|
| 111 |
+
# nothing to act on.
|
| 112 |
+
dk_no_downloader() {
|
| 113 |
+
echo "FATAL: no curl or wget found (searched /usr/bin, /bin, then PATH)" >&2
|
| 114 |
+
echo " ...: install curl or wget, or set DKMLSYS_CURL=/full/path/to/curl" >&2
|
| 115 |
+
exit 107
|
| 116 |
+
}
|
| 117 |
+
|
| 118 |
+
# --- Imports of dkml-runtime-common's crossplatform-functions.sh ---
|
| 119 |
+
# Changes:
|
| 120 |
+
# 1. In download_file() use [ "${DKCODER_QUIET:-}" -eq 1 ]
|
| 121 |
+
# 2. In log_trace() replace non-FATAL `printf ... >&2` with `printf_maybe_quiet ...`
|
| 122 |
+
# 3. In sha256check() all shasum/* use --quiet option (this should be upstreamed)
|
| 123 |
+
# 4. In autodetect_system_binaries() curl and wget resolve through dk_prog_path
|
| 124 |
+
# (above), which falls back to PATH when the absolute locations miss
|
| 125 |
+
|
| 126 |
+
# Get standard locations of Unix system binaries like `/usr/bin/mv` (or `/bin/mv`).
|
| 127 |
+
#
|
| 128 |
+
# Will not return anything in `/usr/local/bin` or `/usr/sbin`. Use when you do not
|
| 129 |
+
# know whether the PATH has been set correctly, or when you do not know if the
|
| 130 |
+
# system binary exists.
|
| 131 |
+
#
|
| 132 |
+
# At some point in the future, this function will error out if the required system binaries
|
| 133 |
+
# do not exist. Most system binaries are common to all Unix/Linux/macOS installations but
|
| 134 |
+
# some (like `comm`) may need to be installed for proper functioning of DKML.
|
| 135 |
+
#
|
| 136 |
+
# Outputs:
|
| 137 |
+
# - env:DKMLSYS_MV - Location of `mv`
|
| 138 |
+
# - env:DKMLSYS_CHMOD - Location of `chmod`
|
| 139 |
+
# - env:DKMLSYS_UNAME - Location of `uname`
|
| 140 |
+
# - env:DKMLSYS_ENV - Location of `env`
|
| 141 |
+
# - env:DKMLSYS_AWK - Location of `awk`
|
| 142 |
+
# - env:DKMLSYS_SED - Location of `sed`
|
| 143 |
+
# - env:DKMLSYS_COMM - Location of `comm`
|
| 144 |
+
# - env:DKMLSYS_INSTALL - Location of `install`
|
| 145 |
+
# - env:DKMLSYS_RM - Location of `rm`
|
| 146 |
+
# - env:DKMLSYS_SORT - Location of `sort`
|
| 147 |
+
# - env:DKMLSYS_CAT - Location of `cat`
|
| 148 |
+
# - env:DKMLSYS_STAT - Location of `stat`
|
| 149 |
+
# - env:DKMLSYS_GREP - Location of `grep`
|
| 150 |
+
# - env:DKMLSYS_CURL - Location of `curl` (empty if not found)
|
| 151 |
+
# - env:DKMLSYS_WGET - Location of `wget` (empty if not found)
|
| 152 |
+
# - env:DKMLSYS_TR - Location of `tr`
|
| 153 |
+
autodetect_system_binaries() {
|
| 154 |
+
if [ -z "${DKMLSYS_MV:-}" ]; then
|
| 155 |
+
if [ -x /usr/bin/mv ]; then
|
| 156 |
+
DKMLSYS_MV=/usr/bin/mv
|
| 157 |
+
else
|
| 158 |
+
DKMLSYS_MV=/bin/mv
|
| 159 |
+
fi
|
| 160 |
+
fi
|
| 161 |
+
if [ -z "${DKMLSYS_CHMOD:-}" ]; then
|
| 162 |
+
if [ -x /usr/bin/chmod ]; then
|
| 163 |
+
DKMLSYS_CHMOD=/usr/bin/chmod
|
| 164 |
+
else
|
| 165 |
+
DKMLSYS_CHMOD=/bin/chmod
|
| 166 |
+
fi
|
| 167 |
+
fi
|
| 168 |
+
if [ -z "${DKMLSYS_UNAME:-}" ]; then
|
| 169 |
+
if [ -x /usr/bin/uname ]; then
|
| 170 |
+
DKMLSYS_UNAME=/usr/bin/uname
|
| 171 |
+
else
|
| 172 |
+
DKMLSYS_UNAME=/bin/uname
|
| 173 |
+
fi
|
| 174 |
+
fi
|
| 175 |
+
if [ -z "${DKMLSYS_ENV:-}" ]; then
|
| 176 |
+
if [ -x /usr/bin/env ]; then
|
| 177 |
+
DKMLSYS_ENV=/usr/bin/env
|
| 178 |
+
else
|
| 179 |
+
DKMLSYS_ENV=/bin/env
|
| 180 |
+
fi
|
| 181 |
+
fi
|
| 182 |
+
if [ -z "${DKMLSYS_AWK:-}" ]; then
|
| 183 |
+
if [ -x /usr/bin/awk ]; then
|
| 184 |
+
DKMLSYS_AWK=/usr/bin/awk
|
| 185 |
+
else
|
| 186 |
+
DKMLSYS_AWK=/bin/awk
|
| 187 |
+
fi
|
| 188 |
+
fi
|
| 189 |
+
if [ -z "${DKMLSYS_SED:-}" ]; then
|
| 190 |
+
if [ -x /usr/bin/sed ]; then
|
| 191 |
+
DKMLSYS_SED=/usr/bin/sed
|
| 192 |
+
else
|
| 193 |
+
DKMLSYS_SED=/bin/sed
|
| 194 |
+
fi
|
| 195 |
+
fi
|
| 196 |
+
if [ -z "${DKMLSYS_COMM:-}" ]; then
|
| 197 |
+
if [ -x /usr/bin/comm ]; then
|
| 198 |
+
DKMLSYS_COMM=/usr/bin/comm
|
| 199 |
+
else
|
| 200 |
+
DKMLSYS_COMM=/bin/comm
|
| 201 |
+
fi
|
| 202 |
+
fi
|
| 203 |
+
if [ -z "${DKMLSYS_INSTALL:-}" ]; then
|
| 204 |
+
if [ -x /usr/bin/install ]; then
|
| 205 |
+
DKMLSYS_INSTALL=/usr/bin/install
|
| 206 |
+
else
|
| 207 |
+
DKMLSYS_INSTALL=/bin/install
|
| 208 |
+
fi
|
| 209 |
+
fi
|
| 210 |
+
if [ -z "${DKMLSYS_RM:-}" ]; then
|
| 211 |
+
if [ -x /usr/bin/rm ]; then
|
| 212 |
+
DKMLSYS_RM=/usr/bin/rm
|
| 213 |
+
else
|
| 214 |
+
DKMLSYS_RM=/bin/rm
|
| 215 |
+
fi
|
| 216 |
+
fi
|
| 217 |
+
if [ -z "${DKMLSYS_SORT:-}" ]; then
|
| 218 |
+
if [ -x /usr/bin/sort ]; then
|
| 219 |
+
DKMLSYS_SORT=/usr/bin/sort
|
| 220 |
+
else
|
| 221 |
+
DKMLSYS_SORT=/bin/sort
|
| 222 |
+
fi
|
| 223 |
+
fi
|
| 224 |
+
if [ -z "${DKMLSYS_CAT:-}" ]; then
|
| 225 |
+
if [ -x /usr/bin/cat ]; then
|
| 226 |
+
DKMLSYS_CAT=/usr/bin/cat
|
| 227 |
+
else
|
| 228 |
+
DKMLSYS_CAT=/bin/cat
|
| 229 |
+
fi
|
| 230 |
+
fi
|
| 231 |
+
if [ -z "${DKMLSYS_STAT:-}" ]; then
|
| 232 |
+
if [ -x /usr/bin/stat ]; then
|
| 233 |
+
DKMLSYS_STAT=/usr/bin/stat
|
| 234 |
+
else
|
| 235 |
+
DKMLSYS_STAT=/bin/stat
|
| 236 |
+
fi
|
| 237 |
+
fi
|
| 238 |
+
if [ -z "${DKMLSYS_GREP:-}" ]; then
|
| 239 |
+
if [ -x /usr/bin/grep ]; then
|
| 240 |
+
DKMLSYS_GREP=/usr/bin/grep
|
| 241 |
+
else
|
| 242 |
+
DKMLSYS_GREP=/bin/grep
|
| 243 |
+
fi
|
| 244 |
+
fi
|
| 245 |
+
if [ -z "${DKMLSYS_CURL:-}" ]; then DKMLSYS_CURL=$(dk_prog_path curl); fi
|
| 246 |
+
if [ -z "${DKMLSYS_WGET:-}" ]; then DKMLSYS_WGET=$(dk_prog_path wget); fi
|
| 247 |
+
if [ -z "${DKMLSYS_TR:-}" ]; then
|
| 248 |
+
if [ -x /usr/bin/tr ]; then
|
| 249 |
+
DKMLSYS_TR=/usr/bin/tr
|
| 250 |
+
else
|
| 251 |
+
DKMLSYS_TR=/bin/tr
|
| 252 |
+
fi
|
| 253 |
+
fi
|
| 254 |
+
export DKMLSYS_MV DKMLSYS_CHMOD DKMLSYS_UNAME DKMLSYS_ENV DKMLSYS_AWK DKMLSYS_SED DKMLSYS_COMM DKMLSYS_INSTALL
|
| 255 |
+
export DKMLSYS_RM DKMLSYS_SORT DKMLSYS_CAT DKMLSYS_STAT DKMLSYS_GREP DKMLSYS_CURL DKMLSYS_WGET DKMLSYS_TR
|
| 256 |
+
}
|
| 257 |
+
|
| 258 |
+
# Is a Windows build machine if we are in a MSYS2 or Cygwin environment.
|
| 259 |
+
#
|
| 260 |
+
# Better alternatives
|
| 261 |
+
# -------------------
|
| 262 |
+
#
|
| 263 |
+
# 1. If you are checking to see if you should do a cygpath, then just guard it
|
| 264 |
+
# like so:
|
| 265 |
+
# if [ -x /usr/bin/cygpath ]; then
|
| 266 |
+
# do_something $(/usr/bin/cygpath ...) ...
|
| 267 |
+
# fi
|
| 268 |
+
# This clearly guards what you are about to do (cygpath) with what you will
|
| 269 |
+
# need (cygpath).
|
| 270 |
+
# 2. is_arg_windows_platform
|
| 271 |
+
is_unixy_windows_build_machine() {
|
| 272 |
+
if is_msys2_msys_build_machine || is_cygwin_build_machine; then
|
| 273 |
+
return 0
|
| 274 |
+
fi
|
| 275 |
+
return 1
|
| 276 |
+
}
|
| 277 |
+
|
| 278 |
+
# Is a MSYS2 environment with the MSYS or MINGW64 subsystem?
|
| 279 |
+
# * MSYS2 can also do MinGW 32-bit and 64-bit subsystems. Used by Diskuv OCaml
|
| 280 |
+
# * MINGW64 used by Git Bash (aka. GitHub Actions `shell: bash`)
|
| 281 |
+
# https://www.msys2.org/docs/environments/
|
| 282 |
+
is_msys2_msys_build_machine() {
|
| 283 |
+
if [ -e /usr/bin/msys-2.0.dll ] && {
|
| 284 |
+
[ "${MSYSTEM:-}" = "MSYS" ] || [ "${MSYSTEM:-}" = "MINGW64" ] || [ "${MSYSTEM:-}" = "UCRT64" ] || [ "${MSYSTEM:-}" = "CLANG64" ] || [ "${MSYSTEM:-}" = "MINGW32" ] || [ "${MSYSTEM:-}" = "CLANG32" ] || [ "${MSYSTEM:-}" = "CLANGARM64" ]
|
| 285 |
+
}; then
|
| 286 |
+
return 0
|
| 287 |
+
fi
|
| 288 |
+
return 1
|
| 289 |
+
}
|
| 290 |
+
|
| 291 |
+
is_cygwin_build_machine() {
|
| 292 |
+
if [ -e /usr/bin/cygwin1.dll ]; then
|
| 293 |
+
return 0
|
| 294 |
+
fi
|
| 295 |
+
return 1
|
| 296 |
+
}
|
| 297 |
+
|
| 298 |
+
# Tries to find the host ABI.
|
| 299 |
+
#
|
| 300 |
+
# Beware: This function uses `uname` probing may be inaccurate for dual-arch
|
| 301 |
+
# CPUs like Apple Silicon with Rosetta.
|
| 302 |
+
#
|
| 303 |
+
# Inputs:
|
| 304 |
+
# - env:DKML_HOST_ABI - Optional but recommended. If set, then BUILDHOST_ARCH will be set to the same.
|
| 305 |
+
#
|
| 306 |
+
# Outputs:
|
| 307 |
+
# - env:BUILDHOST_ARCH will contain the host ABI.
|
| 308 |
+
autodetect_buildhost_arch() {
|
| 309 |
+
if [ -n "${DKML_HOST_ABI:-}" ]; then
|
| 310 |
+
BUILDHOST_ARCH=$DKML_HOST_ABI
|
| 311 |
+
else
|
| 312 |
+
# Set DKMLSYS_*
|
| 313 |
+
autodetect_system_binaries
|
| 314 |
+
|
| 315 |
+
autodetect_buildhost_arch_SYSTEM=$("$DKMLSYS_UNAME" -s)
|
| 316 |
+
autodetect_buildhost_arch_MACHINE=$("$DKMLSYS_UNAME" -m)
|
| 317 |
+
# list from https://en.wikipedia.org/wiki/Uname and https://stackoverflow.com/questions/45125516/possible-values-for-uname-m
|
| 318 |
+
case "${autodetect_buildhost_arch_SYSTEM}-${autodetect_buildhost_arch_MACHINE}" in
|
| 319 |
+
Linux-armv7*)
|
| 320 |
+
BUILDHOST_ARCH=linux_arm32v7;;
|
| 321 |
+
Linux-armv6* | Linux-arm)
|
| 322 |
+
BUILDHOST_ARCH=linux_arm32v6;;
|
| 323 |
+
Linux-aarch64 | Linux-arm64 | Linux-armv8*)
|
| 324 |
+
BUILDHOST_ARCH=linux_arm64;;
|
| 325 |
+
Linux-i386 | Linux-i686)
|
| 326 |
+
BUILDHOST_ARCH=linux_x86;;
|
| 327 |
+
Linux-x86_64)
|
| 328 |
+
BUILDHOST_ARCH=linux_x86_64
|
| 329 |
+
# uname -m reports the KERNEL machine, so a 32-bit userland on
|
| 330 |
+
# a 64-bit kernel (ex. an i386 container on an amd64 host)
|
| 331 |
+
# still says x86_64 -- but a 64-bit dk0 cannot run there. The
|
| 332 |
+
# userland's own ELF class is the truth: byte 5 of /bin/sh is
|
| 333 |
+
# 1 for ELFCLASS32. od(1) is POSIX but not guaranteed present;
|
| 334 |
+
# without it, or on a 64-bit userland, the kernel's answer
|
| 335 |
+
# stands. test's numeric -eq tolerates od's leading
|
| 336 |
+
# whitespace; the redirected test guards non-numeric output.
|
| 337 |
+
autodetect_buildhost_arch_ELFCLASS=
|
| 338 |
+
if command -v od >/dev/null 2>&1; then
|
| 339 |
+
autodetect_buildhost_arch_ELFCLASS=$(od -An -td1 -j4 -N1 /bin/sh 2>/dev/null)
|
| 340 |
+
fi
|
| 341 |
+
if [ "${autodetect_buildhost_arch_ELFCLASS:-2}" -eq 1 ] 2>/dev/null; then
|
| 342 |
+
BUILDHOST_ARCH=linux_x86
|
| 343 |
+
# musl-based Linux (ex. alpine) is not a supported dk0 ABI yet;
|
| 344 |
+
# there is no musl dk0 build. Fail fast with a clear message
|
| 345 |
+
# instead of reaching a confusing "not provisioned" error later.
|
| 346 |
+
# A user who knows better can still force DKML_HOST_ABI. The musl
|
| 347 |
+
# dynamic loader path is the reliable marker; musl's ldd
|
| 348 |
+
# identifying itself is the fallback.
|
| 349 |
+
elif [ -e /lib/ld-musl-x86_64.so.1 ] \
|
| 350 |
+
|| { ldd --version 2>&1 | grep -qi musl; } 2>/dev/null; then
|
| 351 |
+
printf "%s\n" "FATAL: musl-based Linux (e.g. Alpine) is not supported yet; dk0 needs a glibc-based distro" >&2
|
| 352 |
+
exit 1
|
| 353 |
+
fi
|
| 354 |
+
;;
|
| 355 |
+
Darwin-arm64)
|
| 356 |
+
BUILDHOST_ARCH=darwin_arm64;;
|
| 357 |
+
Darwin-x86_64)
|
| 358 |
+
BUILDHOST_ARCH=darwin_x86_64;;
|
| 359 |
+
*-i386 | *-i686)
|
| 360 |
+
if is_unixy_windows_build_machine; then
|
| 361 |
+
BUILDHOST_ARCH=windows_x86
|
| 362 |
+
else
|
| 363 |
+
printf "%s\n" "FATAL: Unsupported build machine type obtained from 'uname -s' and 'uname -m': $autodetect_buildhost_arch_SYSTEM and $autodetect_buildhost_arch_MACHINE" >&2
|
| 364 |
+
exit 1
|
| 365 |
+
fi
|
| 366 |
+
;;
|
| 367 |
+
*-x86_64)
|
| 368 |
+
if is_unixy_windows_build_machine; then
|
| 369 |
+
BUILDHOST_ARCH=windows_x86_64
|
| 370 |
+
else
|
| 371 |
+
printf "%s\n" "FATAL: Unsupported build machine type obtained from 'uname -s' and 'uname -m': $autodetect_buildhost_arch_SYSTEM and $autodetect_buildhost_arch_MACHINE" >&2
|
| 372 |
+
exit 1
|
| 373 |
+
fi
|
| 374 |
+
;;
|
| 375 |
+
*)
|
| 376 |
+
# Since:
|
| 377 |
+
# 1) MSYS2 does not run on ARM/ARM64 (https://www.msys2.org/docs/environments/)
|
| 378 |
+
# 2) MSVC does not use ARM/ARM64 as host machine (https://docs.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=msvc-160)
|
| 379 |
+
# we do not support Windows ARM/ARM64 as a build machine
|
| 380 |
+
printf "%s\n" "FATAL: Unsupported build machine type obtained from 'uname -s' and 'uname -m': $autodetect_buildhost_arch_SYSTEM and $autodetect_buildhost_arch_MACHINE" >&2
|
| 381 |
+
exit 1
|
| 382 |
+
;;
|
| 383 |
+
esac
|
| 384 |
+
fi
|
| 385 |
+
}
|
| 386 |
+
|
| 387 |
+
# A function that will try to print an ISO8601 timestamp, but will fallback to
|
| 388 |
+
# the system default. Always uses UTC timezone.
|
| 389 |
+
try_iso8601_timestamp() {
|
| 390 |
+
date -u -Iseconds 2>/dev/null || TZ=UTC date
|
| 391 |
+
}
|
| 392 |
+
|
| 393 |
+
# A function that will print the command and possibly time it (if and only if it uses a full path to
|
| 394 |
+
# an executable, so that 'time' does not fail on internal shell functions).
|
| 395 |
+
# If --return-error-code is the first argument or LOG_TRACE_RETURN_ERROR_CODE=ON, then instead of exiting the
|
| 396 |
+
# function will return the error code.
|
| 397 |
+
log_trace() {
|
| 398 |
+
log_trace_RETURN=${LOG_TRACE_RETURN_ERROR_CODE:-OFF}
|
| 399 |
+
|
| 400 |
+
log_trace_1="$1"
|
| 401 |
+
if [ "$log_trace_1" = "--return-error-code" ]; then
|
| 402 |
+
shift
|
| 403 |
+
log_trace_RETURN=ON
|
| 404 |
+
fi
|
| 405 |
+
|
| 406 |
+
if [ "${DKML_BUILD_TRACE:-OFF}" = ON ]; then
|
| 407 |
+
printf_maybe_quiet "[%s] %s\n" "$(try_iso8601_timestamp)" "+ $*"
|
| 408 |
+
if [ -x "$1" ]; then
|
| 409 |
+
time "$@"
|
| 410 |
+
else
|
| 411 |
+
"$@"
|
| 412 |
+
fi
|
| 413 |
+
else
|
| 414 |
+
# use judgement so we essentially have log at an INFO level
|
| 415 |
+
case "$1" in
|
| 416 |
+
rm|cp)
|
| 417 |
+
# debug level. only show when DKML_BUILD_TRACE=ON
|
| 418 |
+
;;
|
| 419 |
+
git|make|ocaml_configure|ocaml_make|make_host|make_target)
|
| 420 |
+
# info level. and can show entire command without polluting the screen
|
| 421 |
+
printf_maybe_quiet "[%s] %s\n" "$(try_iso8601_timestamp)" "$*"
|
| 422 |
+
;;
|
| 423 |
+
*) printf_maybe_quiet "[%s] %s\n" "$(try_iso8601_timestamp)" "$1"
|
| 424 |
+
esac
|
| 425 |
+
"$@"
|
| 426 |
+
fi
|
| 427 |
+
log_trace_ec="$?"
|
| 428 |
+
if [ "$log_trace_ec" -ne 0 ]; then
|
| 429 |
+
if [ "$log_trace_RETURN" = ON ]; then
|
| 430 |
+
return "$log_trace_ec"
|
| 431 |
+
else
|
| 432 |
+
printf "FATAL: Command failed with exit code %s: %s\n" "$log_trace_ec" "$*" >&2
|
| 433 |
+
exit "$log_trace_ec"
|
| 434 |
+
fi
|
| 435 |
+
fi
|
| 436 |
+
}
|
| 437 |
+
|
| 438 |
+
# [sha256compute FILE] writes the SHA256 checksum (hex encoded) of file FILE to the standard output.
|
| 439 |
+
sha256compute() {
|
| 440 |
+
sha256compute_FILE="$1"
|
| 441 |
+
shift
|
| 442 |
+
# For reasons unclear doing the following in MSYS2:
|
| 443 |
+
# sha256sum 'Z:\source\README.md'
|
| 444 |
+
# will produce a backslash like:
|
| 445 |
+
# \5518c76ed7234a153941fb7bc94b6e91d9cb8f1c4e22daf169a59b5878c3fc8a *Z:\\source\\README.md
|
| 446 |
+
# So always cygpath the filename if available
|
| 447 |
+
if [ -x /usr/bin/cygpath ]; then
|
| 448 |
+
sha256compute_FILE=$(/usr/bin/cygpath -a "$sha256compute_FILE")
|
| 449 |
+
fi
|
| 450 |
+
|
| 451 |
+
autodetect_system_binaries
|
| 452 |
+
if [ -x /usr/bin/shasum ]; then # macOS, OpenBSD, Debian
|
| 453 |
+
# CODESITE #1 (duplicates elsewhere).
|
| 454 |
+
# On Debian shasum is a perl script, and perl needs locale settings or it will complain.
|
| 455 |
+
# Confer: https://www.thomas-krenn.com/en/wiki/Perl_warning_Setting_locale_failed_in_Debian
|
| 456 |
+
# Confer: https://stackoverflow.com/a/52004330/21513816
|
| 457 |
+
# shellcheck disable=SC2016
|
| 458 |
+
LC_ALL=C /usr/bin/shasum -a 256 "$sha256compute_FILE" | "$DKMLSYS_AWK" '{print $1}'
|
| 459 |
+
elif [ -x /usr/bin/sha256sum ]; then # Linux, MSYS2
|
| 460 |
+
# shellcheck disable=SC2016
|
| 461 |
+
/usr/bin/sha256sum "$sha256compute_FILE" | "$DKMLSYS_AWK" '{print $1}'
|
| 462 |
+
elif [ -x /sbin/sha256 ]; then # FreeBSD
|
| 463 |
+
# shellcheck disable=SC2016
|
| 464 |
+
/sbin/sha256 -r "$sha256compute_FILE" | "$DKMLSYS_AWK" '{print $1}'
|
| 465 |
+
else
|
| 466 |
+
printf "FATAL: %s\n" "No sha256 checksum utility found" >&2
|
| 467 |
+
exit 107
|
| 468 |
+
fi
|
| 469 |
+
}
|
| 470 |
+
|
| 471 |
+
# [sha256check FILE SUM] checks that the file FILE has a SHA256 checksum (hex encoded) of SUM.
|
| 472 |
+
# The function will return nonzero (and exit with failure if `set -e` is enabled) if the checksum does not match.
|
| 473 |
+
sha256check() {
|
| 474 |
+
sha256check_FILE="$1"
|
| 475 |
+
shift
|
| 476 |
+
sha256check_SUM="$1"
|
| 477 |
+
shift
|
| 478 |
+
|
| 479 |
+
if [ -x /usr/bin/shasum ]; then # macOS, OpenBSD, Debian
|
| 480 |
+
# CODESITE #1 (duplicates elsewhere).
|
| 481 |
+
# On Debian shasum is a perl script, and perl needs locale settings or it will complain.
|
| 482 |
+
# Confer: https://www.thomas-krenn.com/en/wiki/Perl_warning_Setting_locale_failed_in_Debian
|
| 483 |
+
# Confer: https://stackoverflow.com/a/52004330/21513816
|
| 484 |
+
# Note: shasum 5.96 (ex. conanio/gcc7:1.64.1) has no --quiet option.
|
| 485 |
+
# shellcheck disable=SC2016
|
| 486 |
+
printf "%s %s" "$sha256check_SUM" "$sha256check_FILE" | LC_ALL=C /usr/bin/shasum -a 256 -c >&2
|
| 487 |
+
elif [ -x /usr/bin/sha256sum ]; then # Linux, MSYS2
|
| 488 |
+
# Note: BusyBox v1.35.0 sha256sum has no --quiet option.
|
| 489 |
+
printf "%s %s" "$sha256check_SUM" "$sha256check_FILE" | /usr/bin/sha256sum -c >&2
|
| 490 |
+
elif [ -x /sbin/sha256 ]; then # FreeBSD
|
| 491 |
+
/sbin/sha256 --quiet -c "$sha256check_SUM" "$sha256check_FILE" >&2
|
| 492 |
+
else
|
| 493 |
+
printf "FATAL: %s\n" "No sha256 checksum utility found" >&2
|
| 494 |
+
|
| 495 |
+
# REMOVEME!
|
| 496 |
+
if [ -d /sbin ]; then printf "/sbin:\n" >&2; ls /sbin >&2; fi
|
| 497 |
+
if [ -d /usr/sbin ]; then printf "/usr/sbin:\n" >&2; ls /usr/sbin >&2; fi
|
| 498 |
+
if [ -d /bin ]; then printf "/bin:\n" >&2; ls /bin >&2; fi
|
| 499 |
+
if [ -d /usr/bin ]; then printf "/usr/bin:\n" >&2; ls /usr/bin >&2; fi
|
| 500 |
+
|
| 501 |
+
exit 107
|
| 502 |
+
fi
|
| 503 |
+
}
|
| 504 |
+
|
| 505 |
+
# Echo --https-only if this wget supports it (BusyBox wget does not), so a
|
| 506 |
+
# redirect cannot downgrade the transfer off HTTPS wherever the option exists.
|
| 507 |
+
dk_wget_https_only() {
|
| 508 |
+
if "$DKMLSYS_WGET" --help 2>&1 | grep -q -- --https-only; then printf '%s' '--https-only'; fi
|
| 509 |
+
}
|
| 510 |
+
|
| 511 |
+
# [downloadfile URL FILE SUM] downloads from URL into FILE and verifies the SHA256 checksum of SUM.
|
| 512 |
+
# If the FILE already exists with the correct checksum it is not redownloaded.
|
| 513 |
+
# The function will exit with failure if the checksum does not match.
|
| 514 |
+
# curl pins HTTPS end to end (--proto '=https' + --proto-redir '=https') with a
|
| 515 |
+
# TLS 1.2 floor, and -f fails on an HTTP error page instead of saving it.
|
| 516 |
+
downloadfile() {
|
| 517 |
+
downloadfile_URL="$1"
|
| 518 |
+
shift
|
| 519 |
+
downloadfile_FILE="$1"
|
| 520 |
+
shift
|
| 521 |
+
downloadfile_SUM="$1"
|
| 522 |
+
shift
|
| 523 |
+
|
| 524 |
+
# Set DKMLSYS_*
|
| 525 |
+
autodetect_system_binaries
|
| 526 |
+
|
| 527 |
+
# Quick exit if exists and checksum verified. Do not display
|
| 528 |
+
# anything (even the checksum output) since this is the normal scenario
|
| 529 |
+
# that can run a billion times. The checksum verification for the
|
| 530 |
+
# download (if this fails) will not be silenced.
|
| 531 |
+
if [ -e "$downloadfile_FILE" ]; then
|
| 532 |
+
if sha256check "$downloadfile_FILE" "$downloadfile_SUM" > /dev/null 2>&1; then
|
| 533 |
+
return 0
|
| 534 |
+
else
|
| 535 |
+
$DKMLSYS_RM -f "$downloadfile_FILE"
|
| 536 |
+
fi
|
| 537 |
+
fi
|
| 538 |
+
|
| 539 |
+
printf_maybe_quiet "... %s %s\n" "Downloading" "$downloadfile_URL"
|
| 540 |
+
if [ "${CI:-}" = true ] || [ "${DKCODER_QUIET:-}" -eq 1 ]; then
|
| 541 |
+
if [ -n "$DKMLSYS_CURL" ]; then
|
| 542 |
+
log_trace "$DKMLSYS_CURL" --proto '=https' --proto-redir '=https' --tlsv1.2 -fsSL "$downloadfile_URL" -o "$downloadfile_FILE".tmp
|
| 543 |
+
elif [ -n "$DKMLSYS_WGET" ]; then
|
| 544 |
+
# shellcheck disable=SC2046 # prints one flag or nothing; must expand to zero words
|
| 545 |
+
log_trace "$DKMLSYS_WGET" $(dk_wget_https_only) -q -O "$downloadfile_FILE".tmp "$downloadfile_URL"
|
| 546 |
+
else
|
| 547 |
+
dk_no_downloader
|
| 548 |
+
fi
|
| 549 |
+
else
|
| 550 |
+
if [ -n "$DKMLSYS_CURL" ]; then
|
| 551 |
+
log_trace "$DKMLSYS_CURL" --proto '=https' --proto-redir '=https' --tlsv1.2 -fL "$downloadfile_URL" -o "$downloadfile_FILE".tmp
|
| 552 |
+
elif [ -n "$DKMLSYS_WGET" ]; then
|
| 553 |
+
# shellcheck disable=SC2046 # prints one flag or nothing; must expand to zero words
|
| 554 |
+
log_trace "$DKMLSYS_WGET" $(dk_wget_https_only) -O "$downloadfile_FILE".tmp "$downloadfile_URL"
|
| 555 |
+
else
|
| 556 |
+
dk_no_downloader
|
| 557 |
+
fi
|
| 558 |
+
fi
|
| 559 |
+
printf_maybe_quiet "\n... %s %s\n" "Verifying" "$downloadfile_URL"
|
| 560 |
+
if ! sha256check "$downloadfile_FILE".tmp "$downloadfile_SUM"; then
|
| 561 |
+
printf "%s\n" "FATAL: Encountered a corrupted or compromised download from $downloadfile_URL" >&2
|
| 562 |
+
exit 1
|
| 563 |
+
fi
|
| 564 |
+
printf_maybe_quiet "\n"
|
| 565 |
+
$DKMLSYS_MV "$downloadfile_FILE".tmp "$downloadfile_FILE"
|
| 566 |
+
}
|
| 567 |
+
|
| 568 |
+
# End import
|
| 569 |
+
# ---------------------------------------------------------------------------
|
| 570 |
+
|
| 571 |
+
# --- Environment detection ---
|
| 572 |
+
|
| 573 |
+
# Set DKMLSYS_*
|
| 574 |
+
autodetect_system_binaries
|
| 575 |
+
|
| 576 |
+
# Find host ABI. Set in BUILDHOST_ARCH
|
| 577 |
+
autodetect_buildhost_arch
|
| 578 |
+
|
| 579 |
+
# --- data home ---
|
| 580 |
+
|
| 581 |
+
tools_dir=
|
| 582 |
+
tools_name=dk0
|
| 583 |
+
# 1. Check DKCODER_DATA_HOME environment variable.
|
| 584 |
+
if [ -z "$tools_dir" ] && [ -n "${DKCODER_DATA_HOME:-}" ]; then
|
| 585 |
+
install -d "$DKCODER_DATA_HOME"
|
| 586 |
+
tools_dir="$DKCODER_DATA_HOME"
|
| 587 |
+
fi
|
| 588 |
+
# 2. Check if CI since many CI providers can only cache content in a subdirectory
|
| 589 |
+
# of the project.
|
| 590 |
+
if [ -z "$tools_dir" ] && [ "${CI:-}" = true ]; then
|
| 591 |
+
install -d "$DK_PROJECT_DIR/.z-dk/tools"
|
| 592 |
+
tools_dir="$DK_PROJECT_DIR/.z-dk/tools"
|
| 593 |
+
fi
|
| 594 |
+
# 2b. On Windows (Git Bash / MSYS2 / Cygwin) use the SAME store as dk0.cmd,
|
| 595 |
+
# %LOCALAPPDATA%\Programs\dk0, so a project driven from both PowerShell and
|
| 596 |
+
# a POSIX shell shares one cache instead of downloading every build twice.
|
| 597 |
+
# This sits after the CI check on purpose: dk0.cmd has no CI branch, but a
|
| 598 |
+
# Windows CI job driving ./dk0 from bash still wants the in-project cache.
|
| 599 |
+
# LOCALAPPDATA holds a native Windows path (MSYS does not convert
|
| 600 |
+
# environment variables), so cygpath it; needing cygpath also scopes this
|
| 601 |
+
# to MSYS/Cygwin.
|
| 602 |
+
if [ -z "$tools_dir" ] && [ -n "${COMSPEC:-}" ] && [ -n "${LOCALAPPDATA:-}" ] && [ -x /usr/bin/cygpath ]; then
|
| 603 |
+
tools_dir_LOCALAPPDATA=$(/usr/bin/cygpath -au "$LOCALAPPDATA")
|
| 604 |
+
if [ -w "$tools_dir_LOCALAPPDATA" ]; then
|
| 605 |
+
install -d "$tools_dir_LOCALAPPDATA/Programs/$tools_name"
|
| 606 |
+
tools_dir="$tools_dir_LOCALAPPDATA/Programs/$tools_name"
|
| 607 |
+
fi
|
| 608 |
+
fi
|
| 609 |
+
# 3. Check in locations rooted under /opt/diskuv
|
| 610 |
+
# We look under a /opt/diskuv early because
|
| 611 |
+
# - Especially important for WSL2 to use a pure Linux filesystem (ext4) for
|
| 612 |
+
# best performance.
|
| 613 |
+
# - Using a canonical location (especially /opt/diskuv/usr/share) makes
|
| 614 |
+
# it easy to use CMake presets for non-Windows hosts.
|
| 615 |
+
if [ -z "$tools_dir" ] && [ -n "${XDG_DATA_HOME:-}" ] && [ -w "/opt/diskuv/$XDG_DATA_HOME" ]; then
|
| 616 |
+
install -d "/opt/diskuv/$XDG_DATA_HOME/$tools_name"
|
| 617 |
+
tools_dir="/opt/diskuv/$XDG_DATA_HOME/$tools_name"
|
| 618 |
+
fi
|
| 619 |
+
if [ -z "$tools_dir" ] && [ -n "${HOME:-}" ] && [ -w "/opt/diskuv/$HOME" ]; then
|
| 620 |
+
install -d "/opt/diskuv/$HOME/.local/share/$tools_name"
|
| 621 |
+
tools_dir="/opt/diskuv/$HOME/.local/share/$tools_name"
|
| 622 |
+
fi
|
| 623 |
+
if [ -z "$tools_dir" ] && [ -w "/opt/diskuv/usr/share" ]; then
|
| 624 |
+
install -d "/opt/diskuv/usr/share/$tools_name"
|
| 625 |
+
tools_dir="/opt/diskuv/usr/share/$tools_name"
|
| 626 |
+
fi
|
| 627 |
+
# 4. Check in the conventional locations rooted under /
|
| 628 |
+
if [ -z "$tools_dir" ] && [ -n "${XDG_DATA_HOME:-}" ] && [ -w "$XDG_DATA_HOME" ]; then
|
| 629 |
+
install -d "$XDG_DATA_HOME/$tools_name"
|
| 630 |
+
tools_dir="$XDG_DATA_HOME/$tools_name"
|
| 631 |
+
fi
|
| 632 |
+
if [ -z "$tools_dir" ] && [ -n "${HOME:-}" ] && [ -w "$HOME" ]; then
|
| 633 |
+
install -d "$HOME/.local/share/$tools_name"
|
| 634 |
+
tools_dir="$HOME/.local/share/$tools_name"
|
| 635 |
+
fi
|
| 636 |
+
# 5. Validate
|
| 637 |
+
if [ -z "$tools_dir" ]; then
|
| 638 |
+
echo "FATAL: Could not find a location to install DkCoder." >&2
|
| 639 |
+
echo " ...: Make sure you have a home directory and that it is write-able, or define" >&2
|
| 640 |
+
echo " ...: the environment variable XDG_DATA_HOME in a shell profile script after" >&2
|
| 641 |
+
echo " ...: creating the \$XDG_DATA_HOME directory." >&2
|
| 642 |
+
exit 2
|
| 643 |
+
fi
|
| 644 |
+
|
| 645 |
+
# --- Tool downloads and installs ---
|
| 646 |
+
|
| 647 |
+
# PREREQS
|
| 648 |
+
# -------
|
| 649 |
+
|
| 650 |
+
install_linux_prog() {
|
| 651 |
+
install_linux_prog_NAME=$1
|
| 652 |
+
shift
|
| 653 |
+
install_linux_prog_PKG=$1
|
| 654 |
+
shift
|
| 655 |
+
install_linux_prog_ALPINE_PKG=$1
|
| 656 |
+
shift
|
| 657 |
+
if [ -x "/usr/bin/$install_linux_prog_NAME" ]; then
|
| 658 |
+
export DK_PROG_INSTALLED_LOCATION="/usr/bin/$install_linux_prog_NAME"
|
| 659 |
+
elif [ -x "/bin/$install_linux_prog_NAME" ]; then
|
| 660 |
+
export DK_PROG_INSTALLED_LOCATION="/bin/$install_linux_prog_NAME"
|
| 661 |
+
else
|
| 662 |
+
if [ -x /sbin/apk ]; then
|
| 663 |
+
if [ "$(id -u)" -eq 0 ]; then
|
| 664 |
+
run_maybe_quiet /sbin/apk add --quiet --no-progress "$install_linux_prog_ALPINE_PKG"
|
| 665 |
+
else
|
| 666 |
+
echo "Running: sudo /sbin/apk add --quiet --no-progress $install_linux_prog_ALPINE_PKG" >&2
|
| 667 |
+
sudo /sbin/apk add --quiet --no-progress "$install_linux_prog_ALPINE_PKG"
|
| 668 |
+
fi
|
| 669 |
+
elif command -v yum > /dev/null 2> /dev/null; then
|
| 670 |
+
if [ "$(id -u)" -eq 0 ]; then
|
| 671 |
+
run_maybe_quiet yum install -q -y "$install_linux_prog_PKG"
|
| 672 |
+
else
|
| 673 |
+
echo "Running: sudo yum install -q -y $install_linux_prog_PKG" >&2
|
| 674 |
+
sudo yum install -q -y "$install_linux_prog_PKG"
|
| 675 |
+
fi
|
| 676 |
+
else
|
| 677 |
+
if [ "$(id -u)" -eq 0 ]; then
|
| 678 |
+
run_maybe_quiet apt-get -qq install -y --no-install-suggests "$install_linux_prog_PKG"
|
| 679 |
+
else
|
| 680 |
+
echo "Running: sudo apt-get -qq install -y --no-install-suggests $install_linux_prog_PKG" >&2
|
| 681 |
+
sudo apt-get -qq install -y --no-install-suggests "$install_linux_prog_PKG"
|
| 682 |
+
fi
|
| 683 |
+
fi
|
| 684 |
+
DK_PROG_INSTALLED_LOCATION=$(command -v "$install_linux_prog_NAME")
|
| 685 |
+
export DK_PROG_INSTALLED_LOCATION
|
| 686 |
+
fi
|
| 687 |
+
}
|
| 688 |
+
|
| 689 |
+
case "$BUILDHOST_ARCH" in
|
| 690 |
+
linux_*)
|
| 691 |
+
# Need either [wget] or [curl] for [downloadfile]
|
| 692 |
+
if [ ! -x /usr/bin/wget ] && [ ! -x /bin/wget ] && [ ! -x /usr/bin/curl ] && [ ! -x /bin/curl ]; then
|
| 693 |
+
install_linux_prog wget wget wget || install_linux_prog curl curl curl
|
| 694 |
+
fi
|
| 695 |
+
;;
|
| 696 |
+
esac
|
| 697 |
+
|
| 698 |
+
# -----
|
| 699 |
+
# resolve version + verify the signed manifest
|
| 700 |
+
# -----
|
| 701 |
+
|
| 702 |
+
# A checksum-less fetch (the manifest is trusted by SIGNATURE, not a pre-known
|
| 703 |
+
# checksum). curl or wget, matching downloadfile's tool detection.
|
| 704 |
+
dk_fetch() {
|
| 705 |
+
# shellcheck disable=SC2046 # prints one flag or nothing; must expand to zero words
|
| 706 |
+
if [ -n "$DKMLSYS_CURL" ]; then "$DKMLSYS_CURL" --proto '=https' --proto-redir '=https' --tlsv1.2 -fsSL "$1" -o "$2"
|
| 707 |
+
elif [ -n "$DKMLSYS_WGET" ]; then "$DKMLSYS_WGET" $(dk_wget_https_only) -q -O "$2" "$1"
|
| 708 |
+
else dk_no_downloader; fi
|
| 709 |
+
}
|
| 710 |
+
|
| 711 |
+
# Read `%% actual_version("X.Y.Z.W")` from dk.u's workspace section (the pin).
|
| 712 |
+
# The `[(]?` tolerates the parenthesized call form dk0 writes (the workspace Lua
|
| 713 |
+
# grammar rejects the bare `actual_version "X"` string-call sugar); the version
|
| 714 |
+
# is the first double-quoted field either way.
|
| 715 |
+
dk_read_actual_version() {
|
| 716 |
+
[ -f "$DK_PROJECT_DIR/dk.u" ] || return 0
|
| 717 |
+
"$DKMLSYS_GREP" -oE '%%[[:space:]]*actual_version[[:space:]]*[(]?[[:space:]]*"[^"]+"' "$DK_PROJECT_DIR/dk.u" 2>/dev/null \
|
| 718 |
+
| head -1 | "$DKMLSYS_SED" 's/.*"\([^"]*\)".*/\1/'
|
| 719 |
+
}
|
| 720 |
+
|
| 721 |
+
# Read a plain key=value field from a verified manifest.
|
| 722 |
+
dk_manifest_str() {
|
| 723 |
+
"$DKMLSYS_GREP" "^$2=" "$1" | head -1 | cut -d= -f2
|
| 724 |
+
}
|
| 725 |
+
|
| 726 |
+
# Defense-in-depth: the dk0 download URL comes from the signify-verified manifest,
|
| 727 |
+
# but still restrict it to known hosts so a signed-but-malicious manifest cannot
|
| 728 |
+
# redirect the fetch off github.com/dkpkg or the legacy GitLab package host.
|
| 729 |
+
dk_allow_host() {
|
| 730 |
+
case "$1" in
|
| 731 |
+
https://github.com/dkpkg/*) return 0 ;;
|
| 732 |
+
https://gitlab.com/api/v4/projects/60486861/*) return 0 ;;
|
| 733 |
+
*) return 1 ;;
|
| 734 |
+
esac
|
| 735 |
+
}
|
| 736 |
+
|
| 737 |
+
# On Windows the published dk0 + mlfront-signify binaries carry a `.exe`
|
| 738 |
+
# extension; other platforms have none. Mirrors gen-manifest.sh's extexe.
|
| 739 |
+
dk_extexe() { case "$BUILDHOST_ARCH" in windows_*) printf '.exe' ;; esac; }
|
| 740 |
+
|
| 741 |
+
# Fetch + signify-verify the manifest into $1. $2 is the pinned version ("" =
|
| 742 |
+
# latest). Aborts on any verification failure. Trust anchor = the baked
|
| 743 |
+
# mlfront-signify SHA-256, then the baked public key over the manifest.
|
| 744 |
+
dk_verify_manifest() {
|
| 745 |
+
dvm_out=$1; dvm_ver=$2
|
| 746 |
+
dvm_sigarch=$BUILDHOST_ARCH
|
| 747 |
+
eval "dvm_pin=\${cksum_signify_${dvm_sigarch}:-}"
|
| 748 |
+
# Empty = the arch was never provisioned; a value still starting with `__` is
|
| 749 |
+
# a maintained-but-unbaked placeholder (e.g. windows_x86 until its signify job
|
| 750 |
+
# ships). Both are "not provisioned" -- refuse rather than fetch and trust an
|
| 751 |
+
# unverifiable verifier.
|
| 752 |
+
# shellcheck disable=SC2154 # dvm_pin is assigned by the eval above
|
| 753 |
+
case "$dvm_pin" in
|
| 754 |
+
'' | __*) echo "FATAL: no pinned mlfront-signify checksum for $BUILDHOST_ARCH (launcher not provisioned)" >&2; exit 3 ;;
|
| 755 |
+
esac
|
| 756 |
+
install -d "$tools_dir/verifier"
|
| 757 |
+
dvm_exe=$(dk_extexe)
|
| 758 |
+
dvm_signify="$tools_dir/verifier/mlfront-signify-$dvm_pin$dvm_exe"
|
| 759 |
+
downloadfile "https://gitlab.com/api/v4/projects/60486861/packages/generic/mlfront-signify/$signify_pkg_ver/mlfront-signify-$dvm_sigarch$dvm_exe" "$dvm_signify" "$dvm_pin"
|
| 760 |
+
chmod +x "$dvm_signify"
|
| 761 |
+
if [ -n "$dvm_ver" ]; then dvm_url="$DK_BASE_URL/manifest-$dvm_ver.txt"; else dvm_url="$DK_BASE_URL/manifest.txt"; fi
|
| 762 |
+
dk_fetch "$dvm_url" "$dvm_out"
|
| 763 |
+
dk_fetch "$dvm_url.sig" "$dvm_out.sig"
|
| 764 |
+
printf 'untrusted comment: dk0 signify public key\n%s\n' "$SIGNIFY_PUBKEY_B64" > "$tools_dir/verifier/dk0.pub"
|
| 765 |
+
"$dvm_signify" -V -q -p "$tools_dir/verifier/dk0.pub" -m "$dvm_out" -x "$dvm_out.sig" \
|
| 766 |
+
|| { echo "FATAL: manifest signature INVALID for $dvm_url -- refusing to continue" >&2; exit 1; }
|
| 767 |
+
}
|
| 768 |
+
|
| 769 |
+
# Resolve the version. `--self-update` ignores the pin and uses the LATEST dk0,
|
| 770 |
+
# which rewrites the dk.u actual_version to its own version -- dk0.exe edits dk.u
|
| 771 |
+
# safely, so this launcher never does file surgery (and stays batch-safe on the
|
| 772 |
+
# Windows side too). Otherwise use the dk.u pin, else the latest.
|
| 773 |
+
dk_selfupdate=0
|
| 774 |
+
[ "${1:-}" = "--self-update" ] && dk_selfupdate=1
|
| 775 |
+
if [ "$dk_selfupdate" = 1 ]; then
|
| 776 |
+
majminpat_ver=
|
| 777 |
+
else
|
| 778 |
+
majminpat_ver=$(dk_read_actual_version)
|
| 779 |
+
fi
|
| 780 |
+
dk_manifest="$tools_dir/verifier/manifest"
|
| 781 |
+
dk_verify_manifest "$dk_manifest" "$majminpat_ver"
|
| 782 |
+
if [ -z "$majminpat_ver" ]; then
|
| 783 |
+
majminpat_ver=$(dk_manifest_str "$dk_manifest" version)
|
| 784 |
+
[ "$dk_selfupdate" = 0 ] && echo "dk0: no '%% actual_version' pin in dk.u; using latest $majminpat_ver (run './dk0 --self-update' to pin)" >&2
|
| 785 |
+
fi
|
| 786 |
+
[ -n "$majminpat_ver" ] || { echo "FATAL: could not resolve a dk0 version" >&2; exit 1; }
|
| 787 |
+
dk0_cksum=$(dk_manifest_str "$dk_manifest" "dk0_${BUILDHOST_ARCH}")
|
| 788 |
+
[ -n "$dk0_cksum" ] || { echo "FATAL: manifest has no dk0 build for $BUILDHOST_ARCH (version $majminpat_ver)" >&2; exit 3; }
|
| 789 |
+
dk0_url_template=$(dk_manifest_str "$dk_manifest" "dk0_url_template")
|
| 790 |
+
[ -n "$dk0_url_template" ] || { echo "FATAL: manifest has no dk0_url_template (version $majminpat_ver)" >&2; exit 1; }
|
| 791 |
+
|
| 792 |
+
# -----
|
| 793 |
+
# single binary executable
|
| 794 |
+
# -----
|
| 795 |
+
|
| 796 |
+
DK_EXE=
|
| 797 |
+
|
| 798 |
+
destdir=$tools_dir/dk0exe-$majminpat_ver-$BUILDHOST_ARCH
|
| 799 |
+
install -d "$destdir"
|
| 800 |
+
dk0_exe="$destdir/dk0$(dk_extexe)"
|
| 801 |
+
download_helper() {
|
| 802 |
+
download_helper_CKSUM=$1; shift
|
| 803 |
+
# Resolve {version}/{arch}/{exe} in the verified manifest's dk0_url_template,
|
| 804 |
+
# then allowlist the host before fetching.
|
| 805 |
+
download_helper_URL=$(printf '%s' "$dk0_url_template" | "$DKMLSYS_SED" \
|
| 806 |
+
-e "s|{version}|$majminpat_ver|g" -e "s|{arch}|$BUILDHOST_ARCH|g" -e "s|{exe}|$(dk_extexe)|g")
|
| 807 |
+
dk_allow_host "$download_helper_URL" \
|
| 808 |
+
|| { echo "FATAL: dk0 download host not allowlisted: $download_helper_URL" >&2; exit 1; }
|
| 809 |
+
downloadfile "$download_helper_URL" "$dk0_exe" "$download_helper_CKSUM"
|
| 810 |
+
}
|
| 811 |
+
download_dk() {
|
| 812 |
+
# dk0 checksum comes from the signify-verified manifest, not a baked value.
|
| 813 |
+
download_helper "$dk0_cksum"
|
| 814 |
+
}
|
| 815 |
+
# downloadfile skips the download when the cached dk0 already matches the manifest
|
| 816 |
+
# checksum, so this is a no-op on the common (already-cached) path. (A `--version`
|
| 817 |
+
# comparison would not work: dk0 prints "X.Y.Z+rev-W" but the pin is "X.Y.Z.W".)
|
| 818 |
+
download_dk
|
| 819 |
+
chmod +x "$dk0_exe"
|
| 820 |
+
|
| 821 |
+
# Set DK_EXE
|
| 822 |
+
DK_EXE="$dk0_exe"
|
| 823 |
+
|
| 824 |
+
# -----
|
| 825 |
+
# launcher store GC
|
| 826 |
+
# -----
|
| 827 |
+
|
| 828 |
+
# Every dk0 version installs into its own $tools_dir/dk0exe-* directory and
|
| 829 |
+
# old versions accumulate forever. Mark the pinned version as used, then
|
| 830 |
+
# remove version directories (and superseded verifier binaries) that no
|
| 831 |
+
# launcher has used in 30 days. Everything here re-downloads on demand from
|
| 832 |
+
# its signed manifest, so deletion is always safe; pruning must never break
|
| 833 |
+
# the launch, hence the blanket error suppression and the [find] guard
|
| 834 |
+
# (skip pruning entirely on systems without [find]).
|
| 835 |
+
touch "$destdir" "$dvm_signify" 2>/dev/null || true
|
| 836 |
+
if command -v find >/dev/null 2>&1; then
|
| 837 |
+
find "$tools_dir" -maxdepth 1 -type d -name 'dk0exe-*' -mtime +30 \
|
| 838 |
+
-exec "$DKMLSYS_RM" -rf {} + 2>/dev/null || true
|
| 839 |
+
find "$tools_dir/verifier" -maxdepth 1 -type f -name 'mlfront-signify-*' \
|
| 840 |
+
-mtime +30 -exec "$DKMLSYS_RM" -f {} + 2>/dev/null || true
|
| 841 |
+
fi
|
| 842 |
+
|
| 843 |
+
# --- Run executable ---
|
| 844 |
+
|
| 845 |
+
# We already changed to DK_PROJECT_DIR earlier. Change back.
|
| 846 |
+
cd "$dk_pwd"
|
| 847 |
+
|
| 848 |
+
export DKCODER_ARG0="$0"
|
| 849 |
+
export DKCODER_PWD="$dk_pwd"
|
| 850 |
+
export DK_PROJECT_DIR
|
| 851 |
+
# Tell the dk0 binary the real execution host. dkml-c-probe bakes the ABI of
|
| 852 |
+
# the C compiler that built the binary, so a musl dk0 cross-built on glibc
|
| 853 |
+
# would otherwise self-identify as linux_x86_64 and resolve the glibc
|
| 854 |
+
# toolchain on a musl host. BUILDHOST_ARCH is the launcher's own host
|
| 855 |
+
# detection (honors a pre-set DKML_HOST_ABI, else uname + the musl loader
|
| 856 |
+
# probe above), so propagate it as DKML_HOST_ABI which the binary honors.
|
| 857 |
+
export DKML_HOST_ABI="$BUILDHOST_ARCH"
|
| 858 |
+
# shellcheck disable=SC2086
|
| 859 |
+
if [ "$dk_selfupdate" = 1 ]; then
|
| 860 |
+
# dk0.exe repins the dk.u actual_version line to the resolved (latest) version.
|
| 861 |
+
exec "$DK_EXE" -isystem "$DK_PROJECT_DIR/etc/dk/i" $_DKEXE_OPTIONS self-update "$majminpat_ver"
|
| 862 |
+
else
|
| 863 |
+
exec "$DK_EXE" -isystem "$DK_PROJECT_DIR/etc/dk/i" $_DKEXE_OPTIONS "$@"
|
| 864 |
+
fi
|
|
@@ -0,0 +1,211 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
@ECHO OFF
|
| 2 |
+
REM ##########################################################################
|
| 3 |
+
REM # File: dk\dk0.cmd #
|
| 4 |
+
REM # #
|
| 5 |
+
REM # Copyright 2025 Diskuv, Inc. #
|
| 6 |
+
REM # #
|
| 7 |
+
REM # Licensed under the Open Software License version 3.0 #
|
| 8 |
+
REM # (the "License"); you may not use this file except in compliance #
|
| 9 |
+
REM # with the License. You may obtain a copy of the License at #
|
| 10 |
+
REM # #
|
| 11 |
+
REM # https://opensource.org/license/osl-3-0-php/ #
|
| 12 |
+
REM # #
|
| 13 |
+
REM ##########################################################################
|
| 14 |
+
|
| 15 |
+
REM Recommendation: Place this file in source control.
|
| 16 |
+
REM
|
| 17 |
+
REM Manifest-driven, self-updating dk0 launcher for Windows. Pure batch on the
|
| 18 |
+
REM hot path -- PowerShell is used only as a last-resort download fallback (after
|
| 19 |
+
REM curl and BITSADMIN), never for logic -- so it runs on locked-down machines.
|
| 20 |
+
REM 1. download the pinned mlfront-signify verifier, check it against the
|
| 21 |
+
REM SHA-256 baked below (the anchor -- not the manifest, so no circularity);
|
| 22 |
+
REM 2. verify the signify signature over the manifest with the baked pubkey;
|
| 23 |
+
REM 3. read the manifest's dk0 SHA-256 (plain key=value, no JSON), download and
|
| 24 |
+
REM cache dk0.exe, then exec it.
|
| 25 |
+
REM This file never rewrites itself.
|
| 26 |
+
|
| 27 |
+
SETLOCAL ENABLEDELAYEDEXPANSION
|
| 28 |
+
|
| 29 |
+
SET "DK_PROJECT_DIR=%~dp0"
|
| 30 |
+
SET "DKCODER_PWD=%CD%"
|
| 31 |
+
|
| 32 |
+
REM ===== BAKED TRUST ROOT (rotates rarely; updated only on key/verifier rotation) =====
|
| 33 |
+
SET "SIGNIFY_PUBKEY_B64=RWTMq/GqeeJ06ACy7By/H05vvtpc3ZPEKlbnDm9fIQxpkgTV92is6YHD"
|
| 34 |
+
SET "DK_CKSUM_SIGNIFY_WINDOWS_X86_64=ebe1aa87a3eb87ed6769782a31916fab72bbdf0ced22d6ddd9a7a455e23e2c68"
|
| 35 |
+
REM windows_x86 (32-bit) mlfront-signify is not published at SIGNIFY_PKG_VER yet;
|
| 36 |
+
REM the __ placeholder trips the not-provisioned guard below until a real checksum
|
| 37 |
+
REM is baked here (matching the ci/dist/dk0 shell slot) so .\dk0.cmd and ./dk0
|
| 38 |
+
REM light up together.
|
| 39 |
+
SET "DK_CKSUM_SIGNIFY_WINDOWS_X86=__CKSUM_SIGNIFY_WINDOWS_X86__"
|
| 40 |
+
REM The verifier is pinned by version+checksum and fetched from its GitLab package
|
| 41 |
+
REM (a direct download, not the throttled listing API); the site serves only the
|
| 42 |
+
REM signed manifest and the wrappers.
|
| 43 |
+
SET "SIGNIFY_PKG_VER=2.4.2.271"
|
| 44 |
+
IF "%DK0_BASE_URL%"=="" (SET "DK_BASE_URL=https://diskuv.com/dk") ELSE (SET "DK_BASE_URL=%DK0_BASE_URL%")
|
| 45 |
+
REM ====================================================================================
|
| 46 |
+
|
| 47 |
+
REM Detect the Windows architecture (WOW64-aware) and select its pinned verifier.
|
| 48 |
+
REM A 32-bit process on 64-bit Windows reports PROCESSOR_ARCHITECTURE=x86 but has
|
| 49 |
+
REM PROCESSOR_ARCHITEW6432 defined; genuine 32-bit Windows does not.
|
| 50 |
+
SET "DK_ARCH=windows_x86_64"
|
| 51 |
+
SET "DK_CKSUM_SIGNIFY=%DK_CKSUM_SIGNIFY_WINDOWS_X86_64%"
|
| 52 |
+
IF /I "%PROCESSOR_ARCHITECTURE%"=="x86" IF NOT DEFINED PROCESSOR_ARCHITEW6432 (
|
| 53 |
+
SET "DK_ARCH=windows_x86"
|
| 54 |
+
SET "DK_CKSUM_SIGNIFY=%DK_CKSUM_SIGNIFY_WINDOWS_X86%"
|
| 55 |
+
)
|
| 56 |
+
IF "!DK_CKSUM_SIGNIFY:~0,2!"=="__" (
|
| 57 |
+
ECHO dk0: no pinned mlfront-signify checksum for !DK_ARCH! ^(launcher not provisioned^) 1>&2
|
| 58 |
+
EXIT /B 3
|
| 59 |
+
)
|
| 60 |
+
|
| 61 |
+
IF "%DKCODER_DATA_HOME%"=="" (SET "DK_DATA_HOME=%LOCALAPPDATA%\Programs\dk0") ELSE (SET "DK_DATA_HOME=%DKCODER_DATA_HOME%")
|
| 62 |
+
SET "DK_VDIR=%DK_DATA_HOME%\verifier"
|
| 63 |
+
IF NOT EXIST "%DK_VDIR%" MKDIR "%DK_VDIR%" >NUL 2>&1
|
| 64 |
+
|
| 65 |
+
REM 1. Pinned verifier from GitLab, checked against the baked SHA-256 (the anchor).
|
| 66 |
+
SET "DK_SIGNIFY=%DK_VDIR%\mlfront-signify-%DK_CKSUM_SIGNIFY%.exe"
|
| 67 |
+
IF NOT EXIST "%DK_SIGNIFY%" (
|
| 68 |
+
CALL :fetch "https://gitlab.com/api/v4/projects/60486861/packages/generic/mlfront-signify/%SIGNIFY_PKG_VER%/mlfront-signify-!DK_ARCH!.exe" "%DK_SIGNIFY%"
|
| 69 |
+
IF !ERRORLEVEL! NEQ 0 EXIT /B 1
|
| 70 |
+
)
|
| 71 |
+
CALL :sha256 "%DK_SIGNIFY%" DK_SIG_ACTUAL
|
| 72 |
+
IF /I NOT "!DK_SIG_ACTUAL!"=="%DK_CKSUM_SIGNIFY%" (
|
| 73 |
+
ECHO dk0: mlfront-signify checksum mismatch ^(verifier not trusted^) 1>&2
|
| 74 |
+
EXIT /B 1
|
| 75 |
+
)
|
| 76 |
+
|
| 77 |
+
REM 2. Write the baked public key (pure batch; signify accepts the CRLF form).
|
| 78 |
+
> "%DK_VDIR%\dk0.pub" ECHO untrusted comment: dk0 signify public key
|
| 79 |
+
>> "%DK_VDIR%\dk0.pub" ECHO %SIGNIFY_PUBKEY_B64%
|
| 80 |
+
|
| 81 |
+
REM 3. Read the dk.u pin: the version between quotes on the actual_version line.
|
| 82 |
+
SET "DK_PIN="
|
| 83 |
+
IF EXIST "%DK_PROJECT_DIR%dk.u" CALL :readpin
|
| 84 |
+
|
| 85 |
+
REM --self-update handled by dk0.exe (it edits dk.u safely); see below after resolve.
|
| 86 |
+
SET "DK_SELFUPDATE=0"
|
| 87 |
+
IF "%~1"=="--self-update" SET "DK_SELFUPDATE=1"
|
| 88 |
+
|
| 89 |
+
REM 4. Verify the manifest and resolve the version + dk0 checksum. Self-update and
|
| 90 |
+
REM an unpinned project both use the latest manifest.
|
| 91 |
+
IF "%DK_SELFUPDATE%"=="1" (SET "DK_WANT=") ELSE (SET "DK_WANT=%DK_PIN%")
|
| 92 |
+
CALL :getmanifest "%DK_WANT%"
|
| 93 |
+
IF !ERRORLEVEL! NEQ 0 EXIT /B 1
|
| 94 |
+
IF "%DK_WANT%"=="" (
|
| 95 |
+
CALL :mval version DK_VER
|
| 96 |
+
IF "%DK_SELFUPDATE%"=="0" IF "%DK_PIN%"=="" ECHO dk0: no actual_version pin in dk.u; using latest !DK_VER! ^(run "dk0 --self-update" to pin^) 1>&2
|
| 97 |
+
) ELSE (
|
| 98 |
+
SET "DK_VER=%DK_PIN%"
|
| 99 |
+
)
|
| 100 |
+
IF "!DK_VER!"=="" (ECHO dk0: could not resolve a dk0 version 1>&2 & EXIT /B 1)
|
| 101 |
+
CALL :mval dk0_!DK_ARCH! DK_CKSUM
|
| 102 |
+
IF "!DK_CKSUM!"=="" (ECHO dk0: manifest has no dk0 build for !DK_ARCH! ^(version !DK_VER!^) 1>&2 & EXIT /B 3)
|
| 103 |
+
CALL :mval dk0_url_template DK_TMPL
|
| 104 |
+
IF "!DK_TMPL!"=="" (ECHO dk0: manifest has no dk0_url_template ^(version !DK_VER!^) 1>&2 & EXIT /B 1)
|
| 105 |
+
|
| 106 |
+
REM 5. Cache + download dk0.exe (version-keyed dir; never overwrite a running exe).
|
| 107 |
+
SET "DK_EXEDIR=%DK_DATA_HOME%\dk0exe-!DK_VER!-!DK_ARCH!"
|
| 108 |
+
IF NOT EXIST "!DK_EXEDIR!" MKDIR "!DK_EXEDIR!" >NUL 2>&1
|
| 109 |
+
SET "DK_EXE=!DK_EXEDIR!\dk0.exe"
|
| 110 |
+
SET "DK_NEED_EXE=1"
|
| 111 |
+
IF EXIST "!DK_EXE!" (
|
| 112 |
+
CALL :sha256 "!DK_EXE!" DK_EXE_ACTUAL
|
| 113 |
+
IF /I "!DK_EXE_ACTUAL!"=="!DK_CKSUM!" SET "DK_NEED_EXE=0"
|
| 114 |
+
)
|
| 115 |
+
IF !DK_NEED_EXE! EQU 1 (
|
| 116 |
+
REM Resolve {version}/{arch}/{exe} in the verified dk0_url_template, then
|
| 117 |
+
REM allowlist the host before downloading.
|
| 118 |
+
SET "DK_URL=!DK_TMPL!"
|
| 119 |
+
SET "DK_URL=!DK_URL:{version}=%DK_VER%!"
|
| 120 |
+
SET "DK_URL=!DK_URL:{arch}=%DK_ARCH%!"
|
| 121 |
+
SET "DK_URL=!DK_URL:{exe}=.exe!"
|
| 122 |
+
CALL :allowhost "!DK_URL!"
|
| 123 |
+
IF !ERRORLEVEL! NEQ 0 (ECHO dk0: download host not allowlisted: !DK_URL! 1>&2 & EXIT /B 1)
|
| 124 |
+
CALL :fetch "!DK_URL!" "!DK_EXE!"
|
| 125 |
+
IF !ERRORLEVEL! NEQ 0 EXIT /B 1
|
| 126 |
+
CALL :sha256 "!DK_EXE!" DK_EXE_ACTUAL
|
| 127 |
+
IF /I NOT "!DK_EXE_ACTUAL!"=="!DK_CKSUM!" (ECHO dk0: dk0.exe checksum mismatch 1>&2 & EXIT /B 1)
|
| 128 |
+
)
|
| 129 |
+
|
| 130 |
+
REM 6. Launcher store GC. Every dk0 version installs into its own dk0exe-*
|
| 131 |
+
REM directory and old versions accumulate forever. Mark the pinned version
|
| 132 |
+
REM (and the current verifier) as used, then remove version directories and
|
| 133 |
+
REM superseded verifier binaries no launcher has used in 30 days. Everything
|
| 134 |
+
REM here re-downloads on demand from its signed manifest, so deletion is
|
| 135 |
+
REM always safe; pruning must never break the launch, so every step
|
| 136 |
+
REM suppresses errors. Pure batch: the mtime bump is a create+delete of a
|
| 137 |
+
REM marker file (updates the directory timestamp), the verifier bump is the
|
| 138 |
+
REM batch copy-touch idiom, and the age test is FORFILES /D.
|
| 139 |
+
>"!DK_EXEDIR!\.dk0-touch" ECHO OK
|
| 140 |
+
DEL /Q "!DK_EXEDIR!\.dk0-touch" >NUL 2>&1
|
| 141 |
+
COPY /B "%DK_SIGNIFY%"+,, "%DK_SIGNIFY%" >NUL 2>&1
|
| 142 |
+
FORFILES /P "%DK_DATA_HOME%" /M dk0exe-* /D -30 /C "cmd /c if @isdir==TRUE rd /s /q @path" >NUL 2>&1
|
| 143 |
+
FORFILES /P "%DK_VDIR%" /M mlfront-signify-*.exe /D -30 /C "cmd /c del /q @path" >NUL 2>&1
|
| 144 |
+
|
| 145 |
+
REM 7. Run it (same contract as the POSIX wrapper). dk0 --self-update rewrites the
|
| 146 |
+
REM dk.u actual_version line itself (dk0.exe edits dk.u safely; this launcher
|
| 147 |
+
REM never does file surgery on dk.u).
|
| 148 |
+
SET "DKCODER_ARG0=dk0"
|
| 149 |
+
IF "%DK_SELFUPDATE%"=="1" (
|
| 150 |
+
REM dk0.exe repins the dk.u actual_version line to the resolved (latest) version.
|
| 151 |
+
"!DK_EXE!" -isystem "%DK_PROJECT_DIR%etc\dk\i" self-update !DK_VER!
|
| 152 |
+
) ELSE (
|
| 153 |
+
"!DK_EXE!" -isystem "%DK_PROJECT_DIR%etc\dk\i" %*
|
| 154 |
+
)
|
| 155 |
+
EXIT /B %ERRORLEVEL%
|
| 156 |
+
|
| 157 |
+
REM ================= subroutines =================
|
| 158 |
+
|
| 159 |
+
REM :fetch URL DEST -- download without a checksum (the manifest is verified by
|
| 160 |
+
REM signature). curl first, then BITSADMIN, then PowerShell -- so no PowerShell
|
| 161 |
+
REM dependency on machines that ship curl (Windows 10 1803+).
|
| 162 |
+
:fetch
|
| 163 |
+
IF EXIST "%SystemRoot%\System32\curl.exe" (
|
| 164 |
+
"%SystemRoot%\System32\curl.exe" -fsSL "%~1" -o "%~2" && EXIT /B 0
|
| 165 |
+
)
|
| 166 |
+
BITSADMIN /TRANSFER dk0fetch /DOWNLOAD /PRIORITY FOREGROUND "%~1" "%~2" >NUL 2>&1 && EXIT /B 0
|
| 167 |
+
powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "$ProgressPreference='SilentlyContinue'; Invoke-WebRequest -UseBasicParsing -Uri '%~1' -OutFile '%~2'" >NUL 2>&1 && EXIT /B 0
|
| 168 |
+
ECHO dk0: could not download %~1 1>&2
|
| 169 |
+
EXIT /B 1
|
| 170 |
+
|
| 171 |
+
REM :sha256 FILE OUTVAR -- set OUTVAR to the lowercased SHA-256 of FILE.
|
| 172 |
+
:sha256
|
| 173 |
+
SET "%~2="
|
| 174 |
+
FOR /F "usebackq tokens=* delims=" %%H IN (`certutil -hashfile "%~1" SHA256 ^| findstr /R "^[0-9a-fA-F][0-9a-fA-F]*$"`) DO (
|
| 175 |
+
IF NOT DEFINED %~2 SET "%~2=%%H"
|
| 176 |
+
)
|
| 177 |
+
IF DEFINED %~2 SET "%~2=!%~2: =!"
|
| 178 |
+
EXIT /B 0
|
| 179 |
+
|
| 180 |
+
REM :getmanifest VER -- fetch manifest[-VER].txt + .sig into %DK_VDIR%, signify-verify.
|
| 181 |
+
:getmanifest
|
| 182 |
+
IF "%~1"=="" (SET "DK_MURL=%DK_BASE_URL%/manifest.txt") ELSE (SET "DK_MURL=%DK_BASE_URL%/manifest-%~1.txt")
|
| 183 |
+
CALL :fetch "!DK_MURL!" "%DK_VDIR%\manifest"
|
| 184 |
+
IF !ERRORLEVEL! NEQ 0 EXIT /B 1
|
| 185 |
+
CALL :fetch "!DK_MURL!.sig" "%DK_VDIR%\manifest.sig"
|
| 186 |
+
IF !ERRORLEVEL! NEQ 0 EXIT /B 1
|
| 187 |
+
"%DK_SIGNIFY%" -V -q -p "%DK_VDIR%\dk0.pub" -m "%DK_VDIR%\manifest" -x "%DK_VDIR%\manifest.sig"
|
| 188 |
+
IF !ERRORLEVEL! NEQ 0 (ECHO dk0: manifest signature INVALID for !DK_MURL! -- refusing to continue 1>&2 & EXIT /B 1)
|
| 189 |
+
EXIT /B 0
|
| 190 |
+
|
| 191 |
+
REM :mval KEY OUTVAR -- read key=value from the verified %DK_VDIR%\manifest.
|
| 192 |
+
:mval
|
| 193 |
+
SET "%~2="
|
| 194 |
+
FOR /F "usebackq tokens=1,* delims==" %%A IN ("%DK_VDIR%\manifest") DO (
|
| 195 |
+
IF /I "%%A"=="%~1" SET "%~2=%%B"
|
| 196 |
+
)
|
| 197 |
+
EXIT /B 0
|
| 198 |
+
|
| 199 |
+
REM :allowhost URL -- EXIT /B 0 if URL starts with an allowlisted host prefix,
|
| 200 |
+
REM else 1. Defense-in-depth over the signify-verified template (a signed-but-
|
| 201 |
+
REM malicious manifest still cannot redirect the download off a known host).
|
| 202 |
+
:allowhost
|
| 203 |
+
ECHO %~1| findstr /B /L /C:"https://github.com/dkpkg/" /C:"https://gitlab.com/api/v4/projects/60486861/" >NUL 2>&1
|
| 204 |
+
EXIT /B !ERRORLEVEL!
|
| 205 |
+
|
| 206 |
+
REM :readpin -- set DK_PIN to the version between the quotes on the dk.u
|
| 207 |
+
REM actual_version line. The caret-escaped FOR options are how batch uses a
|
| 208 |
+
REM double-quote as a delimiter (a quoted "delims=^"" options string does not work).
|
| 209 |
+
:readpin
|
| 210 |
+
FOR /F usebackq^ tokens^=2^ delims^=^" %%V IN (`findstr /L /C:"actual_version" "%DK_PROJECT_DIR%dk.u"`) DO SET "DK_PIN=%%V"
|
| 211 |
+
EXIT /B 0
|
|
@@ -0,0 +1,864 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/sh
|
| 2 |
+
##########################################################################
|
| 3 |
+
# File: mlfront/dk1 #
|
| 4 |
+
# #
|
| 5 |
+
# Copyright 2025 Diskuv, Inc. #
|
| 6 |
+
# #
|
| 7 |
+
# Licensed under the Open Software License version 3.0 #
|
| 8 |
+
# (the "License"); you may not use this file except in compliance #
|
| 9 |
+
# with the License. You may obtain a copy of the License at #
|
| 10 |
+
# #
|
| 11 |
+
# https://opensource.org/license/osl-3-0-php/ #
|
| 12 |
+
# #
|
| 13 |
+
##########################################################################
|
| 14 |
+
|
| 15 |
+
# Recommendation: Place this file in source control.
|
| 16 |
+
#
|
| 17 |
+
# Invoking: ./dk1
|
| 18 |
+
# That works in Powershell on Windows, and in Unix. Copy-and-paste works!
|
| 19 |
+
#
|
| 20 |
+
# Purpose: Install dk1 if not present. Then invoke dk1.
|
| 21 |
+
|
| 22 |
+
# The cksum_signify_* constants below are read indirectly, through the dynamic
|
| 23 |
+
# eval lookup in dk_verify_manifest that builds the variable name from the host
|
| 24 |
+
# ABI; that reference is invisible to the linter, so the file-wide directive on
|
| 25 |
+
# the next line turns off its unused-variable warning.
|
| 26 |
+
# shellcheck disable=SC2034
|
| 27 |
+
set -euf
|
| 28 |
+
|
| 29 |
+
# ===== BAKED TRUST ROOT (rotates rarely; updated only on key/verifier rotation) =====
|
| 30 |
+
# The dk1 version is NOT baked here. It is pinned per project by a
|
| 31 |
+
# %% actual_version("X.Y.Z.W")
|
| 32 |
+
# line in dk.u's `## workspace` section (or the latest signed manifest if absent).
|
| 33 |
+
# dk1 and its checksum come from a signify-signed manifest verified at runtime:
|
| 34 |
+
# 1. download the pinned mlfront-signify verifier from its GitLab package (by
|
| 35 |
+
# the baked version below), check it against the SHA-256 baked below (the
|
| 36 |
+
# anchor -- not the manifest, so no circularity);
|
| 37 |
+
# 2. verify the signify signature over the manifest (manifest.txt) with the
|
| 38 |
+
# baked public key;
|
| 39 |
+
# 3. only then read the manifest's per-arch dk1 SHA-256.
|
| 40 |
+
# This file never rewrites itself (Windows batch/exe safety); `dk1 --self-update`
|
| 41 |
+
# edits only the dk.u actual_version line, and key rotation is followed at
|
| 42 |
+
# verify-time via the manifest's continuation chain.
|
| 43 |
+
SIGNIFY_PUBKEY_B64="RWTMq/GqeeJ06ACy7By/H05vvtpc3ZPEKlbnDm9fIQxpkgTV92is6YHD"
|
| 44 |
+
# The verifier is pinned by version+checksum and fetched from GitLab (a direct
|
| 45 |
+
# package download, not the throttled listing API); the site serves only the
|
| 46 |
+
# signed manifest and the wrappers.
|
| 47 |
+
signify_pkg_ver="2.4.2.271"
|
| 48 |
+
cksum_signify_linux_x86_64="9701ed5821ea57114890f2d54381ee29742b45292ea0c8a259b0d4187c728a4d"
|
| 49 |
+
cksum_signify_linux_x86="533ec71ef0c6081c57850c840d29df5ca8efd3c2722b54dc77c14224dda0c418"
|
| 50 |
+
cksum_signify_darwin_arm64="89513c94add01ef5e15fa4c3a171755cd3eb783f552b9d4a3dedd009fa89a062"
|
| 51 |
+
cksum_signify_darwin_x86_64="875ba2f6840bb705ed2346c9c3a165ee5fdfde559df4b9adfa0c6f915043eade"
|
| 52 |
+
cksum_signify_windows_x86_64="ebe1aa87a3eb87ed6769782a31916fab72bbdf0ced22d6ddd9a7a455e23e2c68"
|
| 53 |
+
# windows_x86 (32-bit) mlfront-signify is not published at signify_pkg_ver yet.
|
| 54 |
+
# Keep the slot maintained: the __ placeholder trips the not-provisioned guard
|
| 55 |
+
# in dk_verify_manifest until a real checksum is baked here (and dk1.cmd carries
|
| 56 |
+
# the matching x86 slot), so ./dk1 and .\dk1.cmd light up together.
|
| 57 |
+
cksum_signify_windows_x86="__CKSUM_SIGNIFY_WINDOWS_X86__"
|
| 58 |
+
DK_BASE_URL="${DK1_BASE_URL:-https://diskuv.com/dk}"
|
| 59 |
+
# ====================================================================================
|
| 60 |
+
|
| 61 |
+
dk_pwd=$PWD
|
| 62 |
+
|
| 63 |
+
# Get the dk project tree
|
| 64 |
+
DK_PROJECT_DIR=$(dirname "$0")
|
| 65 |
+
DK_PROJECT_DIR=$(cd "$DK_PROJECT_DIR" && pwd)
|
| 66 |
+
|
| 67 |
+
# --- Windows ---
|
| 68 |
+
# There is no shunt to dk1.cmd here. The block that used to live here required
|
| 69 |
+
# [ -x /usr/bin/cmd ], and no MSYS2, Cygwin, or Git Bash layout ships a `cmd` in
|
| 70 |
+
# /usr/bin, so it never fired on any host. This script handles Windows directly
|
| 71 |
+
# instead: autodetect_buildhost_arch resolves windows_x86_64 / windows_x86 via
|
| 72 |
+
# is_unixy_windows_build_machine, dk_extexe adds the .exe suffix, the data home
|
| 73 |
+
# below shares dk1.cmd's store, and MSYS converts POSIX paths in argv when
|
| 74 |
+
# exec'ing the native dk1.exe. A shunt could not be the whole answer anyway: a
|
| 75 |
+
# global install.sh install ships no dk1.cmd to shunt to.
|
| 76 |
+
|
| 77 |
+
# --- Quiet mode detection ---
|
| 78 |
+
DKCODER_QUIET=0
|
| 79 |
+
_DKEXE_OPTIONS=
|
| 80 |
+
run_maybe_quiet() {
|
| 81 |
+
"$@" >&2 # Always redirect stdout to stderr in this script
|
| 82 |
+
}
|
| 83 |
+
printf_maybe_quiet() {
|
| 84 |
+
# shellcheck disable=SC2059
|
| 85 |
+
printf "$@" >&2
|
| 86 |
+
}
|
| 87 |
+
|
| 88 |
+
# --- Launcher helpers (not from crossplatform-functions.sh) ---
|
| 89 |
+
|
| 90 |
+
# [dk_prog_path NAME] prints the path to NAME, or nothing when it is not
|
| 91 |
+
# installed. Absolute locations first, so the hardened Linux/macOS behavior is
|
| 92 |
+
# unchanged, then PATH. Git Bash (Git for Windows) ships curl at
|
| 93 |
+
# /mingw64/bin/curl and has no /usr/bin/curl or /bin/curl, so without the PATH
|
| 94 |
+
# fallback the launcher finds no downloader at all and every fetch fails.
|
| 95 |
+
# ci/dist/install.sh already resolves curl/wget through PATH for the same reason.
|
| 96 |
+
# This does not weaken the trust model: the mlfront-signify verifier is pinned by
|
| 97 |
+
# the SHA-256 baked above, the manifest is signify-verified, and every binary is
|
| 98 |
+
# checked against a signed checksum, so a hostile PATH curl can deny service but
|
| 99 |
+
# cannot substitute an artifact.
|
| 100 |
+
# The `|| true` matters under `set -e`: `command -v` exits nonzero for a missing
|
| 101 |
+
# program, and a bare assignment would propagate that status and abort the script.
|
| 102 |
+
dk_prog_path() {
|
| 103 |
+
if [ -x "/usr/bin/$1" ]; then printf '%s' "/usr/bin/$1"
|
| 104 |
+
elif [ -x "/bin/$1" ]; then printf '%s' "/bin/$1"
|
| 105 |
+
else command -v "$1" 2>/dev/null || true
|
| 106 |
+
fi
|
| 107 |
+
}
|
| 108 |
+
|
| 109 |
+
# Every download path funnels here when neither curl nor wget resolved. Name what
|
| 110 |
+
# was searched and the escape hatch; a bare "not available" leaves the reader with
|
| 111 |
+
# nothing to act on.
|
| 112 |
+
dk_no_downloader() {
|
| 113 |
+
echo "FATAL: no curl or wget found (searched /usr/bin, /bin, then PATH)" >&2
|
| 114 |
+
echo " ...: install curl or wget, or set DKMLSYS_CURL=/full/path/to/curl" >&2
|
| 115 |
+
exit 107
|
| 116 |
+
}
|
| 117 |
+
|
| 118 |
+
# --- Imports of dkml-runtime-common's crossplatform-functions.sh ---
|
| 119 |
+
# Changes:
|
| 120 |
+
# 1. In download_file() use [ "${DKCODER_QUIET:-}" -eq 1 ]
|
| 121 |
+
# 2. In log_trace() replace non-FATAL `printf ... >&2` with `printf_maybe_quiet ...`
|
| 122 |
+
# 3. In sha256check() all shasum/* use --quiet option (this should be upstreamed)
|
| 123 |
+
# 4. In autodetect_system_binaries() curl and wget resolve through dk_prog_path
|
| 124 |
+
# (above), which falls back to PATH when the absolute locations miss
|
| 125 |
+
|
| 126 |
+
# Get standard locations of Unix system binaries like `/usr/bin/mv` (or `/bin/mv`).
|
| 127 |
+
#
|
| 128 |
+
# Will not return anything in `/usr/local/bin` or `/usr/sbin`. Use when you do not
|
| 129 |
+
# know whether the PATH has been set correctly, or when you do not know if the
|
| 130 |
+
# system binary exists.
|
| 131 |
+
#
|
| 132 |
+
# At some point in the future, this function will error out if the required system binaries
|
| 133 |
+
# do not exist. Most system binaries are common to all Unix/Linux/macOS installations but
|
| 134 |
+
# some (like `comm`) may need to be installed for proper functioning of DKML.
|
| 135 |
+
#
|
| 136 |
+
# Outputs:
|
| 137 |
+
# - env:DKMLSYS_MV - Location of `mv`
|
| 138 |
+
# - env:DKMLSYS_CHMOD - Location of `chmod`
|
| 139 |
+
# - env:DKMLSYS_UNAME - Location of `uname`
|
| 140 |
+
# - env:DKMLSYS_ENV - Location of `env`
|
| 141 |
+
# - env:DKMLSYS_AWK - Location of `awk`
|
| 142 |
+
# - env:DKMLSYS_SED - Location of `sed`
|
| 143 |
+
# - env:DKMLSYS_COMM - Location of `comm`
|
| 144 |
+
# - env:DKMLSYS_INSTALL - Location of `install`
|
| 145 |
+
# - env:DKMLSYS_RM - Location of `rm`
|
| 146 |
+
# - env:DKMLSYS_SORT - Location of `sort`
|
| 147 |
+
# - env:DKMLSYS_CAT - Location of `cat`
|
| 148 |
+
# - env:DKMLSYS_STAT - Location of `stat`
|
| 149 |
+
# - env:DKMLSYS_GREP - Location of `grep`
|
| 150 |
+
# - env:DKMLSYS_CURL - Location of `curl` (empty if not found)
|
| 151 |
+
# - env:DKMLSYS_WGET - Location of `wget` (empty if not found)
|
| 152 |
+
# - env:DKMLSYS_TR - Location of `tr`
|
| 153 |
+
autodetect_system_binaries() {
|
| 154 |
+
if [ -z "${DKMLSYS_MV:-}" ]; then
|
| 155 |
+
if [ -x /usr/bin/mv ]; then
|
| 156 |
+
DKMLSYS_MV=/usr/bin/mv
|
| 157 |
+
else
|
| 158 |
+
DKMLSYS_MV=/bin/mv
|
| 159 |
+
fi
|
| 160 |
+
fi
|
| 161 |
+
if [ -z "${DKMLSYS_CHMOD:-}" ]; then
|
| 162 |
+
if [ -x /usr/bin/chmod ]; then
|
| 163 |
+
DKMLSYS_CHMOD=/usr/bin/chmod
|
| 164 |
+
else
|
| 165 |
+
DKMLSYS_CHMOD=/bin/chmod
|
| 166 |
+
fi
|
| 167 |
+
fi
|
| 168 |
+
if [ -z "${DKMLSYS_UNAME:-}" ]; then
|
| 169 |
+
if [ -x /usr/bin/uname ]; then
|
| 170 |
+
DKMLSYS_UNAME=/usr/bin/uname
|
| 171 |
+
else
|
| 172 |
+
DKMLSYS_UNAME=/bin/uname
|
| 173 |
+
fi
|
| 174 |
+
fi
|
| 175 |
+
if [ -z "${DKMLSYS_ENV:-}" ]; then
|
| 176 |
+
if [ -x /usr/bin/env ]; then
|
| 177 |
+
DKMLSYS_ENV=/usr/bin/env
|
| 178 |
+
else
|
| 179 |
+
DKMLSYS_ENV=/bin/env
|
| 180 |
+
fi
|
| 181 |
+
fi
|
| 182 |
+
if [ -z "${DKMLSYS_AWK:-}" ]; then
|
| 183 |
+
if [ -x /usr/bin/awk ]; then
|
| 184 |
+
DKMLSYS_AWK=/usr/bin/awk
|
| 185 |
+
else
|
| 186 |
+
DKMLSYS_AWK=/bin/awk
|
| 187 |
+
fi
|
| 188 |
+
fi
|
| 189 |
+
if [ -z "${DKMLSYS_SED:-}" ]; then
|
| 190 |
+
if [ -x /usr/bin/sed ]; then
|
| 191 |
+
DKMLSYS_SED=/usr/bin/sed
|
| 192 |
+
else
|
| 193 |
+
DKMLSYS_SED=/bin/sed
|
| 194 |
+
fi
|
| 195 |
+
fi
|
| 196 |
+
if [ -z "${DKMLSYS_COMM:-}" ]; then
|
| 197 |
+
if [ -x /usr/bin/comm ]; then
|
| 198 |
+
DKMLSYS_COMM=/usr/bin/comm
|
| 199 |
+
else
|
| 200 |
+
DKMLSYS_COMM=/bin/comm
|
| 201 |
+
fi
|
| 202 |
+
fi
|
| 203 |
+
if [ -z "${DKMLSYS_INSTALL:-}" ]; then
|
| 204 |
+
if [ -x /usr/bin/install ]; then
|
| 205 |
+
DKMLSYS_INSTALL=/usr/bin/install
|
| 206 |
+
else
|
| 207 |
+
DKMLSYS_INSTALL=/bin/install
|
| 208 |
+
fi
|
| 209 |
+
fi
|
| 210 |
+
if [ -z "${DKMLSYS_RM:-}" ]; then
|
| 211 |
+
if [ -x /usr/bin/rm ]; then
|
| 212 |
+
DKMLSYS_RM=/usr/bin/rm
|
| 213 |
+
else
|
| 214 |
+
DKMLSYS_RM=/bin/rm
|
| 215 |
+
fi
|
| 216 |
+
fi
|
| 217 |
+
if [ -z "${DKMLSYS_SORT:-}" ]; then
|
| 218 |
+
if [ -x /usr/bin/sort ]; then
|
| 219 |
+
DKMLSYS_SORT=/usr/bin/sort
|
| 220 |
+
else
|
| 221 |
+
DKMLSYS_SORT=/bin/sort
|
| 222 |
+
fi
|
| 223 |
+
fi
|
| 224 |
+
if [ -z "${DKMLSYS_CAT:-}" ]; then
|
| 225 |
+
if [ -x /usr/bin/cat ]; then
|
| 226 |
+
DKMLSYS_CAT=/usr/bin/cat
|
| 227 |
+
else
|
| 228 |
+
DKMLSYS_CAT=/bin/cat
|
| 229 |
+
fi
|
| 230 |
+
fi
|
| 231 |
+
if [ -z "${DKMLSYS_STAT:-}" ]; then
|
| 232 |
+
if [ -x /usr/bin/stat ]; then
|
| 233 |
+
DKMLSYS_STAT=/usr/bin/stat
|
| 234 |
+
else
|
| 235 |
+
DKMLSYS_STAT=/bin/stat
|
| 236 |
+
fi
|
| 237 |
+
fi
|
| 238 |
+
if [ -z "${DKMLSYS_GREP:-}" ]; then
|
| 239 |
+
if [ -x /usr/bin/grep ]; then
|
| 240 |
+
DKMLSYS_GREP=/usr/bin/grep
|
| 241 |
+
else
|
| 242 |
+
DKMLSYS_GREP=/bin/grep
|
| 243 |
+
fi
|
| 244 |
+
fi
|
| 245 |
+
if [ -z "${DKMLSYS_CURL:-}" ]; then DKMLSYS_CURL=$(dk_prog_path curl); fi
|
| 246 |
+
if [ -z "${DKMLSYS_WGET:-}" ]; then DKMLSYS_WGET=$(dk_prog_path wget); fi
|
| 247 |
+
if [ -z "${DKMLSYS_TR:-}" ]; then
|
| 248 |
+
if [ -x /usr/bin/tr ]; then
|
| 249 |
+
DKMLSYS_TR=/usr/bin/tr
|
| 250 |
+
else
|
| 251 |
+
DKMLSYS_TR=/bin/tr
|
| 252 |
+
fi
|
| 253 |
+
fi
|
| 254 |
+
export DKMLSYS_MV DKMLSYS_CHMOD DKMLSYS_UNAME DKMLSYS_ENV DKMLSYS_AWK DKMLSYS_SED DKMLSYS_COMM DKMLSYS_INSTALL
|
| 255 |
+
export DKMLSYS_RM DKMLSYS_SORT DKMLSYS_CAT DKMLSYS_STAT DKMLSYS_GREP DKMLSYS_CURL DKMLSYS_WGET DKMLSYS_TR
|
| 256 |
+
}
|
| 257 |
+
|
| 258 |
+
# Is a Windows build machine if we are in a MSYS2 or Cygwin environment.
|
| 259 |
+
#
|
| 260 |
+
# Better alternatives
|
| 261 |
+
# -------------------
|
| 262 |
+
#
|
| 263 |
+
# 1. If you are checking to see if you should do a cygpath, then just guard it
|
| 264 |
+
# like so:
|
| 265 |
+
# if [ -x /usr/bin/cygpath ]; then
|
| 266 |
+
# do_something $(/usr/bin/cygpath ...) ...
|
| 267 |
+
# fi
|
| 268 |
+
# This clearly guards what you are about to do (cygpath) with what you will
|
| 269 |
+
# need (cygpath).
|
| 270 |
+
# 2. is_arg_windows_platform
|
| 271 |
+
is_unixy_windows_build_machine() {
|
| 272 |
+
if is_msys2_msys_build_machine || is_cygwin_build_machine; then
|
| 273 |
+
return 0
|
| 274 |
+
fi
|
| 275 |
+
return 1
|
| 276 |
+
}
|
| 277 |
+
|
| 278 |
+
# Is a MSYS2 environment with the MSYS or MINGW64 subsystem?
|
| 279 |
+
# * MSYS2 can also do MinGW 32-bit and 64-bit subsystems. Used by Diskuv OCaml
|
| 280 |
+
# * MINGW64 used by Git Bash (aka. GitHub Actions `shell: bash`)
|
| 281 |
+
# https://www.msys2.org/docs/environments/
|
| 282 |
+
is_msys2_msys_build_machine() {
|
| 283 |
+
if [ -e /usr/bin/msys-2.0.dll ] && {
|
| 284 |
+
[ "${MSYSTEM:-}" = "MSYS" ] || [ "${MSYSTEM:-}" = "MINGW64" ] || [ "${MSYSTEM:-}" = "UCRT64" ] || [ "${MSYSTEM:-}" = "CLANG64" ] || [ "${MSYSTEM:-}" = "MINGW32" ] || [ "${MSYSTEM:-}" = "CLANG32" ] || [ "${MSYSTEM:-}" = "CLANGARM64" ]
|
| 285 |
+
}; then
|
| 286 |
+
return 0
|
| 287 |
+
fi
|
| 288 |
+
return 1
|
| 289 |
+
}
|
| 290 |
+
|
| 291 |
+
is_cygwin_build_machine() {
|
| 292 |
+
if [ -e /usr/bin/cygwin1.dll ]; then
|
| 293 |
+
return 0
|
| 294 |
+
fi
|
| 295 |
+
return 1
|
| 296 |
+
}
|
| 297 |
+
|
| 298 |
+
# Tries to find the host ABI.
|
| 299 |
+
#
|
| 300 |
+
# Beware: This function uses `uname` probing may be inaccurate for dual-arch
|
| 301 |
+
# CPUs like Apple Silicon with Rosetta.
|
| 302 |
+
#
|
| 303 |
+
# Inputs:
|
| 304 |
+
# - env:DKML_HOST_ABI - Optional but recommended. If set, then BUILDHOST_ARCH will be set to the same.
|
| 305 |
+
#
|
| 306 |
+
# Outputs:
|
| 307 |
+
# - env:BUILDHOST_ARCH will contain the host ABI.
|
| 308 |
+
autodetect_buildhost_arch() {
|
| 309 |
+
if [ -n "${DKML_HOST_ABI:-}" ]; then
|
| 310 |
+
BUILDHOST_ARCH=$DKML_HOST_ABI
|
| 311 |
+
else
|
| 312 |
+
# Set DKMLSYS_*
|
| 313 |
+
autodetect_system_binaries
|
| 314 |
+
|
| 315 |
+
autodetect_buildhost_arch_SYSTEM=$("$DKMLSYS_UNAME" -s)
|
| 316 |
+
autodetect_buildhost_arch_MACHINE=$("$DKMLSYS_UNAME" -m)
|
| 317 |
+
# list from https://en.wikipedia.org/wiki/Uname and https://stackoverflow.com/questions/45125516/possible-values-for-uname-m
|
| 318 |
+
case "${autodetect_buildhost_arch_SYSTEM}-${autodetect_buildhost_arch_MACHINE}" in
|
| 319 |
+
Linux-armv7*)
|
| 320 |
+
BUILDHOST_ARCH=linux_arm32v7;;
|
| 321 |
+
Linux-armv6* | Linux-arm)
|
| 322 |
+
BUILDHOST_ARCH=linux_arm32v6;;
|
| 323 |
+
Linux-aarch64 | Linux-arm64 | Linux-armv8*)
|
| 324 |
+
BUILDHOST_ARCH=linux_arm64;;
|
| 325 |
+
Linux-i386 | Linux-i686)
|
| 326 |
+
BUILDHOST_ARCH=linux_x86;;
|
| 327 |
+
Linux-x86_64)
|
| 328 |
+
BUILDHOST_ARCH=linux_x86_64
|
| 329 |
+
# uname -m reports the KERNEL machine, so a 32-bit userland on
|
| 330 |
+
# a 64-bit kernel (ex. an i386 container on an amd64 host)
|
| 331 |
+
# still says x86_64 -- but a 64-bit dk1 cannot run there. The
|
| 332 |
+
# userland's own ELF class is the truth: byte 5 of /bin/sh is
|
| 333 |
+
# 1 for ELFCLASS32. od(1) is POSIX but not guaranteed present;
|
| 334 |
+
# without it, or on a 64-bit userland, the kernel's answer
|
| 335 |
+
# stands. test's numeric -eq tolerates od's leading
|
| 336 |
+
# whitespace; the redirected test guards non-numeric output.
|
| 337 |
+
autodetect_buildhost_arch_ELFCLASS=
|
| 338 |
+
if command -v od >/dev/null 2>&1; then
|
| 339 |
+
autodetect_buildhost_arch_ELFCLASS=$(od -An -td1 -j4 -N1 /bin/sh 2>/dev/null)
|
| 340 |
+
fi
|
| 341 |
+
if [ "${autodetect_buildhost_arch_ELFCLASS:-2}" -eq 1 ] 2>/dev/null; then
|
| 342 |
+
BUILDHOST_ARCH=linux_x86
|
| 343 |
+
# musl-based Linux (ex. alpine) is not a supported dk1 ABI yet;
|
| 344 |
+
# there is no musl dk1 build. Fail fast with a clear message
|
| 345 |
+
# instead of reaching a confusing "not provisioned" error later.
|
| 346 |
+
# A user who knows better can still force DKML_HOST_ABI. The musl
|
| 347 |
+
# dynamic loader path is the reliable marker; musl's ldd
|
| 348 |
+
# identifying itself is the fallback.
|
| 349 |
+
elif [ -e /lib/ld-musl-x86_64.so.1 ] \
|
| 350 |
+
|| { ldd --version 2>&1 | grep -qi musl; } 2>/dev/null; then
|
| 351 |
+
printf "%s\n" "FATAL: musl-based Linux (e.g. Alpine) is not supported yet; dk1 needs a glibc-based distro" >&2
|
| 352 |
+
exit 1
|
| 353 |
+
fi
|
| 354 |
+
;;
|
| 355 |
+
Darwin-arm64)
|
| 356 |
+
BUILDHOST_ARCH=darwin_arm64;;
|
| 357 |
+
Darwin-x86_64)
|
| 358 |
+
BUILDHOST_ARCH=darwin_x86_64;;
|
| 359 |
+
*-i386 | *-i686)
|
| 360 |
+
if is_unixy_windows_build_machine; then
|
| 361 |
+
BUILDHOST_ARCH=windows_x86
|
| 362 |
+
else
|
| 363 |
+
printf "%s\n" "FATAL: Unsupported build machine type obtained from 'uname -s' and 'uname -m': $autodetect_buildhost_arch_SYSTEM and $autodetect_buildhost_arch_MACHINE" >&2
|
| 364 |
+
exit 1
|
| 365 |
+
fi
|
| 366 |
+
;;
|
| 367 |
+
*-x86_64)
|
| 368 |
+
if is_unixy_windows_build_machine; then
|
| 369 |
+
BUILDHOST_ARCH=windows_x86_64
|
| 370 |
+
else
|
| 371 |
+
printf "%s\n" "FATAL: Unsupported build machine type obtained from 'uname -s' and 'uname -m': $autodetect_buildhost_arch_SYSTEM and $autodetect_buildhost_arch_MACHINE" >&2
|
| 372 |
+
exit 1
|
| 373 |
+
fi
|
| 374 |
+
;;
|
| 375 |
+
*)
|
| 376 |
+
# Since:
|
| 377 |
+
# 1) MSYS2 does not run on ARM/ARM64 (https://www.msys2.org/docs/environments/)
|
| 378 |
+
# 2) MSVC does not use ARM/ARM64 as host machine (https://docs.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=msvc-160)
|
| 379 |
+
# we do not support Windows ARM/ARM64 as a build machine
|
| 380 |
+
printf "%s\n" "FATAL: Unsupported build machine type obtained from 'uname -s' and 'uname -m': $autodetect_buildhost_arch_SYSTEM and $autodetect_buildhost_arch_MACHINE" >&2
|
| 381 |
+
exit 1
|
| 382 |
+
;;
|
| 383 |
+
esac
|
| 384 |
+
fi
|
| 385 |
+
}
|
| 386 |
+
|
| 387 |
+
# A function that will try to print an ISO8601 timestamp, but will fallback to
|
| 388 |
+
# the system default. Always uses UTC timezone.
|
| 389 |
+
try_iso8601_timestamp() {
|
| 390 |
+
date -u -Iseconds 2>/dev/null || TZ=UTC date
|
| 391 |
+
}
|
| 392 |
+
|
| 393 |
+
# A function that will print the command and possibly time it (if and only if it uses a full path to
|
| 394 |
+
# an executable, so that 'time' does not fail on internal shell functions).
|
| 395 |
+
# If --return-error-code is the first argument or LOG_TRACE_RETURN_ERROR_CODE=ON, then instead of exiting the
|
| 396 |
+
# function will return the error code.
|
| 397 |
+
log_trace() {
|
| 398 |
+
log_trace_RETURN=${LOG_TRACE_RETURN_ERROR_CODE:-OFF}
|
| 399 |
+
|
| 400 |
+
log_trace_1="$1"
|
| 401 |
+
if [ "$log_trace_1" = "--return-error-code" ]; then
|
| 402 |
+
shift
|
| 403 |
+
log_trace_RETURN=ON
|
| 404 |
+
fi
|
| 405 |
+
|
| 406 |
+
if [ "${DKML_BUILD_TRACE:-OFF}" = ON ]; then
|
| 407 |
+
printf_maybe_quiet "[%s] %s\n" "$(try_iso8601_timestamp)" "+ $*"
|
| 408 |
+
if [ -x "$1" ]; then
|
| 409 |
+
time "$@"
|
| 410 |
+
else
|
| 411 |
+
"$@"
|
| 412 |
+
fi
|
| 413 |
+
else
|
| 414 |
+
# use judgement so we essentially have log at an INFO level
|
| 415 |
+
case "$1" in
|
| 416 |
+
rm|cp)
|
| 417 |
+
# debug level. only show when DKML_BUILD_TRACE=ON
|
| 418 |
+
;;
|
| 419 |
+
git|make|ocaml_configure|ocaml_make|make_host|make_target)
|
| 420 |
+
# info level. and can show entire command without polluting the screen
|
| 421 |
+
printf_maybe_quiet "[%s] %s\n" "$(try_iso8601_timestamp)" "$*"
|
| 422 |
+
;;
|
| 423 |
+
*) printf_maybe_quiet "[%s] %s\n" "$(try_iso8601_timestamp)" "$1"
|
| 424 |
+
esac
|
| 425 |
+
"$@"
|
| 426 |
+
fi
|
| 427 |
+
log_trace_ec="$?"
|
| 428 |
+
if [ "$log_trace_ec" -ne 0 ]; then
|
| 429 |
+
if [ "$log_trace_RETURN" = ON ]; then
|
| 430 |
+
return "$log_trace_ec"
|
| 431 |
+
else
|
| 432 |
+
printf "FATAL: Command failed with exit code %s: %s\n" "$log_trace_ec" "$*" >&2
|
| 433 |
+
exit "$log_trace_ec"
|
| 434 |
+
fi
|
| 435 |
+
fi
|
| 436 |
+
}
|
| 437 |
+
|
| 438 |
+
# [sha256compute FILE] writes the SHA256 checksum (hex encoded) of file FILE to the standard output.
|
| 439 |
+
sha256compute() {
|
| 440 |
+
sha256compute_FILE="$1"
|
| 441 |
+
shift
|
| 442 |
+
# For reasons unclear doing the following in MSYS2:
|
| 443 |
+
# sha256sum 'Z:\source\README.md'
|
| 444 |
+
# will produce a backslash like:
|
| 445 |
+
# \5518c76ed7234a153941fb7bc94b6e91d9cb8f1c4e22daf169a59b5878c3fc8a *Z:\\source\\README.md
|
| 446 |
+
# So always cygpath the filename if available
|
| 447 |
+
if [ -x /usr/bin/cygpath ]; then
|
| 448 |
+
sha256compute_FILE=$(/usr/bin/cygpath -a "$sha256compute_FILE")
|
| 449 |
+
fi
|
| 450 |
+
|
| 451 |
+
autodetect_system_binaries
|
| 452 |
+
if [ -x /usr/bin/shasum ]; then # macOS, OpenBSD, Debian
|
| 453 |
+
# CODESITE #1 (duplicates elsewhere).
|
| 454 |
+
# On Debian shasum is a perl script, and perl needs locale settings or it will complain.
|
| 455 |
+
# Confer: https://www.thomas-krenn.com/en/wiki/Perl_warning_Setting_locale_failed_in_Debian
|
| 456 |
+
# Confer: https://stackoverflow.com/a/52004330/21513816
|
| 457 |
+
# shellcheck disable=SC2016
|
| 458 |
+
LC_ALL=C /usr/bin/shasum -a 256 "$sha256compute_FILE" | "$DKMLSYS_AWK" '{print $1}'
|
| 459 |
+
elif [ -x /usr/bin/sha256sum ]; then # Linux, MSYS2
|
| 460 |
+
# shellcheck disable=SC2016
|
| 461 |
+
/usr/bin/sha256sum "$sha256compute_FILE" | "$DKMLSYS_AWK" '{print $1}'
|
| 462 |
+
elif [ -x /sbin/sha256 ]; then # FreeBSD
|
| 463 |
+
# shellcheck disable=SC2016
|
| 464 |
+
/sbin/sha256 -r "$sha256compute_FILE" | "$DKMLSYS_AWK" '{print $1}'
|
| 465 |
+
else
|
| 466 |
+
printf "FATAL: %s\n" "No sha256 checksum utility found" >&2
|
| 467 |
+
exit 107
|
| 468 |
+
fi
|
| 469 |
+
}
|
| 470 |
+
|
| 471 |
+
# [sha256check FILE SUM] checks that the file FILE has a SHA256 checksum (hex encoded) of SUM.
|
| 472 |
+
# The function will return nonzero (and exit with failure if `set -e` is enabled) if the checksum does not match.
|
| 473 |
+
sha256check() {
|
| 474 |
+
sha256check_FILE="$1"
|
| 475 |
+
shift
|
| 476 |
+
sha256check_SUM="$1"
|
| 477 |
+
shift
|
| 478 |
+
|
| 479 |
+
if [ -x /usr/bin/shasum ]; then # macOS, OpenBSD, Debian
|
| 480 |
+
# CODESITE #1 (duplicates elsewhere).
|
| 481 |
+
# On Debian shasum is a perl script, and perl needs locale settings or it will complain.
|
| 482 |
+
# Confer: https://www.thomas-krenn.com/en/wiki/Perl_warning_Setting_locale_failed_in_Debian
|
| 483 |
+
# Confer: https://stackoverflow.com/a/52004330/21513816
|
| 484 |
+
# Note: shasum 5.96 (ex. conanio/gcc7:1.64.1) has no --quiet option.
|
| 485 |
+
# shellcheck disable=SC2016
|
| 486 |
+
printf "%s %s" "$sha256check_SUM" "$sha256check_FILE" | LC_ALL=C /usr/bin/shasum -a 256 -c >&2
|
| 487 |
+
elif [ -x /usr/bin/sha256sum ]; then # Linux, MSYS2
|
| 488 |
+
# Note: BusyBox v1.35.0 sha256sum has no --quiet option.
|
| 489 |
+
printf "%s %s" "$sha256check_SUM" "$sha256check_FILE" | /usr/bin/sha256sum -c >&2
|
| 490 |
+
elif [ -x /sbin/sha256 ]; then # FreeBSD
|
| 491 |
+
/sbin/sha256 --quiet -c "$sha256check_SUM" "$sha256check_FILE" >&2
|
| 492 |
+
else
|
| 493 |
+
printf "FATAL: %s\n" "No sha256 checksum utility found" >&2
|
| 494 |
+
|
| 495 |
+
# REMOVEME!
|
| 496 |
+
if [ -d /sbin ]; then printf "/sbin:\n" >&2; ls /sbin >&2; fi
|
| 497 |
+
if [ -d /usr/sbin ]; then printf "/usr/sbin:\n" >&2; ls /usr/sbin >&2; fi
|
| 498 |
+
if [ -d /bin ]; then printf "/bin:\n" >&2; ls /bin >&2; fi
|
| 499 |
+
if [ -d /usr/bin ]; then printf "/usr/bin:\n" >&2; ls /usr/bin >&2; fi
|
| 500 |
+
|
| 501 |
+
exit 107
|
| 502 |
+
fi
|
| 503 |
+
}
|
| 504 |
+
|
| 505 |
+
# Echo --https-only if this wget supports it (BusyBox wget does not), so a
|
| 506 |
+
# redirect cannot downgrade the transfer off HTTPS wherever the option exists.
|
| 507 |
+
dk_wget_https_only() {
|
| 508 |
+
if "$DKMLSYS_WGET" --help 2>&1 | grep -q -- --https-only; then printf '%s' '--https-only'; fi
|
| 509 |
+
}
|
| 510 |
+
|
| 511 |
+
# [downloadfile URL FILE SUM] downloads from URL into FILE and verifies the SHA256 checksum of SUM.
|
| 512 |
+
# If the FILE already exists with the correct checksum it is not redownloaded.
|
| 513 |
+
# The function will exit with failure if the checksum does not match.
|
| 514 |
+
# curl pins HTTPS end to end (--proto '=https' + --proto-redir '=https') with a
|
| 515 |
+
# TLS 1.2 floor, and -f fails on an HTTP error page instead of saving it.
|
| 516 |
+
downloadfile() {
|
| 517 |
+
downloadfile_URL="$1"
|
| 518 |
+
shift
|
| 519 |
+
downloadfile_FILE="$1"
|
| 520 |
+
shift
|
| 521 |
+
downloadfile_SUM="$1"
|
| 522 |
+
shift
|
| 523 |
+
|
| 524 |
+
# Set DKMLSYS_*
|
| 525 |
+
autodetect_system_binaries
|
| 526 |
+
|
| 527 |
+
# Quick exit if exists and checksum verified. Do not display
|
| 528 |
+
# anything (even the checksum output) since this is the normal scenario
|
| 529 |
+
# that can run a billion times. The checksum verification for the
|
| 530 |
+
# download (if this fails) will not be silenced.
|
| 531 |
+
if [ -e "$downloadfile_FILE" ]; then
|
| 532 |
+
if sha256check "$downloadfile_FILE" "$downloadfile_SUM" > /dev/null 2>&1; then
|
| 533 |
+
return 0
|
| 534 |
+
else
|
| 535 |
+
$DKMLSYS_RM -f "$downloadfile_FILE"
|
| 536 |
+
fi
|
| 537 |
+
fi
|
| 538 |
+
|
| 539 |
+
printf_maybe_quiet "... %s %s\n" "Downloading" "$downloadfile_URL"
|
| 540 |
+
if [ "${CI:-}" = true ] || [ "${DKCODER_QUIET:-}" -eq 1 ]; then
|
| 541 |
+
if [ -n "$DKMLSYS_CURL" ]; then
|
| 542 |
+
log_trace "$DKMLSYS_CURL" --proto '=https' --proto-redir '=https' --tlsv1.2 -fsSL "$downloadfile_URL" -o "$downloadfile_FILE".tmp
|
| 543 |
+
elif [ -n "$DKMLSYS_WGET" ]; then
|
| 544 |
+
# shellcheck disable=SC2046 # prints one flag or nothing; must expand to zero words
|
| 545 |
+
log_trace "$DKMLSYS_WGET" $(dk_wget_https_only) -q -O "$downloadfile_FILE".tmp "$downloadfile_URL"
|
| 546 |
+
else
|
| 547 |
+
dk_no_downloader
|
| 548 |
+
fi
|
| 549 |
+
else
|
| 550 |
+
if [ -n "$DKMLSYS_CURL" ]; then
|
| 551 |
+
log_trace "$DKMLSYS_CURL" --proto '=https' --proto-redir '=https' --tlsv1.2 -fL "$downloadfile_URL" -o "$downloadfile_FILE".tmp
|
| 552 |
+
elif [ -n "$DKMLSYS_WGET" ]; then
|
| 553 |
+
# shellcheck disable=SC2046 # prints one flag or nothing; must expand to zero words
|
| 554 |
+
log_trace "$DKMLSYS_WGET" $(dk_wget_https_only) -O "$downloadfile_FILE".tmp "$downloadfile_URL"
|
| 555 |
+
else
|
| 556 |
+
dk_no_downloader
|
| 557 |
+
fi
|
| 558 |
+
fi
|
| 559 |
+
printf_maybe_quiet "\n... %s %s\n" "Verifying" "$downloadfile_URL"
|
| 560 |
+
if ! sha256check "$downloadfile_FILE".tmp "$downloadfile_SUM"; then
|
| 561 |
+
printf "%s\n" "FATAL: Encountered a corrupted or compromised download from $downloadfile_URL" >&2
|
| 562 |
+
exit 1
|
| 563 |
+
fi
|
| 564 |
+
printf_maybe_quiet "\n"
|
| 565 |
+
$DKMLSYS_MV "$downloadfile_FILE".tmp "$downloadfile_FILE"
|
| 566 |
+
}
|
| 567 |
+
|
| 568 |
+
# End import
|
| 569 |
+
# ---------------------------------------------------------------------------
|
| 570 |
+
|
| 571 |
+
# --- Environment detection ---
|
| 572 |
+
|
| 573 |
+
# Set DKMLSYS_*
|
| 574 |
+
autodetect_system_binaries
|
| 575 |
+
|
| 576 |
+
# Find host ABI. Set in BUILDHOST_ARCH
|
| 577 |
+
autodetect_buildhost_arch
|
| 578 |
+
|
| 579 |
+
# --- data home ---
|
| 580 |
+
|
| 581 |
+
tools_dir=
|
| 582 |
+
tools_name=dk1
|
| 583 |
+
# 1. Check DKCODER_DATA_HOME environment variable.
|
| 584 |
+
if [ -z "$tools_dir" ] && [ -n "${DKCODER_DATA_HOME:-}" ]; then
|
| 585 |
+
install -d "$DKCODER_DATA_HOME"
|
| 586 |
+
tools_dir="$DKCODER_DATA_HOME"
|
| 587 |
+
fi
|
| 588 |
+
# 2. Check if CI since many CI providers can only cache content in a subdirectory
|
| 589 |
+
# of the project.
|
| 590 |
+
if [ -z "$tools_dir" ] && [ "${CI:-}" = true ]; then
|
| 591 |
+
install -d "$DK_PROJECT_DIR/.z-dk/tools"
|
| 592 |
+
tools_dir="$DK_PROJECT_DIR/.z-dk/tools"
|
| 593 |
+
fi
|
| 594 |
+
# 2b. On Windows (Git Bash / MSYS2 / Cygwin) use the SAME store as dk1.cmd,
|
| 595 |
+
# %LOCALAPPDATA%\Programs\dk1, so a project driven from both PowerShell and
|
| 596 |
+
# a POSIX shell shares one cache instead of downloading every build twice.
|
| 597 |
+
# This sits after the CI check on purpose: dk1.cmd has no CI branch, but a
|
| 598 |
+
# Windows CI job driving ./dk1 from bash still wants the in-project cache.
|
| 599 |
+
# LOCALAPPDATA holds a native Windows path (MSYS does not convert
|
| 600 |
+
# environment variables), so cygpath it; needing cygpath also scopes this
|
| 601 |
+
# to MSYS/Cygwin.
|
| 602 |
+
if [ -z "$tools_dir" ] && [ -n "${COMSPEC:-}" ] && [ -n "${LOCALAPPDATA:-}" ] && [ -x /usr/bin/cygpath ]; then
|
| 603 |
+
tools_dir_LOCALAPPDATA=$(/usr/bin/cygpath -au "$LOCALAPPDATA")
|
| 604 |
+
if [ -w "$tools_dir_LOCALAPPDATA" ]; then
|
| 605 |
+
install -d "$tools_dir_LOCALAPPDATA/Programs/$tools_name"
|
| 606 |
+
tools_dir="$tools_dir_LOCALAPPDATA/Programs/$tools_name"
|
| 607 |
+
fi
|
| 608 |
+
fi
|
| 609 |
+
# 3. Check in locations rooted under /opt/diskuv
|
| 610 |
+
# We look under a /opt/diskuv early because
|
| 611 |
+
# - Especially important for WSL2 to use a pure Linux filesystem (ext4) for
|
| 612 |
+
# best performance.
|
| 613 |
+
# - Using a canonical location (especially /opt/diskuv/usr/share) makes
|
| 614 |
+
# it easy to use CMake presets for non-Windows hosts.
|
| 615 |
+
if [ -z "$tools_dir" ] && [ -n "${XDG_DATA_HOME:-}" ] && [ -w "/opt/diskuv/$XDG_DATA_HOME" ]; then
|
| 616 |
+
install -d "/opt/diskuv/$XDG_DATA_HOME/$tools_name"
|
| 617 |
+
tools_dir="/opt/diskuv/$XDG_DATA_HOME/$tools_name"
|
| 618 |
+
fi
|
| 619 |
+
if [ -z "$tools_dir" ] && [ -n "${HOME:-}" ] && [ -w "/opt/diskuv/$HOME" ]; then
|
| 620 |
+
install -d "/opt/diskuv/$HOME/.local/share/$tools_name"
|
| 621 |
+
tools_dir="/opt/diskuv/$HOME/.local/share/$tools_name"
|
| 622 |
+
fi
|
| 623 |
+
if [ -z "$tools_dir" ] && [ -w "/opt/diskuv/usr/share" ]; then
|
| 624 |
+
install -d "/opt/diskuv/usr/share/$tools_name"
|
| 625 |
+
tools_dir="/opt/diskuv/usr/share/$tools_name"
|
| 626 |
+
fi
|
| 627 |
+
# 4. Check in the conventional locations rooted under /
|
| 628 |
+
if [ -z "$tools_dir" ] && [ -n "${XDG_DATA_HOME:-}" ] && [ -w "$XDG_DATA_HOME" ]; then
|
| 629 |
+
install -d "$XDG_DATA_HOME/$tools_name"
|
| 630 |
+
tools_dir="$XDG_DATA_HOME/$tools_name"
|
| 631 |
+
fi
|
| 632 |
+
if [ -z "$tools_dir" ] && [ -n "${HOME:-}" ] && [ -w "$HOME" ]; then
|
| 633 |
+
install -d "$HOME/.local/share/$tools_name"
|
| 634 |
+
tools_dir="$HOME/.local/share/$tools_name"
|
| 635 |
+
fi
|
| 636 |
+
# 5. Validate
|
| 637 |
+
if [ -z "$tools_dir" ]; then
|
| 638 |
+
echo "FATAL: Could not find a location to install DkCoder." >&2
|
| 639 |
+
echo " ...: Make sure you have a home directory and that it is write-able, or define" >&2
|
| 640 |
+
echo " ...: the environment variable XDG_DATA_HOME in a shell profile script after" >&2
|
| 641 |
+
echo " ...: creating the \$XDG_DATA_HOME directory." >&2
|
| 642 |
+
exit 2
|
| 643 |
+
fi
|
| 644 |
+
|
| 645 |
+
# --- Tool downloads and installs ---
|
| 646 |
+
|
| 647 |
+
# PREREQS
|
| 648 |
+
# -------
|
| 649 |
+
|
| 650 |
+
install_linux_prog() {
|
| 651 |
+
install_linux_prog_NAME=$1
|
| 652 |
+
shift
|
| 653 |
+
install_linux_prog_PKG=$1
|
| 654 |
+
shift
|
| 655 |
+
install_linux_prog_ALPINE_PKG=$1
|
| 656 |
+
shift
|
| 657 |
+
if [ -x "/usr/bin/$install_linux_prog_NAME" ]; then
|
| 658 |
+
export DK_PROG_INSTALLED_LOCATION="/usr/bin/$install_linux_prog_NAME"
|
| 659 |
+
elif [ -x "/bin/$install_linux_prog_NAME" ]; then
|
| 660 |
+
export DK_PROG_INSTALLED_LOCATION="/bin/$install_linux_prog_NAME"
|
| 661 |
+
else
|
| 662 |
+
if [ -x /sbin/apk ]; then
|
| 663 |
+
if [ "$(id -u)" -eq 0 ]; then
|
| 664 |
+
run_maybe_quiet /sbin/apk add --quiet --no-progress "$install_linux_prog_ALPINE_PKG"
|
| 665 |
+
else
|
| 666 |
+
echo "Running: sudo /sbin/apk add --quiet --no-progress $install_linux_prog_ALPINE_PKG" >&2
|
| 667 |
+
sudo /sbin/apk add --quiet --no-progress "$install_linux_prog_ALPINE_PKG"
|
| 668 |
+
fi
|
| 669 |
+
elif command -v yum > /dev/null 2> /dev/null; then
|
| 670 |
+
if [ "$(id -u)" -eq 0 ]; then
|
| 671 |
+
run_maybe_quiet yum install -q -y "$install_linux_prog_PKG"
|
| 672 |
+
else
|
| 673 |
+
echo "Running: sudo yum install -q -y $install_linux_prog_PKG" >&2
|
| 674 |
+
sudo yum install -q -y "$install_linux_prog_PKG"
|
| 675 |
+
fi
|
| 676 |
+
else
|
| 677 |
+
if [ "$(id -u)" -eq 0 ]; then
|
| 678 |
+
run_maybe_quiet apt-get -qq install -y --no-install-suggests "$install_linux_prog_PKG"
|
| 679 |
+
else
|
| 680 |
+
echo "Running: sudo apt-get -qq install -y --no-install-suggests $install_linux_prog_PKG" >&2
|
| 681 |
+
sudo apt-get -qq install -y --no-install-suggests "$install_linux_prog_PKG"
|
| 682 |
+
fi
|
| 683 |
+
fi
|
| 684 |
+
DK_PROG_INSTALLED_LOCATION=$(command -v "$install_linux_prog_NAME")
|
| 685 |
+
export DK_PROG_INSTALLED_LOCATION
|
| 686 |
+
fi
|
| 687 |
+
}
|
| 688 |
+
|
| 689 |
+
case "$BUILDHOST_ARCH" in
|
| 690 |
+
linux_*)
|
| 691 |
+
# Need either [wget] or [curl] for [downloadfile]
|
| 692 |
+
if [ ! -x /usr/bin/wget ] && [ ! -x /bin/wget ] && [ ! -x /usr/bin/curl ] && [ ! -x /bin/curl ]; then
|
| 693 |
+
install_linux_prog wget wget wget || install_linux_prog curl curl curl
|
| 694 |
+
fi
|
| 695 |
+
;;
|
| 696 |
+
esac
|
| 697 |
+
|
| 698 |
+
# -----
|
| 699 |
+
# resolve version + verify the signed manifest
|
| 700 |
+
# -----
|
| 701 |
+
|
| 702 |
+
# A checksum-less fetch (the manifest is trusted by SIGNATURE, not a pre-known
|
| 703 |
+
# checksum). curl or wget, matching downloadfile's tool detection.
|
| 704 |
+
dk_fetch() {
|
| 705 |
+
# shellcheck disable=SC2046 # prints one flag or nothing; must expand to zero words
|
| 706 |
+
if [ -n "$DKMLSYS_CURL" ]; then "$DKMLSYS_CURL" --proto '=https' --proto-redir '=https' --tlsv1.2 -fsSL "$1" -o "$2"
|
| 707 |
+
elif [ -n "$DKMLSYS_WGET" ]; then "$DKMLSYS_WGET" $(dk_wget_https_only) -q -O "$2" "$1"
|
| 708 |
+
else dk_no_downloader; fi
|
| 709 |
+
}
|
| 710 |
+
|
| 711 |
+
# Read `%% actual_version("X.Y.Z.W")` from dk.u's workspace section (the pin).
|
| 712 |
+
# The `[(]?` tolerates the parenthesized call form dk1 writes (the workspace Lua
|
| 713 |
+
# grammar rejects the bare `actual_version "X"` string-call sugar); the version
|
| 714 |
+
# is the first double-quoted field either way.
|
| 715 |
+
dk_read_actual_version() {
|
| 716 |
+
[ -f "$DK_PROJECT_DIR/dk.u" ] || return 0
|
| 717 |
+
"$DKMLSYS_GREP" -oE '%%[[:space:]]*actual_version[[:space:]]*[(]?[[:space:]]*"[^"]+"' "$DK_PROJECT_DIR/dk.u" 2>/dev/null \
|
| 718 |
+
| head -1 | "$DKMLSYS_SED" 's/.*"\([^"]*\)".*/\1/'
|
| 719 |
+
}
|
| 720 |
+
|
| 721 |
+
# Read a plain key=value field from a verified manifest.
|
| 722 |
+
dk_manifest_str() {
|
| 723 |
+
"$DKMLSYS_GREP" "^$2=" "$1" | head -1 | cut -d= -f2
|
| 724 |
+
}
|
| 725 |
+
|
| 726 |
+
# Defense-in-depth: the dk1 download URL comes from the signify-verified manifest,
|
| 727 |
+
# but still restrict it to known hosts so a signed-but-malicious manifest cannot
|
| 728 |
+
# redirect the fetch off github.com/dkpkg or the legacy GitLab package host.
|
| 729 |
+
dk_allow_host() {
|
| 730 |
+
case "$1" in
|
| 731 |
+
https://github.com/dkpkg/*) return 0 ;;
|
| 732 |
+
https://gitlab.com/api/v4/projects/60486861/*) return 0 ;;
|
| 733 |
+
*) return 1 ;;
|
| 734 |
+
esac
|
| 735 |
+
}
|
| 736 |
+
|
| 737 |
+
# On Windows the published dk1 + mlfront-signify binaries carry a `.exe`
|
| 738 |
+
# extension; other platforms have none. Mirrors gen-manifest.sh's extexe.
|
| 739 |
+
dk_extexe() { case "$BUILDHOST_ARCH" in windows_*) printf '.exe' ;; esac; }
|
| 740 |
+
|
| 741 |
+
# Fetch + signify-verify the manifest into $1. $2 is the pinned version ("" =
|
| 742 |
+
# latest). Aborts on any verification failure. Trust anchor = the baked
|
| 743 |
+
# mlfront-signify SHA-256, then the baked public key over the manifest.
|
| 744 |
+
dk_verify_manifest() {
|
| 745 |
+
dvm_out=$1; dvm_ver=$2
|
| 746 |
+
dvm_sigarch=$BUILDHOST_ARCH
|
| 747 |
+
eval "dvm_pin=\${cksum_signify_${dvm_sigarch}:-}"
|
| 748 |
+
# Empty = the arch was never provisioned; a value still starting with `__` is
|
| 749 |
+
# a maintained-but-unbaked placeholder (e.g. windows_x86 until its signify job
|
| 750 |
+
# ships). Both are "not provisioned" -- refuse rather than fetch and trust an
|
| 751 |
+
# unverifiable verifier.
|
| 752 |
+
# shellcheck disable=SC2154 # dvm_pin is assigned by the eval above
|
| 753 |
+
case "$dvm_pin" in
|
| 754 |
+
'' | __*) echo "FATAL: no pinned mlfront-signify checksum for $BUILDHOST_ARCH (launcher not provisioned)" >&2; exit 3 ;;
|
| 755 |
+
esac
|
| 756 |
+
install -d "$tools_dir/verifier"
|
| 757 |
+
dvm_exe=$(dk_extexe)
|
| 758 |
+
dvm_signify="$tools_dir/verifier/mlfront-signify-$dvm_pin$dvm_exe"
|
| 759 |
+
downloadfile "https://gitlab.com/api/v4/projects/60486861/packages/generic/mlfront-signify/$signify_pkg_ver/mlfront-signify-$dvm_sigarch$dvm_exe" "$dvm_signify" "$dvm_pin"
|
| 760 |
+
chmod +x "$dvm_signify"
|
| 761 |
+
if [ -n "$dvm_ver" ]; then dvm_url="$DK_BASE_URL/manifest-$dvm_ver.txt"; else dvm_url="$DK_BASE_URL/manifest.txt"; fi
|
| 762 |
+
dk_fetch "$dvm_url" "$dvm_out"
|
| 763 |
+
dk_fetch "$dvm_url.sig" "$dvm_out.sig"
|
| 764 |
+
printf 'untrusted comment: dk1 signify public key\n%s\n' "$SIGNIFY_PUBKEY_B64" > "$tools_dir/verifier/dk1.pub"
|
| 765 |
+
"$dvm_signify" -V -q -p "$tools_dir/verifier/dk1.pub" -m "$dvm_out" -x "$dvm_out.sig" \
|
| 766 |
+
|| { echo "FATAL: manifest signature INVALID for $dvm_url -- refusing to continue" >&2; exit 1; }
|
| 767 |
+
}
|
| 768 |
+
|
| 769 |
+
# Resolve the version. `--self-update` ignores the pin and uses the LATEST dk1,
|
| 770 |
+
# which rewrites the dk.u actual_version to its own version -- dk1.exe edits dk.u
|
| 771 |
+
# safely, so this launcher never does file surgery (and stays batch-safe on the
|
| 772 |
+
# Windows side too). Otherwise use the dk.u pin, else the latest.
|
| 773 |
+
dk_selfupdate=0
|
| 774 |
+
[ "${1:-}" = "--self-update" ] && dk_selfupdate=1
|
| 775 |
+
if [ "$dk_selfupdate" = 1 ]; then
|
| 776 |
+
majminpat_ver=
|
| 777 |
+
else
|
| 778 |
+
majminpat_ver=$(dk_read_actual_version)
|
| 779 |
+
fi
|
| 780 |
+
dk_manifest="$tools_dir/verifier/manifest"
|
| 781 |
+
dk_verify_manifest "$dk_manifest" "$majminpat_ver"
|
| 782 |
+
if [ -z "$majminpat_ver" ]; then
|
| 783 |
+
majminpat_ver=$(dk_manifest_str "$dk_manifest" version)
|
| 784 |
+
[ "$dk_selfupdate" = 0 ] && echo "dk1: no '%% actual_version' pin in dk.u; using latest $majminpat_ver (run './dk1 --self-update' to pin)" >&2
|
| 785 |
+
fi
|
| 786 |
+
[ -n "$majminpat_ver" ] || { echo "FATAL: could not resolve a dk1 version" >&2; exit 1; }
|
| 787 |
+
dk1_cksum=$(dk_manifest_str "$dk_manifest" "dk1_${BUILDHOST_ARCH}")
|
| 788 |
+
[ -n "$dk1_cksum" ] || { echo "FATAL: manifest has no dk1 build for $BUILDHOST_ARCH (version $majminpat_ver)" >&2; exit 3; }
|
| 789 |
+
dk1_url_template=$(dk_manifest_str "$dk_manifest" "dk1_url_template")
|
| 790 |
+
[ -n "$dk1_url_template" ] || { echo "FATAL: manifest has no dk1_url_template (version $majminpat_ver)" >&2; exit 1; }
|
| 791 |
+
|
| 792 |
+
# -----
|
| 793 |
+
# single binary executable
|
| 794 |
+
# -----
|
| 795 |
+
|
| 796 |
+
DK_EXE=
|
| 797 |
+
|
| 798 |
+
destdir=$tools_dir/dk1exe-$majminpat_ver-$BUILDHOST_ARCH
|
| 799 |
+
install -d "$destdir"
|
| 800 |
+
dk1_exe="$destdir/dk1$(dk_extexe)"
|
| 801 |
+
download_helper() {
|
| 802 |
+
download_helper_CKSUM=$1; shift
|
| 803 |
+
# Resolve {version}/{arch}/{exe} in the verified manifest's dk1_url_template,
|
| 804 |
+
# then allowlist the host before fetching.
|
| 805 |
+
download_helper_URL=$(printf '%s' "$dk1_url_template" | "$DKMLSYS_SED" \
|
| 806 |
+
-e "s|{version}|$majminpat_ver|g" -e "s|{arch}|$BUILDHOST_ARCH|g" -e "s|{exe}|$(dk_extexe)|g")
|
| 807 |
+
dk_allow_host "$download_helper_URL" \
|
| 808 |
+
|| { echo "FATAL: dk1 download host not allowlisted: $download_helper_URL" >&2; exit 1; }
|
| 809 |
+
downloadfile "$download_helper_URL" "$dk1_exe" "$download_helper_CKSUM"
|
| 810 |
+
}
|
| 811 |
+
download_dk() {
|
| 812 |
+
# dk1 checksum comes from the signify-verified manifest, not a baked value.
|
| 813 |
+
download_helper "$dk1_cksum"
|
| 814 |
+
}
|
| 815 |
+
# downloadfile skips the download when the cached dk1 already matches the manifest
|
| 816 |
+
# checksum, so this is a no-op on the common (already-cached) path. (A `--version`
|
| 817 |
+
# comparison would not work: dk1 prints "X.Y.Z+rev-W" but the pin is "X.Y.Z.W".)
|
| 818 |
+
download_dk
|
| 819 |
+
chmod +x "$dk1_exe"
|
| 820 |
+
|
| 821 |
+
# Set DK_EXE
|
| 822 |
+
DK_EXE="$dk1_exe"
|
| 823 |
+
|
| 824 |
+
# -----
|
| 825 |
+
# launcher store GC
|
| 826 |
+
# -----
|
| 827 |
+
|
| 828 |
+
# Every dk1 version installs into its own $tools_dir/dk1exe-* directory and
|
| 829 |
+
# old versions accumulate forever. Mark the pinned version as used, then
|
| 830 |
+
# remove version directories (and superseded verifier binaries) that no
|
| 831 |
+
# launcher has used in 30 days. Everything here re-downloads on demand from
|
| 832 |
+
# its signed manifest, so deletion is always safe; pruning must never break
|
| 833 |
+
# the launch, hence the blanket error suppression and the [find] guard
|
| 834 |
+
# (skip pruning entirely on systems without [find]).
|
| 835 |
+
touch "$destdir" "$dvm_signify" 2>/dev/null || true
|
| 836 |
+
if command -v find >/dev/null 2>&1; then
|
| 837 |
+
find "$tools_dir" -maxdepth 1 -type d -name 'dk1exe-*' -mtime +30 \
|
| 838 |
+
-exec "$DKMLSYS_RM" -rf {} + 2>/dev/null || true
|
| 839 |
+
find "$tools_dir/verifier" -maxdepth 1 -type f -name 'mlfront-signify-*' \
|
| 840 |
+
-mtime +30 -exec "$DKMLSYS_RM" -f {} + 2>/dev/null || true
|
| 841 |
+
fi
|
| 842 |
+
|
| 843 |
+
# --- Run executable ---
|
| 844 |
+
|
| 845 |
+
# We already changed to DK_PROJECT_DIR earlier. Change back.
|
| 846 |
+
cd "$dk_pwd"
|
| 847 |
+
|
| 848 |
+
export DKCODER_ARG0="$0"
|
| 849 |
+
export DKCODER_PWD="$dk_pwd"
|
| 850 |
+
export DK_PROJECT_DIR
|
| 851 |
+
# Tell the dk1 binary the real execution host. dkml-c-probe bakes the ABI of
|
| 852 |
+
# the C compiler that built the binary, so a musl dk1 cross-built on glibc
|
| 853 |
+
# would otherwise self-identify as linux_x86_64 and resolve the glibc
|
| 854 |
+
# toolchain on a musl host. BUILDHOST_ARCH is the launcher's own host
|
| 855 |
+
# detection (honors a pre-set DKML_HOST_ABI, else uname + the musl loader
|
| 856 |
+
# probe above), so propagate it as DKML_HOST_ABI which the binary honors.
|
| 857 |
+
export DKML_HOST_ABI="$BUILDHOST_ARCH"
|
| 858 |
+
# shellcheck disable=SC2086
|
| 859 |
+
if [ "$dk_selfupdate" = 1 ]; then
|
| 860 |
+
# dk1.exe repins the dk.u actual_version line to the resolved (latest) version.
|
| 861 |
+
exec "$DK_EXE" -isystem "$DK_PROJECT_DIR/etc/dk/i" $_DKEXE_OPTIONS self-update "$majminpat_ver"
|
| 862 |
+
else
|
| 863 |
+
exec "$DK_EXE" -isystem "$DK_PROJECT_DIR/etc/dk/i" $_DKEXE_OPTIONS "$@"
|
| 864 |
+
fi
|
|
@@ -0,0 +1,211 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
@ECHO OFF
|
| 2 |
+
REM ##########################################################################
|
| 3 |
+
REM # File: dk\dk1.cmd #
|
| 4 |
+
REM # #
|
| 5 |
+
REM # Copyright 2025 Diskuv, Inc. #
|
| 6 |
+
REM # #
|
| 7 |
+
REM # Licensed under the Open Software License version 3.0 #
|
| 8 |
+
REM # (the "License"); you may not use this file except in compliance #
|
| 9 |
+
REM # with the License. You may obtain a copy of the License at #
|
| 10 |
+
REM # #
|
| 11 |
+
REM # https://opensource.org/license/osl-3-0-php/ #
|
| 12 |
+
REM # #
|
| 13 |
+
REM ##########################################################################
|
| 14 |
+
|
| 15 |
+
REM Recommendation: Place this file in source control.
|
| 16 |
+
REM
|
| 17 |
+
REM Manifest-driven, self-updating dk1 launcher for Windows. Pure batch on the
|
| 18 |
+
REM hot path -- PowerShell is used only as a last-resort download fallback (after
|
| 19 |
+
REM curl and BITSADMIN), never for logic -- so it runs on locked-down machines.
|
| 20 |
+
REM 1. download the pinned mlfront-signify verifier, check it against the
|
| 21 |
+
REM SHA-256 baked below (the anchor -- not the manifest, so no circularity);
|
| 22 |
+
REM 2. verify the signify signature over the manifest with the baked pubkey;
|
| 23 |
+
REM 3. read the manifest's dk1 SHA-256 (plain key=value, no JSON), download and
|
| 24 |
+
REM cache dk1.exe, then exec it.
|
| 25 |
+
REM This file never rewrites itself.
|
| 26 |
+
|
| 27 |
+
SETLOCAL ENABLEDELAYEDEXPANSION
|
| 28 |
+
|
| 29 |
+
SET "DK_PROJECT_DIR=%~dp0"
|
| 30 |
+
SET "DKCODER_PWD=%CD%"
|
| 31 |
+
|
| 32 |
+
REM ===== BAKED TRUST ROOT (rotates rarely; updated only on key/verifier rotation) =====
|
| 33 |
+
SET "SIGNIFY_PUBKEY_B64=RWTMq/GqeeJ06ACy7By/H05vvtpc3ZPEKlbnDm9fIQxpkgTV92is6YHD"
|
| 34 |
+
SET "DK_CKSUM_SIGNIFY_WINDOWS_X86_64=ebe1aa87a3eb87ed6769782a31916fab72bbdf0ced22d6ddd9a7a455e23e2c68"
|
| 35 |
+
REM windows_x86 (32-bit) mlfront-signify is not published at SIGNIFY_PKG_VER yet;
|
| 36 |
+
REM the __ placeholder trips the not-provisioned guard below until a real checksum
|
| 37 |
+
REM is baked here (matching the ci/dist/dk1 shell slot) so .\dk1.cmd and ./dk1
|
| 38 |
+
REM light up together.
|
| 39 |
+
SET "DK_CKSUM_SIGNIFY_WINDOWS_X86=__CKSUM_SIGNIFY_WINDOWS_X86__"
|
| 40 |
+
REM The verifier is pinned by version+checksum and fetched from its GitLab package
|
| 41 |
+
REM (a direct download, not the throttled listing API); the site serves only the
|
| 42 |
+
REM signed manifest and the wrappers.
|
| 43 |
+
SET "SIGNIFY_PKG_VER=2.4.2.271"
|
| 44 |
+
IF "%DK1_BASE_URL%"=="" (SET "DK_BASE_URL=https://diskuv.com/dk") ELSE (SET "DK_BASE_URL=%DK1_BASE_URL%")
|
| 45 |
+
REM ====================================================================================
|
| 46 |
+
|
| 47 |
+
REM Detect the Windows architecture (WOW64-aware) and select its pinned verifier.
|
| 48 |
+
REM A 32-bit process on 64-bit Windows reports PROCESSOR_ARCHITECTURE=x86 but has
|
| 49 |
+
REM PROCESSOR_ARCHITEW6432 defined; genuine 32-bit Windows does not.
|
| 50 |
+
SET "DK_ARCH=windows_x86_64"
|
| 51 |
+
SET "DK_CKSUM_SIGNIFY=%DK_CKSUM_SIGNIFY_WINDOWS_X86_64%"
|
| 52 |
+
IF /I "%PROCESSOR_ARCHITECTURE%"=="x86" IF NOT DEFINED PROCESSOR_ARCHITEW6432 (
|
| 53 |
+
SET "DK_ARCH=windows_x86"
|
| 54 |
+
SET "DK_CKSUM_SIGNIFY=%DK_CKSUM_SIGNIFY_WINDOWS_X86%"
|
| 55 |
+
)
|
| 56 |
+
IF "!DK_CKSUM_SIGNIFY:~0,2!"=="__" (
|
| 57 |
+
ECHO dk1: no pinned mlfront-signify checksum for !DK_ARCH! ^(launcher not provisioned^) 1>&2
|
| 58 |
+
EXIT /B 3
|
| 59 |
+
)
|
| 60 |
+
|
| 61 |
+
IF "%DKCODER_DATA_HOME%"=="" (SET "DK_DATA_HOME=%LOCALAPPDATA%\Programs\dk1") ELSE (SET "DK_DATA_HOME=%DKCODER_DATA_HOME%")
|
| 62 |
+
SET "DK_VDIR=%DK_DATA_HOME%\verifier"
|
| 63 |
+
IF NOT EXIST "%DK_VDIR%" MKDIR "%DK_VDIR%" >NUL 2>&1
|
| 64 |
+
|
| 65 |
+
REM 1. Pinned verifier from GitLab, checked against the baked SHA-256 (the anchor).
|
| 66 |
+
SET "DK_SIGNIFY=%DK_VDIR%\mlfront-signify-%DK_CKSUM_SIGNIFY%.exe"
|
| 67 |
+
IF NOT EXIST "%DK_SIGNIFY%" (
|
| 68 |
+
CALL :fetch "https://gitlab.com/api/v4/projects/60486861/packages/generic/mlfront-signify/%SIGNIFY_PKG_VER%/mlfront-signify-!DK_ARCH!.exe" "%DK_SIGNIFY%"
|
| 69 |
+
IF !ERRORLEVEL! NEQ 0 EXIT /B 1
|
| 70 |
+
)
|
| 71 |
+
CALL :sha256 "%DK_SIGNIFY%" DK_SIG_ACTUAL
|
| 72 |
+
IF /I NOT "!DK_SIG_ACTUAL!"=="%DK_CKSUM_SIGNIFY%" (
|
| 73 |
+
ECHO dk1: mlfront-signify checksum mismatch ^(verifier not trusted^) 1>&2
|
| 74 |
+
EXIT /B 1
|
| 75 |
+
)
|
| 76 |
+
|
| 77 |
+
REM 2. Write the baked public key (pure batch; signify accepts the CRLF form).
|
| 78 |
+
> "%DK_VDIR%\dk1.pub" ECHO untrusted comment: dk1 signify public key
|
| 79 |
+
>> "%DK_VDIR%\dk1.pub" ECHO %SIGNIFY_PUBKEY_B64%
|
| 80 |
+
|
| 81 |
+
REM 3. Read the dk.u pin: the version between quotes on the actual_version line.
|
| 82 |
+
SET "DK_PIN="
|
| 83 |
+
IF EXIST "%DK_PROJECT_DIR%dk.u" CALL :readpin
|
| 84 |
+
|
| 85 |
+
REM --self-update handled by dk1.exe (it edits dk.u safely); see below after resolve.
|
| 86 |
+
SET "DK_SELFUPDATE=0"
|
| 87 |
+
IF "%~1"=="--self-update" SET "DK_SELFUPDATE=1"
|
| 88 |
+
|
| 89 |
+
REM 4. Verify the manifest and resolve the version + dk1 checksum. Self-update and
|
| 90 |
+
REM an unpinned project both use the latest manifest.
|
| 91 |
+
IF "%DK_SELFUPDATE%"=="1" (SET "DK_WANT=") ELSE (SET "DK_WANT=%DK_PIN%")
|
| 92 |
+
CALL :getmanifest "%DK_WANT%"
|
| 93 |
+
IF !ERRORLEVEL! NEQ 0 EXIT /B 1
|
| 94 |
+
IF "%DK_WANT%"=="" (
|
| 95 |
+
CALL :mval version DK_VER
|
| 96 |
+
IF "%DK_SELFUPDATE%"=="0" IF "%DK_PIN%"=="" ECHO dk1: no actual_version pin in dk.u; using latest !DK_VER! ^(run "dk1 --self-update" to pin^) 1>&2
|
| 97 |
+
) ELSE (
|
| 98 |
+
SET "DK_VER=%DK_PIN%"
|
| 99 |
+
)
|
| 100 |
+
IF "!DK_VER!"=="" (ECHO dk1: could not resolve a dk1 version 1>&2 & EXIT /B 1)
|
| 101 |
+
CALL :mval dk1_!DK_ARCH! DK_CKSUM
|
| 102 |
+
IF "!DK_CKSUM!"=="" (ECHO dk1: manifest has no dk1 build for !DK_ARCH! ^(version !DK_VER!^) 1>&2 & EXIT /B 3)
|
| 103 |
+
CALL :mval dk1_url_template DK_TMPL
|
| 104 |
+
IF "!DK_TMPL!"=="" (ECHO dk1: manifest has no dk1_url_template ^(version !DK_VER!^) 1>&2 & EXIT /B 1)
|
| 105 |
+
|
| 106 |
+
REM 5. Cache + download dk1.exe (version-keyed dir; never overwrite a running exe).
|
| 107 |
+
SET "DK_EXEDIR=%DK_DATA_HOME%\dk1exe-!DK_VER!-!DK_ARCH!"
|
| 108 |
+
IF NOT EXIST "!DK_EXEDIR!" MKDIR "!DK_EXEDIR!" >NUL 2>&1
|
| 109 |
+
SET "DK_EXE=!DK_EXEDIR!\dk1.exe"
|
| 110 |
+
SET "DK_NEED_EXE=1"
|
| 111 |
+
IF EXIST "!DK_EXE!" (
|
| 112 |
+
CALL :sha256 "!DK_EXE!" DK_EXE_ACTUAL
|
| 113 |
+
IF /I "!DK_EXE_ACTUAL!"=="!DK_CKSUM!" SET "DK_NEED_EXE=0"
|
| 114 |
+
)
|
| 115 |
+
IF !DK_NEED_EXE! EQU 1 (
|
| 116 |
+
REM Resolve {version}/{arch}/{exe} in the verified dk1_url_template, then
|
| 117 |
+
REM allowlist the host before downloading.
|
| 118 |
+
SET "DK_URL=!DK_TMPL!"
|
| 119 |
+
SET "DK_URL=!DK_URL:{version}=%DK_VER%!"
|
| 120 |
+
SET "DK_URL=!DK_URL:{arch}=%DK_ARCH%!"
|
| 121 |
+
SET "DK_URL=!DK_URL:{exe}=.exe!"
|
| 122 |
+
CALL :allowhost "!DK_URL!"
|
| 123 |
+
IF !ERRORLEVEL! NEQ 0 (ECHO dk1: download host not allowlisted: !DK_URL! 1>&2 & EXIT /B 1)
|
| 124 |
+
CALL :fetch "!DK_URL!" "!DK_EXE!"
|
| 125 |
+
IF !ERRORLEVEL! NEQ 0 EXIT /B 1
|
| 126 |
+
CALL :sha256 "!DK_EXE!" DK_EXE_ACTUAL
|
| 127 |
+
IF /I NOT "!DK_EXE_ACTUAL!"=="!DK_CKSUM!" (ECHO dk1: dk1.exe checksum mismatch 1>&2 & EXIT /B 1)
|
| 128 |
+
)
|
| 129 |
+
|
| 130 |
+
REM 6. Launcher store GC. Every dk1 version installs into its own dk1exe-*
|
| 131 |
+
REM directory and old versions accumulate forever. Mark the pinned version
|
| 132 |
+
REM (and the current verifier) as used, then remove version directories and
|
| 133 |
+
REM superseded verifier binaries no launcher has used in 30 days. Everything
|
| 134 |
+
REM here re-downloads on demand from its signed manifest, so deletion is
|
| 135 |
+
REM always safe; pruning must never break the launch, so every step
|
| 136 |
+
REM suppresses errors. Pure batch: the mtime bump is a create+delete of a
|
| 137 |
+
REM marker file (updates the directory timestamp), the verifier bump is the
|
| 138 |
+
REM batch copy-touch idiom, and the age test is FORFILES /D.
|
| 139 |
+
>"!DK_EXEDIR!\.dk1-touch" ECHO OK
|
| 140 |
+
DEL /Q "!DK_EXEDIR!\.dk1-touch" >NUL 2>&1
|
| 141 |
+
COPY /B "%DK_SIGNIFY%"+,, "%DK_SIGNIFY%" >NUL 2>&1
|
| 142 |
+
FORFILES /P "%DK_DATA_HOME%" /M dk1exe-* /D -30 /C "cmd /c if @isdir==TRUE rd /s /q @path" >NUL 2>&1
|
| 143 |
+
FORFILES /P "%DK_VDIR%" /M mlfront-signify-*.exe /D -30 /C "cmd /c del /q @path" >NUL 2>&1
|
| 144 |
+
|
| 145 |
+
REM 7. Run it (same contract as the POSIX wrapper). dk1 --self-update rewrites the
|
| 146 |
+
REM dk.u actual_version line itself (dk1.exe edits dk.u safely; this launcher
|
| 147 |
+
REM never does file surgery on dk.u).
|
| 148 |
+
SET "DKCODER_ARG0=dk1"
|
| 149 |
+
IF "%DK_SELFUPDATE%"=="1" (
|
| 150 |
+
REM dk1.exe repins the dk.u actual_version line to the resolved (latest) version.
|
| 151 |
+
"!DK_EXE!" -isystem "%DK_PROJECT_DIR%etc\dk\i" self-update !DK_VER!
|
| 152 |
+
) ELSE (
|
| 153 |
+
"!DK_EXE!" -isystem "%DK_PROJECT_DIR%etc\dk\i" %*
|
| 154 |
+
)
|
| 155 |
+
EXIT /B %ERRORLEVEL%
|
| 156 |
+
|
| 157 |
+
REM ================= subroutines =================
|
| 158 |
+
|
| 159 |
+
REM :fetch URL DEST -- download without a checksum (the manifest is verified by
|
| 160 |
+
REM signature). curl first, then BITSADMIN, then PowerShell -- so no PowerShell
|
| 161 |
+
REM dependency on machines that ship curl (Windows 10 1803+).
|
| 162 |
+
:fetch
|
| 163 |
+
IF EXIST "%SystemRoot%\System32\curl.exe" (
|
| 164 |
+
"%SystemRoot%\System32\curl.exe" -fsSL "%~1" -o "%~2" && EXIT /B 0
|
| 165 |
+
)
|
| 166 |
+
BITSADMIN /TRANSFER dk1fetch /DOWNLOAD /PRIORITY FOREGROUND "%~1" "%~2" >NUL 2>&1 && EXIT /B 0
|
| 167 |
+
powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "$ProgressPreference='SilentlyContinue'; Invoke-WebRequest -UseBasicParsing -Uri '%~1' -OutFile '%~2'" >NUL 2>&1 && EXIT /B 0
|
| 168 |
+
ECHO dk1: could not download %~1 1>&2
|
| 169 |
+
EXIT /B 1
|
| 170 |
+
|
| 171 |
+
REM :sha256 FILE OUTVAR -- set OUTVAR to the lowercased SHA-256 of FILE.
|
| 172 |
+
:sha256
|
| 173 |
+
SET "%~2="
|
| 174 |
+
FOR /F "usebackq tokens=* delims=" %%H IN (`certutil -hashfile "%~1" SHA256 ^| findstr /R "^[0-9a-fA-F][0-9a-fA-F]*$"`) DO (
|
| 175 |
+
IF NOT DEFINED %~2 SET "%~2=%%H"
|
| 176 |
+
)
|
| 177 |
+
IF DEFINED %~2 SET "%~2=!%~2: =!"
|
| 178 |
+
EXIT /B 0
|
| 179 |
+
|
| 180 |
+
REM :getmanifest VER -- fetch manifest[-VER].txt + .sig into %DK_VDIR%, signify-verify.
|
| 181 |
+
:getmanifest
|
| 182 |
+
IF "%~1"=="" (SET "DK_MURL=%DK_BASE_URL%/manifest.txt") ELSE (SET "DK_MURL=%DK_BASE_URL%/manifest-%~1.txt")
|
| 183 |
+
CALL :fetch "!DK_MURL!" "%DK_VDIR%\manifest"
|
| 184 |
+
IF !ERRORLEVEL! NEQ 0 EXIT /B 1
|
| 185 |
+
CALL :fetch "!DK_MURL!.sig" "%DK_VDIR%\manifest.sig"
|
| 186 |
+
IF !ERRORLEVEL! NEQ 0 EXIT /B 1
|
| 187 |
+
"%DK_SIGNIFY%" -V -q -p "%DK_VDIR%\dk1.pub" -m "%DK_VDIR%\manifest" -x "%DK_VDIR%\manifest.sig"
|
| 188 |
+
IF !ERRORLEVEL! NEQ 0 (ECHO dk1: manifest signature INVALID for !DK_MURL! -- refusing to continue 1>&2 & EXIT /B 1)
|
| 189 |
+
EXIT /B 0
|
| 190 |
+
|
| 191 |
+
REM :mval KEY OUTVAR -- read key=value from the verified %DK_VDIR%\manifest.
|
| 192 |
+
:mval
|
| 193 |
+
SET "%~2="
|
| 194 |
+
FOR /F "usebackq tokens=1,* delims==" %%A IN ("%DK_VDIR%\manifest") DO (
|
| 195 |
+
IF /I "%%A"=="%~1" SET "%~2=%%B"
|
| 196 |
+
)
|
| 197 |
+
EXIT /B 0
|
| 198 |
+
|
| 199 |
+
REM :allowhost URL -- EXIT /B 0 if URL starts with an allowlisted host prefix,
|
| 200 |
+
REM else 1. Defense-in-depth over the signify-verified template (a signed-but-
|
| 201 |
+
REM malicious manifest still cannot redirect the download off a known host).
|
| 202 |
+
:allowhost
|
| 203 |
+
ECHO %~1| findstr /B /L /C:"https://github.com/dkpkg/" /C:"https://gitlab.com/api/v4/projects/60486861/" >NUL 2>&1
|
| 204 |
+
EXIT /B !ERRORLEVEL!
|
| 205 |
+
|
| 206 |
+
REM :readpin -- set DK_PIN to the version between the quotes on the dk.u
|
| 207 |
+
REM actual_version line. The caret-escaped FOR options are how batch uses a
|
| 208 |
+
REM double-quote as a delimiter (a quoted "delims=^"" options string does not work).
|
| 209 |
+
:readpin
|
| 210 |
+
FOR /F usebackq^ tokens^=2^ delims^=^" %%V IN (`findstr /L /C:"actual_version" "%DK_PROJECT_DIR%dk.u"`) DO SET "DK_PIN=%%V"
|
| 211 |
+
EXIT /B 0
|
|
@@ -32,4 +32,4 @@
|
|
| 32 |
(sexplib (>= v0.14.0))
|
| 33 |
(csexp (>= 1.3.2))
|
| 34 |
(lru (>= 0.3.0))
|
| 35 |
-
(dap (>= 1.1.0))))
|
|
|
|
| 32 |
(sexplib (>= v0.14.0))
|
| 33 |
(csexp (>= 1.3.2))
|
| 34 |
(lru (>= 0.3.0))
|
| 35 |
+
(dap (and (>= 1.0.6) (< 1.1.0)))))
|
|
@@ -26,7 +26,7 @@ depends: [
|
|
| 26 |
"sexplib" {>= "v0.14.0"}
|
| 27 |
"csexp" {>= "1.3.2"}
|
| 28 |
"lru" {>= "0.3.0"}
|
| 29 |
-
"dap" {>= "1.1.0"}
|
| 30 |
"odoc" {with-doc}
|
| 31 |
]
|
| 32 |
build: [
|
|
|
|
| 26 |
"sexplib" {>= "v0.14.0"}
|
| 27 |
"csexp" {>= "1.3.2"}
|
| 28 |
"lru" {>= "0.3.0"}
|
| 29 |
+
"dap" {>= "1.0.6" & < "1.1.0"}
|
| 30 |
"odoc" {with-doc}
|
| 31 |
]
|
| 32 |
build: [
|
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Written by dk0. values.unattested.json is a scratch download; do not
|
| 2 |
+
# commit it. The <LIB>.<VER>.values.json import pins and
|
| 3 |
+
# dk-closure-manifest.tsv ARE committed so a fresh clone verifies imports
|
| 4 |
+
# without refetching.
|
| 5 |
+
values.unattested.json
|
|
@@ -0,0 +1,229 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"bundles": [
|
| 3 |
+
{
|
| 4 |
+
"assets": [
|
| 5 |
+
{
|
| 6 |
+
"checksum": {
|
| 7 |
+
"blake2b256": "1471a9db069f2e4bb198ea1a1f9eec7804f1dc893f809411cd0396aac96ed91f"
|
| 8 |
+
},
|
| 9 |
+
"origin": "CommonsBase_Std",
|
| 10 |
+
"path": "CommonsBase_Std-dist-win32.distmeta.cts.1.tracestore",
|
| 11 |
+
"size": 5394
|
| 12 |
+
},
|
| 13 |
+
{
|
| 14 |
+
"checksum": {
|
| 15 |
+
"blake2b256": "621e0f49e1d74e269b69af8696b1289f75fdf731b73b9a51eeb863d933ed933c"
|
| 16 |
+
},
|
| 17 |
+
"indexes": [
|
| 18 |
+
{
|
| 19 |
+
"type": "zip",
|
| 20 |
+
"zip": {
|
| 21 |
+
"local_offset": 0,
|
| 22 |
+
"central_offset": 26077,
|
| 23 |
+
"central_size": 1657,
|
| 24 |
+
"checksum": {
|
| 25 |
+
"blake2b256": "81a7b18d26a163a27f921fcf62cfe43c9b20e578e41a4b7a0ffc8fb59d57c7ef"
|
| 26 |
+
}
|
| 27 |
+
}
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"origin": "CommonsBase_Std",
|
| 31 |
+
"path": "CommonsBase_Std-dist-win32.distmeta.manifest.zip",
|
| 32 |
+
"size": 27734
|
| 33 |
+
},
|
| 34 |
+
{
|
| 35 |
+
"checksum": {
|
| 36 |
+
"blake2b256": "664a6b7c88d2577f5139b65dc3e91c6c630a00728840f9e604f07aaf944bc186"
|
| 37 |
+
},
|
| 38 |
+
"indexes": [
|
| 39 |
+
{
|
| 40 |
+
"type": "zip",
|
| 41 |
+
"zip": {
|
| 42 |
+
"local_offset": 0,
|
| 43 |
+
"central_offset": 23730,
|
| 44 |
+
"central_size": 728,
|
| 45 |
+
"checksum": {
|
| 46 |
+
"blake2b256": "d71646da54933429062d0ac841c02636384f04c2a699ad56711dac3ff6e9f1d3"
|
| 47 |
+
}
|
| 48 |
+
}
|
| 49 |
+
}
|
| 50 |
+
],
|
| 51 |
+
"origin": "CommonsBase_Std",
|
| 52 |
+
"path": "CommonsBase_Std-dist-win32.distmeta.valuestore.zip",
|
| 53 |
+
"size": 24458
|
| 54 |
+
},
|
| 55 |
+
{
|
| 56 |
+
"checksum": {
|
| 57 |
+
"blake2b256": "c05555daf99672e6a6564b642bcc848595b2939846c8d91955af495b6031d661"
|
| 58 |
+
},
|
| 59 |
+
"origin": "CommonsBase_Std",
|
| 60 |
+
"path": "CommonsBase_Std-dist-win32.package.cts.1.tracestore",
|
| 61 |
+
"size": 133822
|
| 62 |
+
},
|
| 63 |
+
{
|
| 64 |
+
"checksum": {
|
| 65 |
+
"blake2b256": "73594f34f3f14dc20a5b10441936e4f6c226bc2c40975368a37914bfc92d9e6b"
|
| 66 |
+
},
|
| 67 |
+
"indexes": [
|
| 68 |
+
{
|
| 69 |
+
"type": "zip",
|
| 70 |
+
"zip": {
|
| 71 |
+
"local_offset": 0,
|
| 72 |
+
"central_offset": 286109832,
|
| 73 |
+
"central_size": 13538,
|
| 74 |
+
"checksum": {
|
| 75 |
+
"blake2b256": "74c1af5a71b8f7bc3155d3e9e6d3a782349c82846cce12a718bffed1338f17ff"
|
| 76 |
+
}
|
| 77 |
+
}
|
| 78 |
+
}
|
| 79 |
+
],
|
| 80 |
+
"origin": "CommonsBase_Std",
|
| 81 |
+
"path": "CommonsBase_Std-dist-win32.package.valuestore.zip",
|
| 82 |
+
"size": 286123370
|
| 83 |
+
}
|
| 84 |
+
],
|
| 85 |
+
"id": "CommonsBase_Std.Distribution@2.6.20260920144347",
|
| 86 |
+
"listing": {
|
| 87 |
+
"origins": [
|
| 88 |
+
{
|
| 89 |
+
"name": "CommonsBase_Std",
|
| 90 |
+
"mirrors": [
|
| 91 |
+
"https://github.com/dkpkg/CommonsBase_Std/releases/download/2.6.20260920144347"
|
| 92 |
+
]
|
| 93 |
+
}
|
| 94 |
+
]
|
| 95 |
+
}
|
| 96 |
+
}
|
| 97 |
+
],
|
| 98 |
+
"distributions": [
|
| 99 |
+
{
|
| 100 |
+
"build": {
|
| 101 |
+
"attestation": {
|
| 102 |
+
"github_slsa_v1_l2": {
|
| 103 |
+
"docs": [
|
| 104 |
+
{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHmTCCBx6gAwIBAgIUQnuqZOeL/PYX2qKb7DZs5BrMm8swCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwOTIwMTQ0NjQ4WhcNMjYwOTIwMTQ1NjQ4WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEle1klWfjzlMi6Z86cJq+nMOgM1gP4NmGWyOctHUUWh4mnTlVm3jZgzxZzUoYR0AOS63hbWc038BGwUE3DGxc+6OCBj0wggY5MA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQU4jidOxLEdZgy2J+eCtWS5pA+fn4wHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8weAYDVR0RAQH/BG4wbIZqaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnL0NvbW1vbnNCYXNlX1N0ZC8uZ2l0aHViL3dvcmtmbG93cy9kaXN0cmlidXRlLTIuNi55bWxAcmVmcy90YWdzLzIuNi4yMDI2MDkyMDE0NDM0NzA5BgorBgEEAYO/MAEBBCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMBIGCisGAQQBg78wAQIEBHB1c2gwNgYKKwYBBAGDvzABAwQoNzEwMDg3NzQ5YTIzNmZjMWRkYmE4MTI4Yzg5ZTEwOTQyZmNiZjQ1YTAyBgorBgEEAYO/MAEEBCQuZ2l0aHViL3dvcmtmbG93cy9kaXN0cmlidXRlLTIuNi55bWwwIwYKKwYBBAGDvzABBQQVZGtwa2cvQ29tbW9uc0Jhc2VfU3RkMCoGCisGAQQBg78wAQYEHHJlZnMvdGFncy8yLjYuMjAyNjA5MjAxNDQzNDcwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMHoGCisGAQQBg78wAQkEbAxqaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnL0NvbW1vbnNCYXNlX1N0ZC8uZ2l0aHViL3dvcmtmbG93cy9kaXN0cmlidXRlLTIuNi55bWxAcmVmcy90YWdzLzIuNi4yMDI2MDkyMDE0NDM0NzA4BgorBgEEAYO/MAEKBCoMKDcxMDA4Nzc0OWEyMzZmYzFkZGJhODEyOGM4OWUxMDk0MmZjYmY0NWEwHQYKKwYBBAGDvzABCwQPDA1naXRodWItaG9zdGVkMDgGCisGAQQBg78wAQwEKgwoaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnL0NvbW1vbnNCYXNlX1N0ZDA4BgorBgEEAYO/MAENBCoMKDcxMDA4Nzc0OWEyMzZmYzFkZGJhODEyOGM4OWUxMDk0MmZjYmY0NWEwLAYKKwYBBAGDvzABDgQeDBxyZWZzL3RhZ3MvMi42LjIwMjYwOTIwMTQ0MzQ3MBoGCisGAQQBg78wAQ8EDAwKMTIyMTEzMjIxNDAoBgorBgEEAYO/MAEQBBoMGGh0dHBzOi8vZ2l0aHViLmNvbS9ka3BrZzAZBgorBgEEAYO/MAERBAsMCTI3ODkxMzUwMDB6BgorBgEEAYO/MAESBGwMamh0dHBzOi8vZ2l0aHViLmNvbS9ka3BrZy9Db21tb25zQmFzZV9TdGQvLmdpdGh1Yi93b3JrZmxvd3MvZGlzdHJpYnV0ZS0yLjYueW1sQHJlZnMvdGFncy8yLjYuMjAyNjA5MjAxNDQzNDcwOAYKKwYBBAGDvzABEwQqDCg3MTAwODc3NDlhMjM2ZmMxZGRiYTgxMjhjODllMTA5NDJmY2JmNDVhMBQGCisGAQQBg78wARQEBgwEcHVzaDBcBgorBgEEAYO/MAEVBE4MTGh0dHBzOi8vZ2l0aHViLmNvbS9ka3BrZy9Db21tb25zQmFzZV9TdGQvYWN0aW9ucy9ydW5zLzM1NTE3NDI3MzQxL2F0dGVtcHRzLzEwFgYKKwYBBAGDvzABFgQIDAZwdWJsaWMwHwYKKwYBBAGDvzABFwQRDA9kay1kaXN0cmlidXRpb24wRgYKKwYBBAGDvzABGAQ4DDZyZXBvOmRrcGtnL0NvbW1vbnNCYXNlX1N0ZDplbnZpcm9ubWVudDpkay1kaXN0cmlidXRpb24wgYsGCisGAQQB1nkCBAIEfQR7AHkAdwDdPTBqxscRMmMZHhyZZzcCokpeuN48rf+HinKALynujgAAAaC/SLfNAAAEAwBIMEYCIQDcSmUidwkBi6osfs9IYltZL9LtvnH6uxRNaZzOKiJt8gIhAN35rxyG+HDtaxG90reCULys0AfAJhJCH3DpZBTyUCo9MAoGCCqGSM49BAMDA2kAMGYCMQDUKeibdIOPBnP8WJwxoQgvsYnVJmpcgLFa+rC8CRoRj3hWCS9nccAUGGFzirqi+U8CMQC8b+Td8u524XlXnAGFOlNMRajf4JfafLZyTe0E3pDL5qmmDWi94JImuYUKpZ1T02E="},"tlogEntries":[{"logIndex":"2900405607","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"dsse","version":"0.0.1"},"integratedTime":"1789915609","inclusionPromise":{"signedEntryTimestamp":"MEUCIDiSAOthsVhc5JyBTLuyCxEjr4MNjGG031gEZuHuTzVuAiEAxmgU2hif2N5gRbbN/vCJQI653nR6QlOS/yMkcvZeRjw="},"inclusionProof":{"logIndex":"2778501345","rootHash":"54yfGQwxpSthbq9d4FGernIJslifTmaJG1TH9lKc+8c=","treeSize":"2778501418","hashes":["6U/Pa3fGSR1hLlnnbVLTi8g1kLqENkut+zGmJndE3NY=","yRgxpMWEXNq5Kp0ExUjioDeMeXwdZk9mnUeEJTniKVI=","hfmOv2gIMBfwbfZ3eFCbEylnD9mt2cQcrhu5b0fPr24=","6WAXl1Pl8B+tYrO5uyeQojpflwGJh6xtRdejfqy7bxI=","NloroRFCp7tUB/jEcazPL0ybyV8zNN0r5xfSAUL9TBs=","Q3SulITUMKHmWKyMvqHsBX6jY9YKYeTkvUkWhObpKpk=","nubMK8dmaAJBamEgpdy2Iwd06mJ17Tl05S/v74jzoEM=","ahfyyd1/jcofWAA6D+pKm9Zg/U/+zvE/QoEVI7ndhYg=","3vWw04XKnNvL/sBSq8Q5q3lU8f7gIYQlY3+4xVmhee0=","87Ij1gpJcc3Dp7oJzHcX6oajiNB5RR0RPUZ3FeBbrhU=","Gh+QmpRczgbt96IrwgbeeD5+XuqMEBW/ImxCK9EOGlA=","OKp70ZrFKEgLWvx9PPC4vZ2nc8ks/D5Pzcg037k0s2Y=","nj9u53dsHqNA5WYl3GQfuWmkxEYjimgFk/RfYqW839Q=","LdA825SeiwdHnEsuLTGEtQ248AUBYlr6G719py1dHeM=","tyO4Oj1UrXex15tzrEEO6sSnE8y8obZWghZ2XixBPtE=","rjDiNJHGnboMYYUH7OSezbKWj3wMXRTHGCLa/SaZ6O4=","mfWjSdNaEfNXxDww6AAOw/NoK9e6z1yKaZm5xvmMabs=","qxzHanAzz57SDdmJe0B7bJK72NTIBbwEMGBBKvDOROw=","xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n2778501418\n54yfGQwxpSthbq9d4FGernIJslifTmaJG1TH9lKc+8c=\n\n— rekor.sigstore.dev wNI9ajBFAiEAlipzrqmrk2akmXpZX1Nw0skiMzwrcEtTsLeAk0gJb+UCIAp7AWLKaOLRUoNA/qEtUHIYpvvpJq2enOQLb4MbtRNu\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiZHNzZSIsInNwZWMiOnsiZW52ZWxvcGVIYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiZjRiNWEwNDkxMzcxNTEzZTRiMTM0NzJhZTI2ZGI1ZWRiYzk1NmVhMWYyZWFhMGZkMjkzOTc0MTFjMzk1YTczMyJ9LCJwYXlsb2FkSGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6Ijc0ZGM3ZTRjNmM4YjM0ZTYzODdjMTVhOGQ2NzdlMWVkMzQzNGRjOWRiZDAyYjE0MGY2NmMzMWUxNmE5MWM4ZDcifSwic2lnbmF0dXJlcyI6W3sic2lnbmF0dXJlIjoiTUVRQ0lCdDBpL2ZVMXR3Y3Vqc29TR0JqQWFNcnFwSFp5a3I2aFRDd1NrZ2VJVXpYQWlBM1JrNjVja0VqakVTZnVNdVdVWXpUS0wvNkxmUW9vL2RjTnB0TVdYMjhLUT09IiwidmVyaWZpZXIiOiJMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VodFZFTkRRbmcyWjBGM1NVSkJaMGxWVVc1MWNWcFBaVXd2VUZsWU1uRkxZamRFV25NMVFuSk5iVGh6ZDBObldVbExiMXBKZW1vd1JVRjNUWGNLVG5wRlZrMUNUVWRCTVZWRlEyaE5UV015Ykc1ak0xSjJZMjFWZFZwSFZqSk5ValIzU0VGWlJGWlJVVVJGZUZaNllWZGtlbVJIT1hsYVV6RndZbTVTYkFwamJURnNXa2RzYUdSSFZYZElhR05PVFdwWmQwOVVTWGROVkZFd1RtcFJORmRvWTA1TmFsbDNUMVJKZDAxVVVURk9hbEUwVjJwQlFVMUdhM2RGZDFsSUNrdHZXa2w2YWpCRFFWRlpTVXR2V2tsNmFqQkVRVkZqUkZGblFVVnNaVEZyYkZkbWFucHNUV2syV2pnMlkwcHhLMjVOVDJkTk1XZFFORTV0UjFkNVQyTUtkRWhWVlZkb05HMXVWR3hXYlROcVdtZDZlRnA2Vlc5WlVqQkJUMU0yTTJoaVYyTXdNemhDUjNkVlJUTkVSM2hqS3paUFEwSnFNSGRuWjFrMVRVRTBSd3BCTVZWa1JIZEZRaTkzVVVWQmQwbElaMFJCVkVKblRsWklVMVZGUkVSQlMwSm5aM0pDWjBWR1FsRmpSRUY2UVdSQ1owNVdTRkUwUlVablVWVTBhbWxrQ2s5NFRFVmtXbWQ1TWtvclpVTjBWMU0xY0VFclptNDBkMGgzV1VSV1VqQnFRa0puZDBadlFWVXpPVkJ3ZWpGWmEwVmFZalZ4VG1wd1MwWlhhWGhwTkZrS1drUTRkMlZCV1VSV1VqQlNRVkZJTDBKSE5IZGlTVnB4WVVoU01HTklUVFpNZVRsdVlWaFNiMlJYU1hWWk1qbDBUREpTY21OSGRHNU1NRTUyWWxjeGRncGliazVEV1ZoT2JGZ3hUakJhUXpoMVdqSnNNR0ZJVm1sTU0yUjJZMjEwYldKSE9UTmplVGxyWVZoT01HTnRiR2xrV0ZKc1RGUkpkVTVwTlRWaVYzaEJDbU50Vm0xamVUa3dXVmRrZWt4NlNYVk9hVFI1VFVSSk1rMUVhM2xOUkVVd1RrUk5NRTU2UVRWQ1oyOXlRbWRGUlVGWlR5OU5RVVZDUWtOMGIyUklVbmNLWTNwdmRrd3pVblpoTWxaMVRHMUdhbVJIYkhaaWJrMTFXakpzTUdGSVZtbGtXRTVzWTIxT2RtSnVVbXhpYmxGMVdUSTVkRTFDU1VkRGFYTkhRVkZSUWdwbk56aDNRVkZKUlVKSVFqRmpNbWQzVG1kWlMwdDNXVUpDUVVkRWRucEJRa0YzVVc5T2VrVjNUVVJuTTA1NlVUVlpWRWw2VG0xYWFrMVhVbXRaYlVVMENrMVVTVFJaZW1jMVdsUkZkMDlVVVhsYWJVNXBXbXBSTVZsVVFYbENaMjl5UW1kRlJVRlpUeTlOUVVWRlFrTlJkVm95YkRCaFNGWnBURE5rZG1OdGRHMEtZa2M1TTJONU9XdGhXRTR3WTIxc2FXUllVbXhNVkVsMVRtazFOV0pYZDNkSmQxbExTM2RaUWtKQlIwUjJla0ZDUWxGUlZscEhkSGRoTW1OMlVUSTVkQXBpVnpsMVl6QkthR015Vm1aVk0xSnJUVU52UjBOcGMwZEJVVkZDWnpjNGQwRlJXVVZJU0Vwc1dtNU5kbVJIUm01amVUaDVUR3BaZFUxcVFYbE9ha0UxQ2sxcVFYaE9SRkY2VGtSamQwOTNXVXRMZDFsQ1FrRkhSSFo2UVVKRFFWRjBSRU4wYjJSSVVuZGplbTkyVEROU2RtRXlWblZNYlVacVpFZHNkbUp1VFhVS1dqSnNNR0ZJVm1sa1dFNXNZMjFPZG1KdVVteGlibEYxV1RJNWRFMUliMGREYVhOSFFWRlJRbWMzT0hkQlVXdEZZa0Y0Y1dGSVVqQmpTRTAyVEhrNWJncGhXRkp2WkZkSmRWa3lPWFJNTWxKeVkwZDBia3d3VG5aaVZ6RjJZbTVPUTFsWVRteFlNVTR3V2tNNGRWb3liREJoU0ZacFRETmtkbU50ZEcxaVJ6a3pDbU41T1d0aFdFNHdZMjFzYVdSWVVteE1WRWwxVG1rMU5XSlhlRUZqYlZadFkzazVNRmxYWkhwTWVrbDFUbWswZVUxRVNUSk5SR3Q1VFVSRk1FNUVUVEFLVG5wQk5FSm5iM0pDWjBWRlFWbFBMMDFCUlV0Q1EyOU5TMFJqZUUxRVFUUk9lbU13VDFkRmVVMTZXbTFaZWtacldrZEthRTlFUlhsUFIwMDBUMWRWZUFwTlJHc3dUVzFhYWxsdFdUQk9WMFYzU0ZGWlMwdDNXVUpDUVVkRWRucEJRa04zVVZCRVFURnVZVmhTYjJSWFNYUmhSemw2WkVkV2EwMUVaMGREYVhOSENrRlJVVUpuTnpoM1FWRjNSVXRuZDI5aFNGSXdZMGhOTmt4NU9XNWhXRkp2WkZkSmRWa3lPWFJNTWxKeVkwZDBia3d3VG5aaVZ6RjJZbTVPUTFsWVRtd0tXREZPTUZwRVFUUkNaMjl5UW1kRlJVRlpUeTlOUVVWT1FrTnZUVXRFWTNoTlJFRTBUbnBqTUU5WFJYbE5lbHB0V1hwR2ExcEhTbWhQUkVWNVQwZE5OQXBQVjFWNFRVUnJNRTF0V21wWmJWa3dUbGRGZDB4QldVdExkMWxDUWtGSFJIWjZRVUpFWjFGbFJFSjRlVnBYV25wTU0xSm9Xak5OZGsxcE5ESk1ha2wzQ2sxcVdYZFBWRWwzVFZSUk1FMTZVVE5OUW05SFEybHpSMEZSVVVKbk56aDNRVkU0UlVSQmQwdE5WRWw1VFZSRmVrMXFTWGhPUkVGdlFtZHZja0puUlVVS1FWbFBMMDFCUlZGQ1FtOU5SMGRvTUdSSVFucFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVhMkV6UW5KYWVrRmFRbWR2Y2tKblJVVkJXVTh2VFVGRlVncENRWE5OUTFSSk0wOUVhM2hOZWxWM1RVUkNOa0puYjNKQ1owVkZRVmxQTDAxQlJWTkNSM2ROWVcxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJDbUpUT1d0aE0wSnlXbms1UkdJeU1YUmlNalY2VVcxR2VscFdPVlJrUjFGMlRHMWtjR1JIYURGWmFUa3pZak5LY2xwdGVIWmtNMDEyV2tkc2VtUklTbkFLV1c1V01GcFRNSGxNYWxsMVpWY3hjMUZJU214YWJrMTJaRWRHYm1ONU9IbE1hbGwxVFdwQmVVNXFRVFZOYWtGNFRrUlJlazVFWTNkUFFWbExTM2RaUWdwQ1FVZEVkbnBCUWtWM1VYRkVRMmN6VFZSQmQwOUVZek5PUkd4b1RXcE5NbHB0VFhoYVIxSnBXVlJuZUUxcWFHcFBSR3hzVFZSQk5VNUVTbTFaTWtwdENrNUVWbWhOUWxGSFEybHpSMEZSVVVKbk56aDNRVkpSUlVKbmQwVmpTRlo2WVVSQ1kwSm5iM0pDWjBWRlFWbFBMMDFCUlZaQ1JUUk5WRWRvTUdSSVFub0tUMms0ZGxveWJEQmhTRlpwVEcxT2RtSlRPV3RoTTBKeVduazVSR0l5TVhSaU1qVjZVVzFHZWxwV09WUmtSMUYyV1ZkT01HRlhPWFZqZVRsNVpGYzFlZ3BNZWsweFRsUkZNMDVFU1ROTmVsRjRUREpHTUdSSFZuUmpTRko2VEhwRmQwWm5XVXRMZDFsQ1FrRkhSSFo2UVVKR1oxRkpSRUZhZDJSWFNuTmhWMDEzQ2toM1dVdExkMWxDUWtGSFJIWjZRVUpHZDFGU1JFRTVhMkY1TVd0aFdFNHdZMjFzYVdSWVVuQmlNalIzVW1kWlMwdDNXVUpDUVVkRWRucEJRa2RCVVRRS1JFUmFlVnBZUW5aUGJWSnlZMGQwYmt3d1RuWmlWekYyWW01T1ExbFlUbXhZTVU0d1drUndiR0p1V25CamJUbDFZbGRXZFdSRWNHdGhlVEZyWVZoT01BcGpiV3hwWkZoU2NHSXlOSGRuV1hOSFEybHpSMEZSVVVJeGJtdERRa0ZKUldaUlVqZEJTR3RCWkhkRVpGQlVRbkY0YzJOU1RXMU5Xa2hvZVZwYWVtTkRDbTlyY0dWMVRqUTRjbVlyU0dsdVMwRk1lVzUxYW1kQlFVRmhReTlUVEdaT1FVRkJSVUYzUWtsTlJWbERTVkZFWTFOdFZXbGtkMnRDYVRadmMyWnpPVWtLV1d4MFdrdzVUSFIyYmtnMmRYaFNUbUZhZWs5TGFVcDBPR2RKYUVGT016VnllSGxISzBoRWRHRjRSemt3Y21WRFZVeDVjekJCWmtGS2FFcERTRE5FY0FwYVFsUjVWVU52T1UxQmIwZERRM0ZIVTAwME9VSkJUVVJCTW10QlRVZFpRMDFSUkZWTFpXbGlaRWxQVUVKdVVEaFhTbmQ0YjFGbmRuTlpibFpLYlhCakNtZE1SbUVyY2tNNFExSnZVbW96YUZkRFV6bHVZMk5CVlVkSFJucHBjbkZwSzFVNFEwMVJRemhpSzFSa09IVTFNalJZYkZodVFVZEdUMnhPVFZKaGFtWUtORXBtWVdaTVdubFVaVEJGTTNCRVREVnhiVzFFVjJrNU5FcEpiWFZaVlV0d1dqRlVNREpGUFFvdExTMHRMVVZPUkNCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2c9PSJ9XX19"}],"timestampVerificationData":{}},"dsseEnvelope":{"payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjEiLCJzdWJqZWN0IjpbeyJuYW1lIjoiLmdpdGlnbm9yZSIsImRpZ2VzdCI6eyJzaGEyNTYiOiJjZGJjYWUxNTEwNWQ2Yjc4MWU2MjA4MTNjNzljN2U4Njg3NDBkNGU5Y2M1M2NlNmY1ZmNiYmMxMjM4N2FkZjRiIn19LHsibmFtZSI6IkNvbW1vbnNCYXNlX1N0ZC1kaXN0LXdpbjMyLmRpc3RtZXRhLmN0cy4xLnRyYWNlc3RvcmUiLCJkaWdlc3QiOnsic2hhMjU2IjoiNDFjM2FiZDAwYWVmYTJkYTBiNTlhNDI1ZDk4NzFhNzVmYTdhNDc5OTE0YmVmOTg4OTFhY2MyNzdiMmUyZDRmZSJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9TdGQtZGlzdC13aW4zMi5kaXN0bWV0YS5tYW5pZmVzdC56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiM2Q3N2QxMjA2MjRlNDJkNTg0NjkwNjgyMDI4ZDJjMzVmYmQwYTZkZDZkZGE2YTRjZGZlOWY0N2IwOThjOGQxOSJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9TdGQtZGlzdC13aW4zMi5kaXN0bWV0YS52YWx1ZXN0b3JlLmluZGV4IiwiZGlnZXN0Ijp7InNoYTI1NiI6IjA3NjFiZTI0ZTg5N2U5OGMwYzMyZDc2OGNjYzJkNWNjZmQ2ZjMwYzY4Y2U3MWY1MTMyYTY0NmQxZjVjMWU0YzYifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfU3RkLWRpc3Qtd2luMzIuZGlzdG1ldGEudmFsdWVzdG9yZS56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiNzk3NDViMTJiODI2YzI4YmNhZjY4YWQ3NGQ0YWEzZTAyYWYzMDg5YTNkMmRkMDMxMTk5NGMxOWM2ZDk4Y2U3MiJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9TdGQtZGlzdC13aW4zMi5wYWNrYWdlLmN0cy4xLnRyYWNlc3RvcmUiLCJkaWdlc3QiOnsic2hhMjU2IjoiOTRhNmIxYWEzYjUyOTRkZDA1OGVlMjc2MmI4Y2JiZjQ2ZWM4MmFjZWFjN2I5ZWU4M2FkNDI5NGRkMmExMjhmOCJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9TdGQtZGlzdC13aW4zMi5wYWNrYWdlLnZhbHVlc3RvcmUuaW5kZXgiLCJkaWdlc3QiOnsic2hhMjU2IjoiN2U1NGIzZTRjZWExOTFmNjNmYTg5MWZkMDcyOGVjNjVjNThkOGQ4M2EzMjc5MjM4NDI3MGNhYjkyMDUxZmYzMCJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9TdGQtZGlzdC13aW4zMi5wYWNrYWdlLnZhbHVlc3RvcmUuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjQyYjQzOTdkOTg5MTA4ZWE2YzE0OTAzZjE1NzViODFmMmVmNjAwOTMwOWRmM2ZmZGY4MDdjMDNiNDU5Y2IwODMifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfU3RkLWRpc3Qtd2luMzIudmFsdWVzLmpzb24iLCJkaWdlc3QiOnsic2hhMjU2IjoiMDEwYTQ1NGRjN2M4OTM3ZGIxZTk2MDlhYmE0NDM5YjRmYzliN2IyNDVjOTI2NDg2M2MxODU1OTA4MzUzMWU0NyJ9fSx7Im5hbWUiOiJ2YWx1ZXMuanNvbiIsImRpZ2VzdCI6eyJzaGEyNTYiOiJhNDJlYmE4MzRiMDRjZDY1MDY5ZTVkMzUxNmMzZDY4OGQ0YWE2Y2U4MDAxMjM1NjE4ODYxZmUwMjdmM2VlZTFjIn19XSwicHJlZGljYXRlVHlwZSI6Imh0dHBzOi8vc2xzYS5kZXYvcHJvdmVuYW5jZS92MSIsInByZWRpY2F0ZSI6eyJidWlsZERlZmluaXRpb24iOnsiYnVpbGRUeXBlIjoiaHR0cHM6Ly9hY3Rpb25zLmdpdGh1Yi5pby9idWlsZHR5cGVzL3dvcmtmbG93L3YxIiwiZXh0ZXJuYWxQYXJhbWV0ZXJzIjp7IndvcmtmbG93Ijp7InJlZiI6InJlZnMvdGFncy8yLjYuMjAyNjA5MjAxNDQzNDciLCJyZXBvc2l0b3J5IjoiaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnL0NvbW1vbnNCYXNlX1N0ZCIsInBhdGgiOiIuZ2l0aHViL3dvcmtmbG93cy9kaXN0cmlidXRlLTIuNi55bWwifX0sImludGVybmFsUGFyYW1ldGVycyI6eyJnaXRodWIiOnsiZXZlbnRfbmFtZSI6InB1c2giLCJyZXBvc2l0b3J5X2lkIjoiMTIyMTEzMjIxNCIsInJlcG9zaXRvcnlfb3duZXJfaWQiOiIyNzg5MTM1MDAiLCJydW5uZXJfZW52aXJvbm1lbnQiOiJnaXRodWItaG9zdGVkIn19LCJyZXNvbHZlZERlcGVuZGVuY2llcyI6W3sidXJpIjoiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9ka3BrZy9Db21tb25zQmFzZV9TdGRAcmVmcy90YWdzLzIuNi4yMDI2MDkyMDE0NDM0NyIsImRpZ2VzdCI6eyJnaXRDb21taXQiOiI3MTAwODc3NDlhMjM2ZmMxZGRiYTgxMjhjODllMTA5NDJmY2JmNDVhIn19XX0sInJ1bkRldGFpbHMiOnsiYnVpbGRlciI6eyJpZCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9ka3BrZy9Db21tb25zQmFzZV9TdGQvLmdpdGh1Yi93b3JrZmxvd3MvZGlzdHJpYnV0ZS0yLjYueW1sQHJlZnMvdGFncy8yLjYuMjAyNjA5MjAxNDQzNDcifSwibWV0YWRhdGEiOnsiaW52b2NhdGlvbklkIjoiaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnL0NvbW1vbnNCYXNlX1N0ZC9hY3Rpb25zL3J1bnMvMzU1MTc0MjczNDEvYXR0ZW1wdHMvMSJ9fX19","payloadType":"application/vnd.in-toto+json","signatures":[{"sig":"MEQCIBt0i/fU1twcujsoSGBjAaMrqpHZykr6hTCwSkgeIUzXAiA3Rk65ckEjjESfuMuWUYzTKL/6LfQoo/dcNptMWX28KQ=="}]}}
|
| 105 |
+
] },
|
| 106 |
+
"github_slsa_v1_l3": {},
|
| 107 |
+
"openbsd_signify": {
|
| 108 |
+
"signature": "untrusted comment: signed by key f012f39422d61ed2\nRWTwEvOUItYe0tfCgKd/tlW9sEzphV1poCzJ5lFcNpeSHZ8YuxrYsKx8GQlTB32tlaMsmKgueNAF+nSzdPLhlEkattW45QfFcgM=\n"
|
| 109 |
+
}
|
| 110 |
+
},
|
| 111 |
+
"build_to_sign": {
|
| 112 |
+
"bundle_canonical": "b2de006a2e13c31a1b930e9b028dbb9f5a00de20b91d0b5244bab6c55122641a",
|
| 113 |
+
"bundle_modver": "CommonsBase_Std.Distribution@2.6.20260920144347",
|
| 114 |
+
"modules": [
|
| 115 |
+
"CommonsBase_Std.Coreutils@0.6.0",
|
| 116 |
+
"CommonsBase_Std.Coreutils@0.8.0",
|
| 117 |
+
"CommonsBase_Std.Distribution@2.6.20260920144347",
|
| 118 |
+
"CommonsBase_Std.Fd@10.3.0", "CommonsBase_Std.S7z@25.1.0",
|
| 119 |
+
"CommonsBase_Std.Toybox@0.8.9",
|
| 120 |
+
"CommonsBase_Std.Apparatus.Nano@0.1.0",
|
| 121 |
+
"CommonsBase_Std.Apparatus.NanoTbz@0.1.0",
|
| 122 |
+
"CommonsBase_Std.Apparatus.NanoZst@0.1.0",
|
| 123 |
+
"CommonsBase_Std.Assets.RustAbi@0.1.0",
|
| 124 |
+
"CommonsBase_Std.Coreutils.Bundle@0.6.0",
|
| 125 |
+
"CommonsBase_Std.Coreutils.Bundle@0.8.0",
|
| 126 |
+
"CommonsBase_Std.Coreutils.Exe@0.6.0",
|
| 127 |
+
"CommonsBase_Std.Coreutils.Exe@0.8.0",
|
| 128 |
+
"CommonsBase_Std.Coreutils.Tar@0.8.0",
|
| 129 |
+
"CommonsBase_Std.Extract.F_TarToZip@0.1.0",
|
| 130 |
+
"CommonsBase_Std.Extract.F_TarToZip@0.1.1",
|
| 131 |
+
"CommonsBase_Std.Extract.F_TarToZip@0.2.0",
|
| 132 |
+
"CommonsBase_Std.Extract.F_TarToZip@0.2.1",
|
| 133 |
+
"CommonsBase_Std.Extract.F_TarToZip@0.3.0",
|
| 134 |
+
"CommonsBase_Std.Extract.F_TarToZip@0.3.1",
|
| 135 |
+
"CommonsBase_Std.Extract.F_Untar@0.1.0",
|
| 136 |
+
"CommonsBase_Std.Extract.F_Untar@0.1.1",
|
| 137 |
+
"CommonsBase_Std.Extract.F_Untar@0.2.0",
|
| 138 |
+
"CommonsBase_Std.Extract.F_Untar@0.2.1",
|
| 139 |
+
"CommonsBase_Std.Extract.F_Untar@0.3.0",
|
| 140 |
+
"CommonsBase_Std.Extract.F_Untar@0.3.1",
|
| 141 |
+
"CommonsBase_Std.Fd.Bundle@10.3.0",
|
| 142 |
+
"CommonsBase_Std.Fd.Tar@10.3.0",
|
| 143 |
+
"CommonsBase_Std.Fd.Tar.Darwin_arm64@10.3.0",
|
| 144 |
+
"CommonsBase_Std.Fd.Tar.Darwin_x86_64@10.3.0",
|
| 145 |
+
"CommonsBase_Std.Fd.Tar.Linux_arm64@10.3.0",
|
| 146 |
+
"CommonsBase_Std.Fd.Tar.Linux_x86@10.3.0",
|
| 147 |
+
"CommonsBase_Std.Fd.Tar.Linux_x86_64@10.3.0",
|
| 148 |
+
"CommonsBase_Std.S7z.Bundle@25.1.0",
|
| 149 |
+
"CommonsBase_Std.S7z.MacLinux7zExe@25.1.0",
|
| 150 |
+
"CommonsBase_Std.S7z.MacLinux7zTar@25.1.0",
|
| 151 |
+
"CommonsBase_Std.S7z.S7zr@25.1.0",
|
| 152 |
+
"CommonsBase_Std.S7z.Windows7zExe@25.1.0"
|
| 153 |
+
],
|
| 154 |
+
"producer_accepts": [],
|
| 155 |
+
"distmeta": {
|
| 156 |
+
"traces": [
|
| 157 |
+
{
|
| 158 |
+
"tag": "cts.1",
|
| 159 |
+
"path": "CommonsBase_Std-dist-win32.distmeta.cts.1.tracestore"
|
| 160 |
+
}
|
| 161 |
+
],
|
| 162 |
+
"values": [
|
| 163 |
+
{
|
| 164 |
+
"path": "CommonsBase_Std-dist-win32.distmeta.valuestore.zip"
|
| 165 |
+
}
|
| 166 |
+
]
|
| 167 |
+
},
|
| 168 |
+
"package": {
|
| 169 |
+
"traces": [
|
| 170 |
+
{
|
| 171 |
+
"tag": "cts.1",
|
| 172 |
+
"path": "CommonsBase_Std-dist-win32.package.cts.1.tracestore"
|
| 173 |
+
}
|
| 174 |
+
],
|
| 175 |
+
"values": [
|
| 176 |
+
{ "path": "CommonsBase_Std-dist-win32.package.valuestore.zip" }
|
| 177 |
+
]
|
| 178 |
+
},
|
| 179 |
+
"script_module_sha256s": [
|
| 180 |
+
"3198432003cb0a0ebb2da7f8d3f50729d0a1b5657fa10a907fcefba2d2b1c03c",
|
| 181 |
+
"42dbd74c950125640171023de44408ee70f3f4b232371d285562eb582cbda410",
|
| 182 |
+
"86defb1b6656d796b7bac298df650533cced4c0d9a39b71c84d5d9b52b84a303",
|
| 183 |
+
"a9bbaa427f7639ed0fa7ee977a8c936984fd99731425c54d9923b054db9a9149",
|
| 184 |
+
"d7de396df11530cf6d76ca4bb2842592298eaad440a06835509eaedb2533b18a",
|
| 185 |
+
"e10eb30ef2a9ffe80fa47e8f929bcf40f59fa4d02902cfc6bfa5c805c336094d"
|
| 186 |
+
]
|
| 187 |
+
}
|
| 188 |
+
},
|
| 189 |
+
"continuations": {
|
| 190 |
+
"attestation": {
|
| 191 |
+
"openbsd_signify": {
|
| 192 |
+
"signature": "untrusted comment: signed by key f012f39422d61ed2\nRWTwEvOUItYe0gzpAbJQl2uQHm6a/ru/M6czxUmSNJFozpqA1f6FUP0mjdnyZg7DwC5w3LqcEo1VtkW3KjuypmVTskl3hBr2jQk=\n"
|
| 193 |
+
}
|
| 194 |
+
},
|
| 195 |
+
"continuations_to_sign": {
|
| 196 |
+
"2.7": {
|
| 197 |
+
"application": { "name": "dk0", "version": "2.4.2+rev-233" },
|
| 198 |
+
"openbsd_signify": {
|
| 199 |
+
"public_key": "untrusted comment: CommonsBase_Std-2.7\nRWSesfERD4t0CfZXffufCrILIaAbo1MAkv71wC4pAb5zY5BnOkzq3yB5\n"
|
| 200 |
+
}
|
| 201 |
+
},
|
| 202 |
+
"2.8": {
|
| 203 |
+
"application": { "name": "dk0", "version": "2.4.2+rev-233" },
|
| 204 |
+
"openbsd_signify": {
|
| 205 |
+
"public_key": "untrusted comment: CommonsBase_Std-2.8\nRWTooNFcmKODlGshCH/ckDm33SWya+8Xfp/B4jc6mGNtN5v6N8gMtU0X\n"
|
| 206 |
+
}
|
| 207 |
+
},
|
| 208 |
+
"3.0": {
|
| 209 |
+
"openbsd_signify": {
|
| 210 |
+
"public_key": "untrusted comment: CommonsBase_Std-3.0\nRWTzxNnZQeugZoU4+2DgxxktaEJKGlEprALP67bac7HPQxAK4ee1WCxk\n"
|
| 211 |
+
}
|
| 212 |
+
}
|
| 213 |
+
}
|
| 214 |
+
},
|
| 215 |
+
"id": "CommonsBase_Std@2.6.20260920144347",
|
| 216 |
+
"license": { "spdx": "Apache-2.0" },
|
| 217 |
+
"producer": {
|
| 218 |
+
"application": { "name": "dk0", "version": "2.4.3+rev-22" },
|
| 219 |
+
"github_slsa_v1_l2": { "repository": "dkpkg/CommonsBase_Std" },
|
| 220 |
+
"openbsd_signify": {
|
| 221 |
+
"public_key": "untrusted comment: CommonsBase_Std-2.6\nRWTwEvOUItYe0u6ALvOER15EmRBMzwb9DEEJrCiJ25gMRzqHhpxtxa5a\n"
|
| 222 |
+
}
|
| 223 |
+
},
|
| 224 |
+
"min_dk_version": "2.4.2.213"
|
| 225 |
+
}
|
| 226 |
+
],
|
| 227 |
+
"forms": [],
|
| 228 |
+
"schema_version": { "major": 1, "minor": 0 }
|
| 229 |
+
}
|
|
@@ -0,0 +1,815 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"bundles": [
|
| 3 |
+
{
|
| 4 |
+
"assets": [
|
| 5 |
+
{
|
| 6 |
+
"checksum": {
|
| 7 |
+
"blake2b256": "1819ec510943ecfd42b950d41995a05d2d7c827f786e592cc6f3b26639f6150a"
|
| 8 |
+
},
|
| 9 |
+
"origin": "CommonsLang_OCaml",
|
| 10 |
+
"path": "CommonsLang_OCaml-Darwin_arm64.distmeta.cts.1.tracestore",
|
| 11 |
+
"size": 259717
|
| 12 |
+
},
|
| 13 |
+
{
|
| 14 |
+
"checksum": {
|
| 15 |
+
"blake2b256": "6ac1e00affe868a6059af96381e03bc8a7ad50c7ac671a352b6abc4bff05308a"
|
| 16 |
+
},
|
| 17 |
+
"indexes": [
|
| 18 |
+
{
|
| 19 |
+
"type": "zip",
|
| 20 |
+
"zip": {
|
| 21 |
+
"local_offset": 0,
|
| 22 |
+
"central_offset": 419972,
|
| 23 |
+
"central_size": 1200,
|
| 24 |
+
"checksum": {
|
| 25 |
+
"blake2b256": "19f43aa1755ed3a9564a626dd2847574aa5d77f4971e232f959d58608c69e07d"
|
| 26 |
+
}
|
| 27 |
+
}
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"origin": "CommonsLang_OCaml",
|
| 31 |
+
"path": "CommonsLang_OCaml-Darwin_arm64.distmeta.manifest.zip",
|
| 32 |
+
"size": 421172
|
| 33 |
+
},
|
| 34 |
+
{
|
| 35 |
+
"checksum": {
|
| 36 |
+
"blake2b256": "e2f61225e166ad84a07e184f419558fac20a8e9b243976c90639ff6095f6e868"
|
| 37 |
+
},
|
| 38 |
+
"indexes": [
|
| 39 |
+
{
|
| 40 |
+
"type": "zip",
|
| 41 |
+
"zip": {
|
| 42 |
+
"local_offset": 0,
|
| 43 |
+
"central_offset": 182312,
|
| 44 |
+
"central_size": 1253,
|
| 45 |
+
"checksum": {
|
| 46 |
+
"blake2b256": "19fcb54c52583457923662d4de743cee18a7a6c4b6c13517221b4077e2589be5"
|
| 47 |
+
}
|
| 48 |
+
}
|
| 49 |
+
}
|
| 50 |
+
],
|
| 51 |
+
"origin": "CommonsLang_OCaml",
|
| 52 |
+
"path": "CommonsLang_OCaml-Darwin_arm64.distmeta.valuestore.zip",
|
| 53 |
+
"size": 183565
|
| 54 |
+
},
|
| 55 |
+
{
|
| 56 |
+
"checksum": {
|
| 57 |
+
"blake2b256": "9d98f3ffa0617a5d45a53213df0593e2bbfc050fb66ac0b47b25ce9a2a45bdbb"
|
| 58 |
+
},
|
| 59 |
+
"origin": "CommonsLang_OCaml",
|
| 60 |
+
"path": "CommonsLang_OCaml-Darwin_arm64.package.cts.1.tracestore",
|
| 61 |
+
"size": 294213
|
| 62 |
+
},
|
| 63 |
+
{
|
| 64 |
+
"checksum": {
|
| 65 |
+
"blake2b256": "720fa29247171726b1893163a2c82d4e1b5c7bd418efd33317e5f641798826c9"
|
| 66 |
+
},
|
| 67 |
+
"indexes": [
|
| 68 |
+
{
|
| 69 |
+
"type": "zip",
|
| 70 |
+
"zip": {
|
| 71 |
+
"local_offset": 0,
|
| 72 |
+
"central_offset": 706117231,
|
| 73 |
+
"central_size": 14063,
|
| 74 |
+
"checksum": {
|
| 75 |
+
"blake2b256": "4c19275a9385d31deb72ded871357fbda893c39274bd96d106d9745e9db98c25"
|
| 76 |
+
}
|
| 77 |
+
}
|
| 78 |
+
}
|
| 79 |
+
],
|
| 80 |
+
"origin": "CommonsLang_OCaml",
|
| 81 |
+
"path": "CommonsLang_OCaml-Darwin_arm64.package.valuestore.zip",
|
| 82 |
+
"size": 706131294
|
| 83 |
+
},
|
| 84 |
+
{
|
| 85 |
+
"checksum": {
|
| 86 |
+
"blake2b256": "77d2b4f7fad963206489ad9137addd5fbd9bdb65cf8499e36f04265926c0a21e"
|
| 87 |
+
},
|
| 88 |
+
"origin": "CommonsLang_OCaml",
|
| 89 |
+
"path": "CommonsLang_OCaml-Darwin_x86_64-Darwin_x86_64.distmeta.cts.1.tracestore",
|
| 90 |
+
"size": 219088
|
| 91 |
+
},
|
| 92 |
+
{
|
| 93 |
+
"checksum": {
|
| 94 |
+
"blake2b256": "86aaf2c8982272b6966038e4a91a4f3de4c569f8a3588753b3507f4f795baff9"
|
| 95 |
+
},
|
| 96 |
+
"indexes": [
|
| 97 |
+
{
|
| 98 |
+
"type": "zip",
|
| 99 |
+
"zip": {
|
| 100 |
+
"local_offset": 0,
|
| 101 |
+
"central_offset": 419962,
|
| 102 |
+
"central_size": 1201,
|
| 103 |
+
"checksum": {
|
| 104 |
+
"blake2b256": "d90a680719ffa0f9946c4833b842222a996f9df08a9bd523c73ddf45a476d3e9"
|
| 105 |
+
}
|
| 106 |
+
}
|
| 107 |
+
}
|
| 108 |
+
],
|
| 109 |
+
"origin": "CommonsLang_OCaml",
|
| 110 |
+
"path": "CommonsLang_OCaml-Darwin_x86_64-Darwin_x86_64.distmeta.manifest.zip",
|
| 111 |
+
"size": 421163
|
| 112 |
+
},
|
| 113 |
+
{
|
| 114 |
+
"checksum": {
|
| 115 |
+
"blake2b256": "b505989c29d44ecb7b22d98e4f2ebfe1acfd9f1c2ec8cf0510e6e16f829a3027"
|
| 116 |
+
},
|
| 117 |
+
"indexes": [
|
| 118 |
+
{
|
| 119 |
+
"type": "zip",
|
| 120 |
+
"zip": {
|
| 121 |
+
"local_offset": 0,
|
| 122 |
+
"central_offset": 166877,
|
| 123 |
+
"central_size": 1148,
|
| 124 |
+
"checksum": {
|
| 125 |
+
"blake2b256": "913884385abe8d577e19753e58412e698f768fe72bbd907ebd9621896774182c"
|
| 126 |
+
}
|
| 127 |
+
}
|
| 128 |
+
}
|
| 129 |
+
],
|
| 130 |
+
"origin": "CommonsLang_OCaml",
|
| 131 |
+
"path": "CommonsLang_OCaml-Darwin_x86_64-Darwin_x86_64.distmeta.valuestore.zip",
|
| 132 |
+
"size": 168025
|
| 133 |
+
},
|
| 134 |
+
{
|
| 135 |
+
"checksum": {
|
| 136 |
+
"blake2b256": "f001aa16d2d8c42ce3f4424452d3bfff6d09f779975d063d7ceba0d73a64d372"
|
| 137 |
+
},
|
| 138 |
+
"origin": "CommonsLang_OCaml",
|
| 139 |
+
"path": "CommonsLang_OCaml-Darwin_x86_64-Darwin_x86_64.package.cts.1.tracestore",
|
| 140 |
+
"size": 263406
|
| 141 |
+
},
|
| 142 |
+
{
|
| 143 |
+
"checksum": {
|
| 144 |
+
"blake2b256": "ce2ddb6fc236c65acc5f79d85544641a7f1445dc47bb6af0a9be222300cce1b0"
|
| 145 |
+
},
|
| 146 |
+
"indexes": [
|
| 147 |
+
{
|
| 148 |
+
"type": "zip",
|
| 149 |
+
"zip": {
|
| 150 |
+
"local_offset": 0,
|
| 151 |
+
"central_offset": 694548893,
|
| 152 |
+
"central_size": 10703,
|
| 153 |
+
"checksum": {
|
| 154 |
+
"blake2b256": "e9cb5f71fc7a150500ab4a401b227e9271126e50d523831bf3084ccd4b9416cd"
|
| 155 |
+
}
|
| 156 |
+
}
|
| 157 |
+
}
|
| 158 |
+
],
|
| 159 |
+
"origin": "CommonsLang_OCaml",
|
| 160 |
+
"path": "CommonsLang_OCaml-Darwin_x86_64-Darwin_x86_64.package.valuestore.zip",
|
| 161 |
+
"size": 694559596
|
| 162 |
+
},
|
| 163 |
+
{
|
| 164 |
+
"checksum": {
|
| 165 |
+
"blake2b256": "77d2b4f7fad963206489ad9137addd5fbd9bdb65cf8499e36f04265926c0a21e"
|
| 166 |
+
},
|
| 167 |
+
"origin": "CommonsLang_OCaml",
|
| 168 |
+
"path": "CommonsLang_OCaml-Linux_x86-Linux_x86.distmeta.cts.1.tracestore",
|
| 169 |
+
"size": 219088
|
| 170 |
+
},
|
| 171 |
+
{
|
| 172 |
+
"checksum": {
|
| 173 |
+
"blake2b256": "1b7d1344c187acd1b6159a73aec5d65d5287f0ebf18bde4d0ce62e97875d7a0c"
|
| 174 |
+
},
|
| 175 |
+
"indexes": [
|
| 176 |
+
{
|
| 177 |
+
"type": "zip",
|
| 178 |
+
"zip": {
|
| 179 |
+
"local_offset": 0,
|
| 180 |
+
"central_offset": 419883,
|
| 181 |
+
"central_size": 1197,
|
| 182 |
+
"checksum": {
|
| 183 |
+
"blake2b256": "d58a6909967392060a6713e6d313ec8722fc77d8a169c5ac044ea786caac0e93"
|
| 184 |
+
}
|
| 185 |
+
}
|
| 186 |
+
}
|
| 187 |
+
],
|
| 188 |
+
"origin": "CommonsLang_OCaml",
|
| 189 |
+
"path": "CommonsLang_OCaml-Linux_x86-Linux_x86.distmeta.manifest.zip",
|
| 190 |
+
"size": 421080
|
| 191 |
+
},
|
| 192 |
+
{
|
| 193 |
+
"checksum": {
|
| 194 |
+
"blake2b256": "b505989c29d44ecb7b22d98e4f2ebfe1acfd9f1c2ec8cf0510e6e16f829a3027"
|
| 195 |
+
},
|
| 196 |
+
"indexes": [
|
| 197 |
+
{
|
| 198 |
+
"type": "zip",
|
| 199 |
+
"zip": {
|
| 200 |
+
"local_offset": 0,
|
| 201 |
+
"central_offset": 166877,
|
| 202 |
+
"central_size": 1148,
|
| 203 |
+
"checksum": {
|
| 204 |
+
"blake2b256": "913884385abe8d577e19753e58412e698f768fe72bbd907ebd9621896774182c"
|
| 205 |
+
}
|
| 206 |
+
}
|
| 207 |
+
}
|
| 208 |
+
],
|
| 209 |
+
"origin": "CommonsLang_OCaml",
|
| 210 |
+
"path": "CommonsLang_OCaml-Linux_x86-Linux_x86.distmeta.valuestore.zip",
|
| 211 |
+
"size": 168025
|
| 212 |
+
},
|
| 213 |
+
{
|
| 214 |
+
"checksum": {
|
| 215 |
+
"blake2b256": "5fad041933c42408a4e88f5cf89cf97ce0da9a09292781c088b66a7908a31020"
|
| 216 |
+
},
|
| 217 |
+
"origin": "CommonsLang_OCaml",
|
| 218 |
+
"path": "CommonsLang_OCaml-Linux_x86-Linux_x86.package.cts.1.tracestore",
|
| 219 |
+
"size": 260591
|
| 220 |
+
},
|
| 221 |
+
{
|
| 222 |
+
"checksum": {
|
| 223 |
+
"blake2b256": "f2bd8030e571d7e9ade9cd55f6d35bb7ab2d3c6818756c11fed57de4c2771055"
|
| 224 |
+
},
|
| 225 |
+
"indexes": [
|
| 226 |
+
{
|
| 227 |
+
"type": "zip",
|
| 228 |
+
"zip": {
|
| 229 |
+
"local_offset": 0,
|
| 230 |
+
"central_offset": 471842706,
|
| 231 |
+
"central_size": 10283,
|
| 232 |
+
"checksum": {
|
| 233 |
+
"blake2b256": "7bfb18b31e52ec73a4038ab4d019a03fdf85d4b4299c9887ce857a2deacfa718"
|
| 234 |
+
}
|
| 235 |
+
}
|
| 236 |
+
}
|
| 237 |
+
],
|
| 238 |
+
"origin": "CommonsLang_OCaml",
|
| 239 |
+
"path": "CommonsLang_OCaml-Linux_x86-Linux_x86.package.valuestore.zip",
|
| 240 |
+
"size": 471852989
|
| 241 |
+
},
|
| 242 |
+
{
|
| 243 |
+
"checksum": {
|
| 244 |
+
"blake2b256": "ef79ef0c6a885b8a1dbd699d11aa74ac2c407789c6d025f2909d3fa1f80f0e6f"
|
| 245 |
+
},
|
| 246 |
+
"origin": "CommonsLang_OCaml",
|
| 247 |
+
"path": "CommonsLang_OCaml-Linux_x86_64-Linux_x86_64.distmeta.cts.1.tracestore",
|
| 248 |
+
"size": 760178
|
| 249 |
+
},
|
| 250 |
+
{
|
| 251 |
+
"checksum": {
|
| 252 |
+
"blake2b256": "21dc901bebc0a21693805b1379f4abbf3d8303c46a3aeaff9b22dc9cf290c501"
|
| 253 |
+
},
|
| 254 |
+
"indexes": [
|
| 255 |
+
{
|
| 256 |
+
"type": "zip",
|
| 257 |
+
"zip": {
|
| 258 |
+
"local_offset": 0,
|
| 259 |
+
"central_offset": 420590,
|
| 260 |
+
"central_size": 1200,
|
| 261 |
+
"checksum": {
|
| 262 |
+
"blake2b256": "145431b17faf5d21beecd727112e89b9d38a4513328fc527966cf51efc94bcc2"
|
| 263 |
+
}
|
| 264 |
+
}
|
| 265 |
+
}
|
| 266 |
+
],
|
| 267 |
+
"origin": "CommonsLang_OCaml",
|
| 268 |
+
"path": "CommonsLang_OCaml-Linux_x86_64-Linux_x86_64.distmeta.manifest.zip",
|
| 269 |
+
"size": 421790
|
| 270 |
+
},
|
| 271 |
+
{
|
| 272 |
+
"checksum": {
|
| 273 |
+
"blake2b256": "8e9bca44b73c17c71666a28454dbd90c14002faf744a0af88735e02ecb5f364a"
|
| 274 |
+
},
|
| 275 |
+
"indexes": [
|
| 276 |
+
{
|
| 277 |
+
"type": "zip",
|
| 278 |
+
"zip": {
|
| 279 |
+
"local_offset": 0,
|
| 280 |
+
"central_offset": 387796,
|
| 281 |
+
"central_size": 3038,
|
| 282 |
+
"checksum": {
|
| 283 |
+
"blake2b256": "cf8ce4e6178400617f347cc8375d7735aa6d50fd1468adcb12a51858388bb6e6"
|
| 284 |
+
}
|
| 285 |
+
}
|
| 286 |
+
}
|
| 287 |
+
],
|
| 288 |
+
"origin": "CommonsLang_OCaml",
|
| 289 |
+
"path": "CommonsLang_OCaml-Linux_x86_64-Linux_x86_64.distmeta.valuestore.zip",
|
| 290 |
+
"size": 390834
|
| 291 |
+
},
|
| 292 |
+
{
|
| 293 |
+
"checksum": {
|
| 294 |
+
"blake2b256": "449f90ca31d7eee2594bcc55558c553495d90bf0340c4ec6d0a12cd628c3f494"
|
| 295 |
+
},
|
| 296 |
+
"origin": "CommonsLang_OCaml",
|
| 297 |
+
"path": "CommonsLang_OCaml-Linux_x86_64-Linux_x86_64.package.cts.1.tracestore",
|
| 298 |
+
"size": 321796
|
| 299 |
+
},
|
| 300 |
+
{
|
| 301 |
+
"checksum": {
|
| 302 |
+
"blake2b256": "8bf420e35bb0dc27d3a576b96a5ac2eea6c211d0844d3f4e797f8069a3cc5c71"
|
| 303 |
+
},
|
| 304 |
+
"indexes": [
|
| 305 |
+
{
|
| 306 |
+
"type": "zip",
|
| 307 |
+
"zip": {
|
| 308 |
+
"local_offset": 0,
|
| 309 |
+
"central_offset": 828855353,
|
| 310 |
+
"central_size": 17108,
|
| 311 |
+
"checksum": {
|
| 312 |
+
"blake2b256": "b4a89f16781fb42d5fa8696d0ac88c50b1599b217a505c8d65d8a741ca05fd07"
|
| 313 |
+
}
|
| 314 |
+
}
|
| 315 |
+
}
|
| 316 |
+
],
|
| 317 |
+
"origin": "CommonsLang_OCaml",
|
| 318 |
+
"path": "CommonsLang_OCaml-Linux_x86_64-Linux_x86_64.package.valuestore.zip",
|
| 319 |
+
"size": 828872461
|
| 320 |
+
},
|
| 321 |
+
{
|
| 322 |
+
"checksum": {
|
| 323 |
+
"blake2b256": "77d2b4f7fad963206489ad9137addd5fbd9bdb65cf8499e36f04265926c0a21e"
|
| 324 |
+
},
|
| 325 |
+
"origin": "CommonsLang_OCaml",
|
| 326 |
+
"path": "CommonsLang_OCaml-Linux_x86_64_musl-Linux_x86_64_musl.distmeta.cts.1.tracestore",
|
| 327 |
+
"size": 219088
|
| 328 |
+
},
|
| 329 |
+
{
|
| 330 |
+
"checksum": {
|
| 331 |
+
"blake2b256": "7c7174f9d2fefc6b9bb31641912c114649a9d1c3b7c6336159b8078001cec2ee"
|
| 332 |
+
},
|
| 333 |
+
"indexes": [
|
| 334 |
+
{
|
| 335 |
+
"type": "zip",
|
| 336 |
+
"zip": {
|
| 337 |
+
"local_offset": 0,
|
| 338 |
+
"central_offset": 420681,
|
| 339 |
+
"central_size": 1205,
|
| 340 |
+
"checksum": {
|
| 341 |
+
"blake2b256": "c24178998535d51de29d8732da3c18526272d09279cc928cfe5569d00d7d0431"
|
| 342 |
+
}
|
| 343 |
+
}
|
| 344 |
+
}
|
| 345 |
+
],
|
| 346 |
+
"origin": "CommonsLang_OCaml",
|
| 347 |
+
"path": "CommonsLang_OCaml-Linux_x86_64_musl-Linux_x86_64_musl.distmeta.manifest.zip",
|
| 348 |
+
"size": 421886
|
| 349 |
+
},
|
| 350 |
+
{
|
| 351 |
+
"checksum": {
|
| 352 |
+
"blake2b256": "b505989c29d44ecb7b22d98e4f2ebfe1acfd9f1c2ec8cf0510e6e16f829a3027"
|
| 353 |
+
},
|
| 354 |
+
"indexes": [
|
| 355 |
+
{
|
| 356 |
+
"type": "zip",
|
| 357 |
+
"zip": {
|
| 358 |
+
"local_offset": 0,
|
| 359 |
+
"central_offset": 166877,
|
| 360 |
+
"central_size": 1148,
|
| 361 |
+
"checksum": {
|
| 362 |
+
"blake2b256": "913884385abe8d577e19753e58412e698f768fe72bbd907ebd9621896774182c"
|
| 363 |
+
}
|
| 364 |
+
}
|
| 365 |
+
}
|
| 366 |
+
],
|
| 367 |
+
"origin": "CommonsLang_OCaml",
|
| 368 |
+
"path": "CommonsLang_OCaml-Linux_x86_64_musl-Linux_x86_64_musl.distmeta.valuestore.zip",
|
| 369 |
+
"size": 168025
|
| 370 |
+
},
|
| 371 |
+
{
|
| 372 |
+
"checksum": {
|
| 373 |
+
"blake2b256": "59293a3f844134ddf9adcbe4f8332e152bebaa9032b7f9f355fcc2c5f34a8b0a"
|
| 374 |
+
},
|
| 375 |
+
"origin": "CommonsLang_OCaml",
|
| 376 |
+
"path": "CommonsLang_OCaml-Linux_x86_64_musl-Linux_x86_64_musl.package.cts.1.tracestore",
|
| 377 |
+
"size": 259146
|
| 378 |
+
},
|
| 379 |
+
{
|
| 380 |
+
"checksum": {
|
| 381 |
+
"blake2b256": "a2e53b5f254d1e077dd919c4ed2264ecabcfc9581cee23bac8f9fc4af7775ad4"
|
| 382 |
+
},
|
| 383 |
+
"indexes": [
|
| 384 |
+
{
|
| 385 |
+
"type": "zip",
|
| 386 |
+
"zip": {
|
| 387 |
+
"local_offset": 0,
|
| 388 |
+
"central_offset": 839537604,
|
| 389 |
+
"central_size": 10073,
|
| 390 |
+
"checksum": {
|
| 391 |
+
"blake2b256": "abc7c04528c6ba9bf45374a2ff6880ddebfb14ae61b0459718ef1f50314dce8e"
|
| 392 |
+
}
|
| 393 |
+
}
|
| 394 |
+
}
|
| 395 |
+
],
|
| 396 |
+
"origin": "CommonsLang_OCaml",
|
| 397 |
+
"path": "CommonsLang_OCaml-Linux_x86_64_musl-Linux_x86_64_musl.package.valuestore.zip",
|
| 398 |
+
"size": 839547677
|
| 399 |
+
},
|
| 400 |
+
{
|
| 401 |
+
"checksum": {
|
| 402 |
+
"blake2b256": "6c2daa6e8fefc06739c4bc4d70c12e2f76de462f7b050234f6d0d8f346b7b3ea"
|
| 403 |
+
},
|
| 404 |
+
"origin": "CommonsLang_OCaml",
|
| 405 |
+
"path": "CommonsLang_OCaml-Windows_x86-Windows_x86.distmeta.cts.1.tracestore",
|
| 406 |
+
"size": 219088
|
| 407 |
+
},
|
| 408 |
+
{
|
| 409 |
+
"checksum": {
|
| 410 |
+
"blake2b256": "cffbacede7443430dc4a3e5435569d769fc9089531cc46ca10d068b39a58e174"
|
| 411 |
+
},
|
| 412 |
+
"indexes": [
|
| 413 |
+
{
|
| 414 |
+
"type": "zip",
|
| 415 |
+
"zip": {
|
| 416 |
+
"local_offset": 0,
|
| 417 |
+
"central_offset": 419958,
|
| 418 |
+
"central_size": 1199,
|
| 419 |
+
"checksum": {
|
| 420 |
+
"blake2b256": "29b053a164888eb781c570abd6e1915560073b35cb9a56d7f6b147b8d21ba597"
|
| 421 |
+
}
|
| 422 |
+
}
|
| 423 |
+
}
|
| 424 |
+
],
|
| 425 |
+
"origin": "CommonsLang_OCaml",
|
| 426 |
+
"path": "CommonsLang_OCaml-Windows_x86-Windows_x86.distmeta.manifest.zip",
|
| 427 |
+
"size": 421157
|
| 428 |
+
},
|
| 429 |
+
{
|
| 430 |
+
"checksum": {
|
| 431 |
+
"blake2b256": "b505989c29d44ecb7b22d98e4f2ebfe1acfd9f1c2ec8cf0510e6e16f829a3027"
|
| 432 |
+
},
|
| 433 |
+
"indexes": [
|
| 434 |
+
{
|
| 435 |
+
"type": "zip",
|
| 436 |
+
"zip": {
|
| 437 |
+
"local_offset": 0,
|
| 438 |
+
"central_offset": 166877,
|
| 439 |
+
"central_size": 1148,
|
| 440 |
+
"checksum": {
|
| 441 |
+
"blake2b256": "913884385abe8d577e19753e58412e698f768fe72bbd907ebd9621896774182c"
|
| 442 |
+
}
|
| 443 |
+
}
|
| 444 |
+
}
|
| 445 |
+
],
|
| 446 |
+
"origin": "CommonsLang_OCaml",
|
| 447 |
+
"path": "CommonsLang_OCaml-Windows_x86-Windows_x86.distmeta.valuestore.zip",
|
| 448 |
+
"size": 168025
|
| 449 |
+
},
|
| 450 |
+
{
|
| 451 |
+
"checksum": {
|
| 452 |
+
"blake2b256": "46435e89f8bd21f0f921ce0e7a5f41fd94804306cb1e3a9b4f3251d69b6003b7"
|
| 453 |
+
},
|
| 454 |
+
"origin": "CommonsLang_OCaml",
|
| 455 |
+
"path": "CommonsLang_OCaml-Windows_x86-Windows_x86.package.cts.1.tracestore",
|
| 456 |
+
"size": 266983
|
| 457 |
+
},
|
| 458 |
+
{
|
| 459 |
+
"checksum": {
|
| 460 |
+
"blake2b256": "ac7299edec63d358ed929968d6aada92a7dced91c0451f693dd7586023af8eb6"
|
| 461 |
+
},
|
| 462 |
+
"indexes": [
|
| 463 |
+
{
|
| 464 |
+
"type": "zip",
|
| 465 |
+
"zip": {
|
| 466 |
+
"local_offset": 0,
|
| 467 |
+
"central_offset": 261334823,
|
| 468 |
+
"central_size": 10493,
|
| 469 |
+
"checksum": {
|
| 470 |
+
"blake2b256": "eb3fa2f933f804545cbafeafb376d3da3f0c9d31625f625cf82a578b8a84a69f"
|
| 471 |
+
}
|
| 472 |
+
}
|
| 473 |
+
}
|
| 474 |
+
],
|
| 475 |
+
"origin": "CommonsLang_OCaml",
|
| 476 |
+
"path": "CommonsLang_OCaml-Windows_x86-Windows_x86.package.valuestore.zip",
|
| 477 |
+
"size": 261345316
|
| 478 |
+
},
|
| 479 |
+
{
|
| 480 |
+
"checksum": {
|
| 481 |
+
"blake2b256": "ef79ef0c6a885b8a1dbd699d11aa74ac2c407789c6d025f2909d3fa1f80f0e6f"
|
| 482 |
+
},
|
| 483 |
+
"origin": "CommonsLang_OCaml",
|
| 484 |
+
"path": "CommonsLang_OCaml-Windows_x86_64.distmeta.cts.1.tracestore",
|
| 485 |
+
"size": 760178
|
| 486 |
+
},
|
| 487 |
+
{
|
| 488 |
+
"checksum": {
|
| 489 |
+
"blake2b256": "8a66fb9d0efb567fc46051713c2316eb62082de50b900e59c85dc1451b7c220c"
|
| 490 |
+
},
|
| 491 |
+
"indexes": [
|
| 492 |
+
{
|
| 493 |
+
"type": "zip",
|
| 494 |
+
"zip": {
|
| 495 |
+
"local_offset": 0,
|
| 496 |
+
"central_offset": 420134,
|
| 497 |
+
"central_size": 1202,
|
| 498 |
+
"checksum": {
|
| 499 |
+
"blake2b256": "185e7de7d66191596495a49aa9ef5e00778437d8b77367e4520af35992e6eba9"
|
| 500 |
+
}
|
| 501 |
+
}
|
| 502 |
+
}
|
| 503 |
+
],
|
| 504 |
+
"origin": "CommonsLang_OCaml",
|
| 505 |
+
"path": "CommonsLang_OCaml-Windows_x86_64.distmeta.manifest.zip",
|
| 506 |
+
"size": 421336
|
| 507 |
+
},
|
| 508 |
+
{
|
| 509 |
+
"checksum": {
|
| 510 |
+
"blake2b256": "8e9bca44b73c17c71666a28454dbd90c14002faf744a0af88735e02ecb5f364a"
|
| 511 |
+
},
|
| 512 |
+
"indexes": [
|
| 513 |
+
{
|
| 514 |
+
"type": "zip",
|
| 515 |
+
"zip": {
|
| 516 |
+
"local_offset": 0,
|
| 517 |
+
"central_offset": 387796,
|
| 518 |
+
"central_size": 3038,
|
| 519 |
+
"checksum": {
|
| 520 |
+
"blake2b256": "cf8ce4e6178400617f347cc8375d7735aa6d50fd1468adcb12a51858388bb6e6"
|
| 521 |
+
}
|
| 522 |
+
}
|
| 523 |
+
}
|
| 524 |
+
],
|
| 525 |
+
"origin": "CommonsLang_OCaml",
|
| 526 |
+
"path": "CommonsLang_OCaml-Windows_x86_64.distmeta.valuestore.zip",
|
| 527 |
+
"size": 390834
|
| 528 |
+
},
|
| 529 |
+
{
|
| 530 |
+
"checksum": {
|
| 531 |
+
"blake2b256": "19b64874498de16248bfbe6b614b7e4860a7b4561d540f262690de4309633e7a"
|
| 532 |
+
},
|
| 533 |
+
"origin": "CommonsLang_OCaml",
|
| 534 |
+
"path": "CommonsLang_OCaml-Windows_x86_64.package.cts.1.tracestore",
|
| 535 |
+
"size": 382661
|
| 536 |
+
},
|
| 537 |
+
{
|
| 538 |
+
"checksum": {
|
| 539 |
+
"blake2b256": "d257c78dd27503631d73b46f6ec3fa9421b660370540bc1ea79521d994805325"
|
| 540 |
+
},
|
| 541 |
+
"indexes": [
|
| 542 |
+
{
|
| 543 |
+
"type": "zip",
|
| 544 |
+
"zip": {
|
| 545 |
+
"local_offset": 0,
|
| 546 |
+
"central_offset": 873766957,
|
| 547 |
+
"central_size": 19418,
|
| 548 |
+
"checksum": {
|
| 549 |
+
"blake2b256": "4d3080718723003fbaff083cd0136c2ec7ee8293e2f5b72fc249a764abfff76d"
|
| 550 |
+
}
|
| 551 |
+
}
|
| 552 |
+
}
|
| 553 |
+
],
|
| 554 |
+
"origin": "CommonsLang_OCaml",
|
| 555 |
+
"path": "CommonsLang_OCaml-Windows_x86_64.package.valuestore.zip",
|
| 556 |
+
"size": 873786375
|
| 557 |
+
}
|
| 558 |
+
],
|
| 559 |
+
"id": "CommonsLang_OCaml.Distribution@0.1.20260920144347",
|
| 560 |
+
"listing": {
|
| 561 |
+
"origins": [
|
| 562 |
+
{
|
| 563 |
+
"name": "CommonsLang_OCaml",
|
| 564 |
+
"mirrors": [
|
| 565 |
+
"https://github.com/dkpkg/CommonsLang_OCaml/releases/download/0.1.20260920144347"
|
| 566 |
+
]
|
| 567 |
+
}
|
| 568 |
+
]
|
| 569 |
+
}
|
| 570 |
+
}
|
| 571 |
+
],
|
| 572 |
+
"distributions": [
|
| 573 |
+
{
|
| 574 |
+
"build": {
|
| 575 |
+
"attestation": {
|
| 576 |
+
"github_slsa_v1_l2": {
|
| 577 |
+
"docs": [
|
| 578 |
+
{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHiTCCBw+gAwIBAgIUTdEGvjV/+RPctkSyPrhGxU4J6RcwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwOTIwMTg1MDAxWhcNMjYwOTIwMTkwMDAxWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUV408k88Q1R/wBHXiyaiMf4fQrnQTJ79zSY1bq4yT+k4doQy1GTqyP+/ORqBo9uT5AQfS0f/owsPqz79918l56OCBi4wggYqMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUXjI+L4VOqPnc1UtEG+huxOjHdpgwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wegYDVR0RAQH/BHAwboZsaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnL0NvbW1vbnNMYW5nX09DYW1sLy5naXRodWIvd29ya2Zsb3dzL2Rpc3RyaWJ1dGUtMC4xLnltbEByZWZzL3RhZ3MvMC4xLjIwMjYwOTIwMTQ0MzQ3MDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wEgYKKwYBBAGDvzABAgQEcHVzaDA2BgorBgEEAYO/MAEDBCgzZDg1ZWNjNDI0ZGI1ZWVmNzBjNzUwOWZmMzJhNzhjODE5ODI0ZGFiMDIGCisGAQQBg78wAQQEJC5naXRodWIvd29ya2Zsb3dzL2Rpc3RyaWJ1dGUtMC4xLnltbDAlBgorBgEEAYO/MAEFBBdka3BrZy9Db21tb25zTGFuZ19PQ2FtbDAqBgorBgEEAYO/MAEGBBxyZWZzL3RhZ3MvMC4xLjIwMjYwOTIwMTQ0MzQ3MDsGCisGAQQBg78wAQgELQwraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTB8BgorBgEEAYO/MAEJBG4MbGh0dHBzOi8vZ2l0aHViLmNvbS9ka3BrZy9Db21tb25zTGFuZ19PQ2FtbC8uZ2l0aHViL3dvcmtmbG93cy9kaXN0cmlidXRlLTAuMS55bWxAcmVmcy90YWdzLzAuMS4yMDI2MDkyMDE0NDM0NzA4BgorBgEEAYO/MAEKBCoMKDNkODVlY2M0MjRkYjVlZWY3MGM3NTA5ZmYzMmE3OGM4MTk4MjRkYWIwHQYKKwYBBAGDvzABCwQPDA1naXRodWItaG9zdGVkMDoGCisGAQQBg78wAQwELAwqaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnL0NvbW1vbnNMYW5nX09DYW1sMDgGCisGAQQBg78wAQ0EKgwoM2Q4NWVjYzQyNGRiNWVlZjcwYzc1MDlmZjMyYTc4YzgxOTgyNGRhYjAsBgorBgEEAYO/MAEOBB4MHHJlZnMvdGFncy8wLjEuMjAyNjA5MjAxNDQzNDcwGgYKKwYBBAGDvzABDwQMDAoxMjIyODc0MTc5MCgGCisGAQQBg78wARAEGgwYaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnMBkGCisGAQQBg78wAREECwwJMjc4OTEzNTAwMHwGCisGAQQBg78wARIEbgxsaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnL0NvbW1vbnNMYW5nX09DYW1sLy5naXRodWIvd29ya2Zsb3dzL2Rpc3RyaWJ1dGUtMC4xLnltbEByZWZzL3RhZ3MvMC4xLjIwMjYwOTIwMTQ0MzQ3MDgGCisGAQQBg78wARMEKgwoM2Q4NWVjYzQyNGRiNWVlZjcwYzc1MDlmZjMyYTc4YzgxOTgyNGRhYjAUBgorBgEEAYO/MAEUBAYMBHB1c2gwXgYKKwYBBAGDvzABFQRQDE5odHRwczovL2dpdGh1Yi5jb20vZGtwa2cvQ29tbW9uc0xhbmdfT0NhbWwvYWN0aW9ucy9ydW5zLzM1NTI3OTU2OTI4L2F0dGVtcHRzLzEwFgYKKwYBBAGDvzABFgQIDAZwdWJsaWMwTQYKKwYBBAGDvzABGAQ/DD1yZXBvOmRrcGtnL0NvbW1vbnNMYW5nX09DYW1sOnJlZjpyZWZzL3RhZ3MvMC4xLjIwMjYwOTIwMTQ0MzQ3MIGKBgorBgEEAdZ5AgQCBHwEegB4AHYA3T0wasbHETJjGR4cmWc3AqJKXrjePK3/h4pygC8p7o4AAAGgwCdgTgAABAMARzBFAiAkad7IivzCkVQhZn4ij/dKMtUdLQsRJBYos3B5RFj4ngIhAN0anD3VWnplhbQnnh+zjzbXkEf6bSDSaW0DWFVkf8YnMAoGCCqGSM49BAMDA2gAMGUCMQD3vnXU49SXYwN+W3TJNQOEvHWC7Gpwl08GY6zUQyfkI5QvaM30EhAPOwNr+ecu78YCMCZTYn+LlRJkXv68Aifzpl+eDSUniVjLW5cgi6VX1t5ySQVWf4sipAlg+Ixt7eQKOg=="},"tlogEntries":[{"logIndex":"2902425149","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"dsse","version":"0.0.1"},"integratedTime":"1789930201","inclusionPromise":{"signedEntryTimestamp":"MEQCID9wGWkL4tTmmOP0WUGLpZ7GkNm/yrchvnWG5Ncw061WAiAroCo5WU8+NYnHO5kmA6a6NJvpqnaE/r7yIpKAU8VgAA=="},"inclusionProof":{"logIndex":"2780520887","rootHash":"x2BTQSt4+BqsCNz48Q/nUDKtVb8X+diVFRmakLhuOC0=","treeSize":"2780520911","hashes":["e47HAPBzl11vfzrSCme3iRIx1NddLhtmUOYHfxQJ35o=","v1DFwi3ROozDOl0dwgpTCweJlP4OypyWEfDa+LtieRc=","IDNCdXCfW/ovvseVdwQyp4KOfjpyGoJDv26jOIm0/+g=","FnNK5UM4YRD4lErAa2ZPOTKHt2pSNhjgx48wM5cbLns=","uTe723lDVNOWU19MS3JgRR3mslxyWTbx0XrCX2W5ML4=","yY3FALo38nlmLkBNuSSzz60NproC+KPq9rUkd3gUx5c=","2g9fji7TNrrWTvMGt57t09+Ry1nDfmW24q3vvY04Ii0=","zm71OIt9beLJ9h/6upMGUpyxpBupJWlGDgOPBOb6o3E=","PnI2d6STSUpsciVs3VH7NpEW8t7iBVaPIIevHGHlMfU=","lhDjYMzedp2RxYBmScsDEtlxuxmtdy7KgwyecAOg3pc=","NHzw2hdxvOoGMsTeU1u997ZhMrU+TK08Ou4Xyz15Tsg=","tXOpGcIJdut1+PYUwhU09yqIExI/sVCDRukM1lZjtuM=","wpaR6ERJhaQBBFEtcUF9PZlw8/pqoS3Z0gDu1wYVLII=","7RcxS0pJxcmGtmMbmh8yAX4q9ikAuy1Yal2AdoW88VQ=","QKbPp61YvxgFORfHJl0dJ7SVftZR6WHgASgOUJ6J2aU=","uoMJ++IgguD5VRdcuqQ23KlKD9ZqrcoC6hqQDy2rPFM=","tyO4Oj1UrXex15tzrEEO6sSnE8y8obZWghZ2XixBPtE=","rjDiNJHGnboMYYUH7OSezbKWj3wMXRTHGCLa/SaZ6O4=","mfWjSdNaEfNXxDww6AAOw/NoK9e6z1yKaZm5xvmMabs=","qxzHanAzz57SDdmJe0B7bJK72NTIBbwEMGBBKvDOROw=","xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n2780520911\nx2BTQSt4+BqsCNz48Q/nUDKtVb8X+diVFRmakLhuOC0=\n\n— rekor.sigstore.dev wNI9ajBFAiB4InmMvUJ55gNYTlY76imGfMcyYV/A/YCYOX2L//LfxQIhAMrdwzzp80lqtXr2zgMvwhRguWSy6jC0AvVA+0vG03D7\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiZHNzZSIsInNwZWMiOnsiZW52ZWxvcGVIYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiYzQwNDNiN2UzZDUyZGQ0Mzc5YjUyZjRmZTNiY2UxZDlhMGVlNmZhZjY5ZTVkNjMyY2I0ZDNlMjVhNzAwNmE5MyJ9LCJwYXlsb2FkSGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6IjY1YTVhM2VhOGFmM2Q1OTcwOTdhODlmNjIxYjUwN2ZiOWY1ODBlNjAxY2Y1NWE1Yjc3NWE5NWQzN2Q0NmQzN2YifSwic2lnbmF0dXJlcyI6W3sic2lnbmF0dXJlIjoiTUVVQ0lRQzErNG5pQlNCblNHd2UvcUFzZEt2VGtFVkVpYnlJMndqRUc2dU52S1loRndJZ0VUYVJaTGxxbXdIMUZ1QngzZ0dsUk5xK1ByVmVML3drUFRTT0hYZnhBcUE9IiwidmVyaWZpZXIiOiJMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VocFZFTkRRbmNyWjBGM1NVSkJaMGxWVkdSRlIzWnFWaThyVWxCamRHdFRlVkJ5YUVkNFZUUktObEpqZDBObldVbExiMXBKZW1vd1JVRjNUWGNLVG5wRlZrMUNUVWRCTVZWRlEyaE5UV015Ykc1ak0xSjJZMjFWZFZwSFZqSk5ValIzU0VGWlJGWlJVVVJGZUZaNllWZGtlbVJIT1hsYVV6RndZbTVTYkFwamJURnNXa2RzYUdSSFZYZElhR05PVFdwWmQwOVVTWGROVkdjeFRVUkJlRmRvWTA1TmFsbDNUMVJKZDAxVWEzZE5SRUY0VjJwQlFVMUdhM2RGZDFsSUNrdHZXa2w2YWpCRFFWRlpTVXR2V2tsNmFqQkVRVkZqUkZGblFVVlZWalF3T0dzNE9GRXhVaTkzUWtoWWFYbGhhVTFtTkdaUmNtNVJWRW8zT1hwVFdURUtZbkUwZVZRcmF6UmtiMUY1TVVkVWNYbFFLeTlQVW5GQ2J6bDFWRFZCVVdaVE1HWXZiM2R6VUhGNk56azVNVGhzTlRaUFEwSnBOSGRuWjFseFRVRTBSd3BCTVZWa1JIZEZRaTkzVVVWQmQwbElaMFJCVkVKblRsWklVMVZGUkVSQlMwSm5aM0pDWjBWR1FsRmpSRUY2UVdSQ1owNVdTRkUwUlVablVWVllha2tyQ2t3MFZrOXhVRzVqTVZWMFJVY3JhSFY0VDJwSVpIQm5kMGgzV1VSV1VqQnFRa0puZDBadlFWVXpPVkJ3ZWpGWmEwVmFZalZ4VG1wd1MwWlhhWGhwTkZrS1drUTRkMlZuV1VSV1VqQlNRVkZJTDBKSVFYZGliMXB6WVVoU01HTklUVFpNZVRsdVlWaFNiMlJYU1hWWk1qbDBUREpTY21OSGRHNU1NRTUyWWxjeGRncGliazVOV1ZjMWJsZ3dPVVJaVnpGelRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2VERKU2NHTXpVbmxoVjBveFpFZFZkRTFETkhoTWJteDBDbUpGUW5sYVYxcDZURE5TYUZvelRYWk5RelI0VEdwSmQwMXFXWGRQVkVsM1RWUlJNRTE2VVROTlJHdEhRMmx6UjBGUlVVSm5OemgzUVZGRlJVc3lhREFLWkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpCaFZ6bDFZM2sxYm1GWVVtOWtWMG94WXpKV2VWa3lPWFZrUjFaMVpFTTFhbUl5TUhkRloxbExTM2RaUWdwQ1FVZEVkbnBCUWtGblVVVmpTRlo2WVVSQk1rSm5iM0pDWjBWRlFWbFBMMDFCUlVSQ1EyZDZXa1JuTVZwWFRtcE9SRWt3V2tkSk1WcFhWbTFPZWtKcUNrNTZWWGRQVjFwdFRYcEthRTU2YUdwUFJFVTFUMFJKTUZwSFJtbE5SRWxIUTJselIwRlJVVUpuTnpoM1FWRlJSVXBETlc1aFdGSnZaRmRKZG1ReU9Ya0tZVEphYzJJelpIcE1NbEp3WXpOU2VXRlhTakZrUjFWMFRVTTBlRXh1YkhSaVJFRnNRbWR2Y2tKblJVVkJXVTh2VFVGRlJrSkNaR3RoTTBKeVduazVSQXBpTWpGMFlqSTFlbFJIUm5WYU1UbFFVVEpHZEdKRVFYRkNaMjl5UW1kRlJVRlpUeTlOUVVWSFFrSjRlVnBYV25wTU0xSm9Xak5OZGsxRE5IaE1ha2wzQ2sxcVdYZFBWRWwzVFZSUk1FMTZVVE5OUkhOSFEybHpSMEZSVVVKbk56aDNRVkZuUlV4UmQzSmhTRkl3WTBoTk5reDVPVEJpTW5Sc1ltazFhRmt6VW5BS1lqSTFla3h0WkhCa1IyZ3hXVzVXZWxwWVNtcGlNalV3V2xjMU1FeHRUblppVkVJNFFtZHZja0puUlVWQldVOHZUVUZGU2tKSE5FMWlSMmd3WkVoQ2VncFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVhMkV6UW5KYWVUbEVZakl4ZEdJeU5YcFVSMFoxV2pFNVVGRXlSblJpUXpoMVdqSnNNR0ZJVm1sTU0yUjJDbU50ZEcxaVJ6a3pZM2s1YTJGWVRqQmpiV3hwWkZoU2JFeFVRWFZOVXpVMVlsZDRRV050Vm0xamVUa3dXVmRrZWt4NlFYVk5VelI1VFVSSk1rMUVhM2tLVFVSRk1FNUVUVEJPZWtFMFFtZHZja0puUlVWQldVOHZUVUZGUzBKRGIwMUxSRTVyVDBSV2JGa3lUVEJOYWxKcldXcFdiRnBYV1ROTlIwMHpUbFJCTlFwYWJWbDZUVzFGTTA5SFRUUk5WR3MwVFdwU2ExbFhTWGRJVVZsTFMzZFpRa0pCUjBSMmVrRkNRM2RSVUVSQk1XNWhXRkp2WkZkSmRHRkhPWHBrUjFackNrMUViMGREYVhOSFFWRlJRbWMzT0hkQlVYZEZURUYzY1dGSVVqQmpTRTAyVEhrNWJtRllVbTlrVjBsMVdUSTVkRXd5VW5KalIzUnVUREJPZG1KWE1YWUtZbTVPVFZsWE5XNVlNRGxFV1ZjeGMwMUVaMGREYVhOSFFWRlJRbWMzT0hkQlVUQkZTMmQzYjAweVVUUk9WMVpxV1hwUmVVNUhVbWxPVjFac1dtcGpkd3BaZW1NeFRVUnNiVnBxVFhsWlZHTTBXWHBuZUU5VVozbE9SMUpvV1dwQmMwSm5iM0pDWjBWRlFWbFBMMDFCUlU5Q1FqUk5TRWhLYkZwdVRYWmtSMFp1Q21ONU9IZE1ha1YxVFdwQmVVNXFRVFZOYWtGNFRrUlJlazVFWTNkSFoxbExTM2RaUWtKQlIwUjJla0ZDUkhkUlRVUkJiM2hOYWtsNVQwUmpNRTFVWXpVS1RVTm5SME5wYzBkQlVWRkNaemM0ZDBGU1FVVkhaM2RaWVVoU01HTklUVFpNZVRsdVlWaFNiMlJYU1hWWk1qbDBUREpTY21OSGRHNU5RbXRIUTJselJ3cEJVVkZDWnpjNGQwRlNSVVZEZDNkS1RXcGpORTlVUlhwT1ZFRjNUVWgzUjBOcGMwZEJVVkZDWnpjNGQwRlNTVVZpWjNoellVaFNNR05JVFRaTWVUbHVDbUZZVW05a1YwbDFXVEk1ZEV3eVVuSmpSM1J1VERCT2RtSlhNWFppYms1TldWYzFibGd3T1VSWlZ6RnpUSGsxYm1GWVVtOWtWMGwyWkRJNWVXRXlXbk1LWWpOa2Vrd3lVbkJqTTFKNVlWZEtNV1JIVlhSTlF6UjRURzVzZEdKRlFubGFWMXA2VEROU2FGb3pUWFpOUXpSNFRHcEpkMDFxV1hkUFZFbDNUVlJSTUFwTmVsRXpUVVJuUjBOcGMwZEJVVkZDWnpjNGQwRlNUVVZMWjNkdlRUSlJORTVYVm1wWmVsRjVUa2RTYVU1WFZteGFhbU4zV1hwak1VMUViRzFhYWsxNUNsbFVZelJaZW1kNFQxUm5lVTVIVW1oWmFrRlZRbWR2Y2tKblJVVkJXVTh2VFVGRlZVSkJXVTFDU0VJeFl6Sm5kMWhuV1V0TGQxbENRa0ZIUkhaNlFVSUtSbEZTVVVSRk5XOWtTRkozWTNwdmRrd3laSEJrUjJneFdXazFhbUl5TUhaYVIzUjNZVEpqZGxFeU9YUmlWemwxWXpCNGFHSnRaR1pVTUU1b1lsZDNkZ3BaVjA0d1lWYzVkV041T1hsa1Z6VjZUSHBOTVU1VVNUTlBWRlV5VDFSSk5Fd3lSakJrUjFaMFkwaFNla3g2UlhkR1oxbExTM2RaUWtKQlIwUjJla0ZDQ2tablVVbEVRVnAzWkZkS2MyRlhUWGRVVVZsTFMzZFpRa0pCUjBSMmVrRkNSMEZSTDBSRU1YbGFXRUoyVDIxU2NtTkhkRzVNTUU1MllsY3hkbUp1VGswS1dWYzFibGd3T1VSWlZ6RnpUMjVLYkZwcWNIbGFWMXA2VEROU2FGb3pUWFpOUXpSNFRHcEpkMDFxV1hkUFZFbDNUVlJSTUUxNlVUTk5TVWRMUW1kdmNncENaMFZGUVdSYU5VRm5VVU5DU0hkRlpXZENORUZJV1VFelZEQjNZWE5pU0VWVVNtcEhValJqYlZkak0wRnhTa3RZY21wbFVFc3pMMmcwY0hsblF6aHdDamR2TkVGQlFVZG5kME5rWjFSblFVRkNRVTFCVW5wQ1JrRnBRV3RoWkRkSmFYWjZRMnRXVVdoYWJqUnBhaTlrUzAxMFZXUk1VWE5TU2tKWmIzTXpRalVLVWtacU5HNW5TV2hCVGpCaGJrUXpWbGR1Y0d4b1lsRnVibWdyZW1wNllsaHJSV1kyWWxORVUyRlhNRVJYUmxaclpqaFpiazFCYjBkRFEzRkhVMDAwT1FwQ1FVMUVRVEpuUVUxSFZVTk5VVVF6ZG01WVZUUTVVMWhaZDA0clZ6TlVTazVSVDBWMlNGZEROMGR3ZDJ3d09FZFpObnBWVVhsbWEwazFVWFpoVFRNd0NrVm9RVkJQZDA1eUsyVmpkVGM0V1VOTlExcFVXVzRyVEd4U1NtdFlkalk0UVdsbWVuQnNLMlZFVTFWdWFWWnFURmMxWTJkcE5sWllNWFExZVZOUlZsY0taalJ6YVhCQmJHY3JTWGgwTjJWUlMwOW5QVDBLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In1dfX0="}],"timestampVerificationData":{}},"dsseEnvelope":{"payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjEiLCJzdWJqZWN0IjpbeyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtRGFyd2luX2FybTY0LmRpc3RtZXRhLmN0cy4xLnRyYWNlc3RvcmUiLCJkaWdlc3QiOnsic2hhMjU2IjoiMjYyYTQzOGFmYTgxNGNlYjU0NjM5ZTBhMjFkMDllMDhhMjdiN2JiNTkzNzU2Njg5OWExNzIyNTM5NDM4Nzc5YyJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1EYXJ3aW5fYXJtNjQuZGlzdG1ldGEubWFuaWZlc3QuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6Ijc2NTY3Yjc2NTcwOWUxODA5NGZlYTFmNDk4MDBiNTY2ZmQyZWEyOWE5NmE5YTRlNTgyZDUxMmM5OGQ5OGVjMTAifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtRGFyd2luX2FybTY0LmRpc3RtZXRhLnZhbHVlc3RvcmUuaW5kZXgiLCJkaWdlc3QiOnsic2hhMjU2IjoiNGJjYmQyMzY1Y2MzYWI0MWNlNGJhMTcwYThhMTIwZGEzNTRmNjJkNmYwMmQ2OGI0ZTdjYWUwOWZmZWJmM2I0YSJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1EYXJ3aW5fYXJtNjQuZGlzdG1ldGEudmFsdWVzdG9yZS56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiNTBlYzhlNTQ0ODRmNTlkMDM3N2ZjOTZiMjIxMTI5MjY3ZWIxZTcyMDZlZThmMzM3MGUxZTdhMGJjYmQ2ZDY1MyJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1EYXJ3aW5fYXJtNjQucGFja2FnZS5jdHMuMS50cmFjZXN0b3JlIiwiZGlnZXN0Ijp7InNoYTI1NiI6ImMzNzhkNjgxMTg0MWY2Y2RjMWE3Yjg5M2VjMWRhZGM2N2Y3MzU1NmEyNjNjMDZhZmI0NDZhNDIxYTNkNjgxNDkifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtRGFyd2luX2FybTY0LnBhY2thZ2UudmFsdWVzdG9yZS5pbmRleCIsImRpZ2VzdCI6eyJzaGEyNTYiOiIyNDFkZmIwOGE3Y2IwODQ2ZDA4ZDQxNzcwMzFlYjRiY2IxODY5MDkxM2E5ZWVjOGU5YjAxYmU0YzI2NTE3ZGVhIn19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLURhcndpbl9hcm02NC5wYWNrYWdlLnZhbHVlc3RvcmUuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6ImVmY2U3YmJiNTkxYTlhZTA1NjNlMTNkMzA4MTgyYjkyZDQ0ZGE4NmI3OTU1NTE3MjhmOTE2YzZlNWRkMWIzM2MifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtRGFyd2luX2FybTY0LnZhbHVlcy5qc29uIiwiZGlnZXN0Ijp7InNoYTI1NiI6ImNlZTAzODJjYWNlZWZhYTJmZGNjN2U5Yjk3OWMzOWFlYjU2ZTdhNTY3MDU3YTIzMDU3MzFjOTU2ZjM5NDAzY2IifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtRGFyd2luX3g4Nl82NC1EYXJ3aW5feDg2XzY0LmRpc3RtZXRhLmN0cy4xLnRyYWNlc3RvcmUiLCJkaWdlc3QiOnsic2hhMjU2IjoiNDAyYTkzZTIwOGVjNTU3ZmYxMTJkZjE4YzY4YzU0NzRhODNhMjg4ZjM4NjMzZmMxODY4MTEzZWI0MTBiNDhhMCJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1EYXJ3aW5feDg2XzY0LURhcndpbl94ODZfNjQuZGlzdG1ldGEubWFuaWZlc3QuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6ImVjOGRkNjhkMDA1MTQ3ZWQ3NzUxNjBiNjFlMGY4NWQ4YWVhMWRkZGY5ZjkzOTI5NDhlM2U1NDllOTFjOTY1NDUifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtRGFyd2luX3g4Nl82NC1EYXJ3aW5feDg2XzY0LmRpc3RtZXRhLnZhbHVlc3RvcmUuaW5kZXgiLCJkaWdlc3QiOnsic2hhMjU2IjoiNjE0MTcxZDk1ZTJhOTlhY2JmYzBjNDkyZDFhOWQ5NTNlZjE0ODY2Njk4OGQ3ZWU4M2Y3N2Y2MjM0NDMyNTQyYiJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1EYXJ3aW5feDg2XzY0LURhcndpbl94ODZfNjQuZGlzdG1ldGEudmFsdWVzdG9yZS56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiMDYwNTkxNTE1Y2I4MWNhZjFlZTFiYWVlNTcwYjZhZDM3NTMzOTJkY2Y1NTk0ZGU3ZDExMDljYzQyYzdiNmVjNiJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1EYXJ3aW5feDg2XzY0LURhcndpbl94ODZfNjQucGFja2FnZS5jdHMuMS50cmFjZXN0b3JlIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjIzODY4ZWIwY2EyMTYxZDZhMDBlOTY5YTBlNjIyZTcyNDFmOTFlNDQxOGVkOGNmMGYyNjIxNDYyMjcwNTIxZGMifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtRGFyd2luX3g4Nl82NC1EYXJ3aW5feDg2XzY0LnBhY2thZ2UudmFsdWVzdG9yZS5pbmRleCIsImRpZ2VzdCI6eyJzaGEyNTYiOiJhZDJkMzU4NjBkNWFhYmU4MDBkNDYwNTkwYjQ1MjkwZDNhNjYyMDhmNTIwMmNiMjFmN2M0MjI1MDBjMjdlNWU0In19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLURhcndpbl94ODZfNjQtRGFyd2luX3g4Nl82NC5wYWNrYWdlLnZhbHVlc3RvcmUuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjA3MzRhYTBjYmU3Njc4YTdhMTA2ZWQ0YTljOTMyYzNkMDE3YzNmMzVkOGFhZmU1ZmU0MzRlODA2M2E0M2Q5MTgifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtRGFyd2luX3g4Nl82NC1EYXJ3aW5feDg2XzY0LnZhbHVlcy5qc29uIiwiZGlnZXN0Ijp7InNoYTI1NiI6ImFlYmUyNmM0YTIzOTQ2MDAwOTQyYzNhMjY2NmU3NjlmMDZjYmZiNTczY2NlODY2NTA1YmEzYjY3OGM1NjlhMmUifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtTGludXhfeDg2LUxpbnV4X3g4Ni5kaXN0bWV0YS5jdHMuMS50cmFjZXN0b3JlIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjQwMmE5M2UyMDhlYzU1N2ZmMTEyZGYxOGM2OGM1NDc0YTgzYTI4OGYzODYzM2ZjMTg2ODExM2ViNDEwYjQ4YTAifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtTGludXhfeDg2LUxpbnV4X3g4Ni5kaXN0bWV0YS5tYW5pZmVzdC56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiZjI0YjY4Y2JjZGY0NTIzMDdiZmIxNzU2OTk5NDVkMzE1N2ZkM2U5NDg3ZDBkNGRhNDM0ZGIyMWFmNjE3MmJjNSJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODYtTGludXhfeDg2LmRpc3RtZXRhLnZhbHVlc3RvcmUuaW5kZXgiLCJkaWdlc3QiOnsic2hhMjU2IjoiNjE0MTcxZDk1ZTJhOTlhY2JmYzBjNDkyZDFhOWQ5NTNlZjE0ODY2Njk4OGQ3ZWU4M2Y3N2Y2MjM0NDMyNTQyYiJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODYtTGludXhfeDg2LmRpc3RtZXRhLnZhbHVlc3RvcmUuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjA2MDU5MTUxNWNiODFjYWYxZWUxYmFlZTU3MGI2YWQzNzUzMzkyZGNmNTU5NGRlN2QxMTA5Y2M0MmM3YjZlYzYifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtTGludXhfeDg2LUxpbnV4X3g4Ni5wYWNrYWdlLmN0cy4xLnRyYWNlc3RvcmUiLCJkaWdlc3QiOnsic2hhMjU2IjoiNjFlYjNkNGM0NWU0NjBhNzU4NmQxMzMyYTRhNzE0MDZhNWQ2MDg0MmFjM2E1MWZkNjk3NzQxYTVkMTQ4YWU0NCJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODYtTGludXhfeDg2LnBhY2thZ2UudmFsdWVzdG9yZS5pbmRleCIsImRpZ2VzdCI6eyJzaGEyNTYiOiIyM2VlOTdhMjQ3OTY5YTM4NmJiZWRmNDU5MTIzM2M1MWQ5OTE2Y2Q1MTRmYTNmMzI4N2MwMzIyMTU5ZmI3Yzk2In19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLUxpbnV4X3g4Ni1MaW51eF94ODYucGFja2FnZS52YWx1ZXN0b3JlLnppcCIsImRpZ2VzdCI6eyJzaGEyNTYiOiJmZDkxODNkMDZhYmQ5OTc0MDIxNmYzM2M2Njk1ZDkzNjI1YjAyMmRkNzY2NDVmODYxOGRhZjgwNDdmODMxM2Y1In19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLUxpbnV4X3g4Ni1MaW51eF94ODYudmFsdWVzLmpzb24iLCJkaWdlc3QiOnsic2hhMjU2IjoiNmZhNzgxNGY5NThiNzk2YTllZGZiMGM5OTExNjNlOTBkNWJlYzVhNzU4OGVlYWVmMzY4NWIzM2RmNTRkMzIxOSJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODZfNjQtTGludXhfeDg2XzY0LmRpc3RtZXRhLmN0cy4xLnRyYWNlc3RvcmUiLCJkaWdlc3QiOnsic2hhMjU2IjoiYjI1NGI4NzNkZjQwYjhmYmIxNTIwNGY1MTczOTUzMzE4NDBlOTFhYzQzYWViM2U1ODUwN2ExNGVmYmUyMGRkOCJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODZfNjQtTGludXhfeDg2XzY0LmRpc3RtZXRhLm1hbmlmZXN0LnppcCIsImRpZ2VzdCI6eyJzaGEyNTYiOiIxOGZmMTU2ZmI2NzRmMWUyMmY2ZWM1MGE3ZjlkZWZhZjEyMzAxZWJkZWZjMGYzODk3OGU1NjE2Mzk2OWI5ODY0In19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLUxpbnV4X3g4Nl82NC1MaW51eF94ODZfNjQuZGlzdG1ldGEudmFsdWVzdG9yZS5pbmRleCIsImRpZ2VzdCI6eyJzaGEyNTYiOiI3Y2I0NzdiZjhlZjY0NDVmMWYyYzZjYmFjYWYwNWE5NWY3ZTEwM2EwYjQyM2Q2ZTdlODg2OWFkNzY1NDRlYzg2In19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLUxpbnV4X3g4Nl82NC1MaW51eF94ODZfNjQuZGlzdG1ldGEudmFsdWVzdG9yZS56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiOTczNmZhYjQxZjU4YmNlZDQ1ZmJjNGEwODY3MzYwOTFlZDcxYzNmOTZhOWY2NmRlNDUyOTMxYWQ0ZjkzMTQ0NSJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODZfNjQtTGludXhfeDg2XzY0LnBhY2thZ2UuY3RzLjEudHJhY2VzdG9yZSIsImRpZ2VzdCI6eyJzaGEyNTYiOiIwOTFlNTllNTdkMjUyMGVlOTVmNDRiMDNhMDFlNzYwNjA2NjBjNjU2NGM5Njg5MDM1YmU2NDhjOTZjODYxYTUyIn19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLUxpbnV4X3g4Nl82NC1MaW51eF94ODZfNjQucGFja2FnZS52YWx1ZXN0b3JlLmluZGV4IiwiZGlnZXN0Ijp7InNoYTI1NiI6ImM5Yjk2MjVmM2YyMDM0ZGFlOTMzMWI4YWQ4YTI5ZTVlZWQ5MDgyZDk2YmE4ZjhkYTgxOTIxYzkxZjA0MTVlM2EifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtTGludXhfeDg2XzY0LUxpbnV4X3g4Nl82NC5wYWNrYWdlLnZhbHVlc3RvcmUuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjQ2Y2Q3ZGIyMzAyNzZjYjQyNTM1MzA4MDIyODkyNDMzMTY3MWNkMzFiNmU2ZjJlNGI0ZjBjMmVlODM5Yjg5MWMifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtTGludXhfeDg2XzY0LUxpbnV4X3g4Nl82NC52YWx1ZXMuanNvbiIsImRpZ2VzdCI6eyJzaGEyNTYiOiIzNjhhOGI2YWNiMjk3NjBjYjU4ODFhMjBiMGQzZGQ2NWE3YzAwMzc3NzNjMGM4NDljMzQ4ZTMwMWM4OWUzYzMxIn19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLUxpbnV4X3g4Nl82NF9tdXNsLUxpbnV4X3g4Nl82NF9tdXNsLmRpc3RtZXRhLmN0cy4xLnRyYWNlc3RvcmUiLCJkaWdlc3QiOnsic2hhMjU2IjoiNDAyYTkzZTIwOGVjNTU3ZmYxMTJkZjE4YzY4YzU0NzRhODNhMjg4ZjM4NjMzZmMxODY4MTEzZWI0MTBiNDhhMCJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODZfNjRfbXVzbC1MaW51eF94ODZfNjRfbXVzbC5kaXN0bWV0YS5tYW5pZmVzdC56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiYTMxNDgxOGJiYmMxYWNhN2E5YjQwY2FiMjY4NTRmNjhkNTJiMzczNzRkZTM2M2FiZTVhYzlkODNjNzBhOWNkOSJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODZfNjRfbXVzbC1MaW51eF94ODZfNjRfbXVzbC5kaXN0bWV0YS52YWx1ZXN0b3JlLmluZGV4IiwiZGlnZXN0Ijp7InNoYTI1NiI6IjYxNDE3MWQ5NWUyYTk5YWNiZmMwYzQ5MmQxYTlkOTUzZWYxNDg2NjY5ODhkN2VlODNmNzdmNjIzNDQzMjU0MmIifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtTGludXhfeDg2XzY0X211c2wtTGludXhfeDg2XzY0X211c2wuZGlzdG1ldGEudmFsdWVzdG9yZS56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiMDYwNTkxNTE1Y2I4MWNhZjFlZTFiYWVlNTcwYjZhZDM3NTMzOTJkY2Y1NTk0ZGU3ZDExMDljYzQyYzdiNmVjNiJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODZfNjRfbXVzbC1MaW51eF94ODZfNjRfbXVzbC5wYWNrYWdlLmN0cy4xLnRyYWNlc3RvcmUiLCJkaWdlc3QiOnsic2hhMjU2IjoiYzU2OWIwZDQ4NDMxYTY1YzYzN2VlODA5MGU2MmNlNjA0NDEyZTYyZjRmYTdmZWRlNGExOWQ0YWI1Yjc4MmQxYyJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODZfNjRfbXVzbC1MaW51eF94ODZfNjRfbXVzbC5wYWNrYWdlLnZhbHVlc3RvcmUuaW5kZXgiLCJkaWdlc3QiOnsic2hhMjU2IjoiZjM2ODdmNzgzOWYyN2QyNzk2YzQzMTdkZmY4MjI3OTBmZDE5OTQ3Y2NhNTlmZTgxMDE5MGNlYmYwN2NlMTY2MyJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODZfNjRfbXVzbC1MaW51eF94ODZfNjRfbXVzbC5wYWNrYWdlLnZhbHVlc3RvcmUuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6ImM1Y2VlZTdkMGZkNDJkNTA4MzBiZWExNWZmYjJkZGE4ZDI1ZjZmNDcxMzY1MjFjOTUxZmIyYzg3ZDQ5YjUzZGQifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtTGludXhfeDg2XzY0X211c2wtTGludXhfeDg2XzY0X211c2wudmFsdWVzLmpzb24iLCJkaWdlc3QiOnsic2hhMjU2IjoiZTE4MmM0ZjY0ZjliNjkyYWUwMzNiYzEzYzJmZWI1MDA2MzRiOWU4NDZiYzU5NjQyMTYzMWEwMDYwNDdlYzkyZiJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1XaW5kb3dzX3g4Ni1XaW5kb3dzX3g4Ni5kaXN0bWV0YS5jdHMuMS50cmFjZXN0b3JlIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjZkZjRiNTBlODc0Mjk1MzU4MzgyMWQzMjljNjNhYTI0Y2M0NWMzNDgwN2Q4MGY0NGNhODk2NDZlMjUwNDRhY2YifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtV2luZG93c194ODYtV2luZG93c194ODYuZGlzdG1ldGEubWFuaWZlc3QuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjczYmZiOThhMjgxYTJjMzU3NjZjMmQ2Njc2NzgzZDk3M2I3MGJkZTUyMzNiNjY1YTc5YjhjMmUyMTUwMDk0Y2QifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtV2luZG93c194ODYtV2luZG93c194ODYuZGlzdG1ldGEudmFsdWVzdG9yZS5pbmRleCIsImRpZ2VzdCI6eyJzaGEyNTYiOiI2MTQxNzFkOTVlMmE5OWFjYmZjMGM0OTJkMWE5ZDk1M2VmMTQ4NjY2OTg4ZDdlZTgzZjc3ZjYyMzQ0MzI1NDJiIn19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLVdpbmRvd3NfeDg2LVdpbmRvd3NfeDg2LmRpc3RtZXRhLnZhbHVlc3RvcmUuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjA2MDU5MTUxNWNiODFjYWYxZWUxYmFlZTU3MGI2YWQzNzUzMzkyZGNmNTU5NGRlN2QxMTA5Y2M0MmM3YjZlYzYifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtV2luZG93c194ODYtV2luZG93c194ODYucGFja2FnZS5jdHMuMS50cmFjZXN0b3JlIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjFiYTQwMTdlNzdkOGNiOTA0MWU4YTgzMDM2OGIyNWQ2Zjk1YzhjYzE5Nzc0YjEyYzljYjJhMDUwZDU4ZWY2NDUifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtV2luZG93c194ODYtV2luZG93c194ODYucGFja2FnZS52YWx1ZXN0b3JlLmluZGV4IiwiZGlnZXN0Ijp7InNoYTI1NiI6IjMyNDc1MGIwNmNhMTFmZjIyYmM0N2E1YzBlNGViYmM0YjlmNGU4NWUzNzMyZTE0Zjg4NjNjMzEyZTcxY2ExMDEifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtV2luZG93c194ODYtV2luZG93c194ODYucGFja2FnZS52YWx1ZXN0b3JlLnppcCIsImRpZ2VzdCI6eyJzaGEyNTYiOiIxMjBhNWVkMzk2MmJkNDA4Y2I5MTM4ODg4ODJlZDdiMjA1N2IxMmJiY2NmYTUyN2RiZjMzNjUwZTY2ZjNhMWRjIn19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLVdpbmRvd3NfeDg2LVdpbmRvd3NfeDg2LnZhbHVlcy5qc29uIiwiZGlnZXN0Ijp7InNoYTI1NiI6ImY3M2EyZjdkOTFhNjViYWExNjg5MmNhZWM3N2E4YmNiYzM3ZTBiZTJmZGE3MzQ4N2JlNjdhODQzZTFhYzU4ZDUifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtV2luZG93c194ODZfNjQuZGlzdG1ldGEuY3RzLjEudHJhY2VzdG9yZSIsImRpZ2VzdCI6eyJzaGEyNTYiOiJiMjU0Yjg3M2RmNDBiOGZiYjE1MjA0ZjUxNzM5NTMzMTg0MGU5MWFjNDNhZWIzZTU4NTA3YTE0ZWZiZTIwZGQ4In19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLVdpbmRvd3NfeDg2XzY0LmRpc3RtZXRhLm1hbmlmZXN0LnppcCIsImRpZ2VzdCI6eyJzaGEyNTYiOiJkOWJlMjYzNmMyOGIxOTIyYTE3OTAzMjI3ZmVlMmM1ZjFjZGU2MDJiZDMzYTFhMjExYWNjZTc5ZjhlZjJhNjJjIn19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLVdpbmRvd3NfeDg2XzY0LmRpc3RtZXRhLnZhbHVlc3RvcmUuaW5kZXgiLCJkaWdlc3QiOnsic2hhMjU2IjoiN2NiNDc3YmY4ZWY2NDQ1ZjFmMmM2Y2JhY2FmMDVhOTVmN2UxMDNhMGI0MjNkNmU3ZTg4NjlhZDc2NTQ0ZWM4NiJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1XaW5kb3dzX3g4Nl82NC5kaXN0bWV0YS52YWx1ZXN0b3JlLnppcCIsImRpZ2VzdCI6eyJzaGEyNTYiOiI5NzM2ZmFiNDFmNThiY2VkNDVmYmM0YTA4NjczNjA5MWVkNzFjM2Y5NmE5ZjY2ZGU0NTI5MzFhZDRmOTMxNDQ1In19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLVdpbmRvd3NfeDg2XzY0LnBhY2thZ2UuY3RzLjEudHJhY2VzdG9yZSIsImRpZ2VzdCI6eyJzaGEyNTYiOiJhNDZlY2RiYzQ4NDQ0NDU2ZTlkYjA4MzU1NGM0ZTEzNzVkODMyZTJhZGU0ODQ3NGM2ZTBhNTNlNmQzNGRjMjRhIn19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLVdpbmRvd3NfeDg2XzY0LnBhY2thZ2UudmFsdWVzdG9yZS5pbmRleCIsImRpZ2VzdCI6eyJzaGEyNTYiOiI2YWI1Zjc1Yjc1MDg3Y2U2ODNiYmEwOTI3MWFhNzY5MWNhNWIyZTgwMmQ0ODVhOTZhYmIyYjhkMWM2OWVhOTY3In19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLVdpbmRvd3NfeDg2XzY0LnBhY2thZ2UudmFsdWVzdG9yZS56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiZWNjM2Y0NjE4ZjE0MzUyODEzNThiZmMzMDM0M2YzN2NhNWJkNTIyMzJlNzA3NGY4MzlkOGMwZmNlMWEyNmIwZiJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1XaW5kb3dzX3g4Nl82NC52YWx1ZXMuanNvbiIsImRpZ2VzdCI6eyJzaGEyNTYiOiJkMDk0MGUyMzEyNDU0YzYxZjBkN2Q2OTVlZDkyYjIxNDFmYzFkYzEyYzVmNWNjOTRlNmFkZmViYjQ3MTEzZmU1In19LHsibmFtZSI6InZhbHVlcy5qc29uIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjczMmFhMGFlMDVhZDYzOWI3OWRkNWViZWVmMDY2MTc4OGE5MTEwZGMwZDdiZjllNDAyNWE5ODdkMjIwOGYzOTEifX1dLCJwcmVkaWNhdGVUeXBlIjoiaHR0cHM6Ly9zbHNhLmRldi9wcm92ZW5hbmNlL3YxIiwicHJlZGljYXRlIjp7ImJ1aWxkRGVmaW5pdGlvbiI6eyJidWlsZFR5cGUiOiJodHRwczovL2FjdGlvbnMuZ2l0aHViLmlvL2J1aWxkdHlwZXMvd29ya2Zsb3cvdjEiLCJleHRlcm5hbFBhcmFtZXRlcnMiOnsid29ya2Zsb3ciOnsicmVmIjoicmVmcy90YWdzLzAuMS4yMDI2MDkyMDE0NDM0NyIsInJlcG9zaXRvcnkiOiJodHRwczovL2dpdGh1Yi5jb20vZGtwa2cvQ29tbW9uc0xhbmdfT0NhbWwiLCJwYXRoIjoiLmdpdGh1Yi93b3JrZmxvd3MvZGlzdHJpYnV0ZS0wLjEueW1sIn19LCJpbnRlcm5hbFBhcmFtZXRlcnMiOnsiZ2l0aHViIjp7ImV2ZW50X25hbWUiOiJwdXNoIiwicmVwb3NpdG9yeV9pZCI6IjEyMjI4NzQxNzkiLCJyZXBvc2l0b3J5X293bmVyX2lkIjoiMjc4OTEzNTAwIiwicnVubmVyX2Vudmlyb25tZW50IjoiZ2l0aHViLWhvc3RlZCJ9fSwicmVzb2x2ZWREZXBlbmRlbmNpZXMiOlt7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vZGtwa2cvQ29tbW9uc0xhbmdfT0NhbWxAcmVmcy90YWdzLzAuMS4yMDI2MDkyMDE0NDM0NyIsImRpZ2VzdCI6eyJnaXRDb21taXQiOiIzZDg1ZWNjNDI0ZGI1ZWVmNzBjNzUwOWZmMzJhNzhjODE5ODI0ZGFiIn19XX0sInJ1bkRldGFpbHMiOnsiYnVpbGRlciI6eyJpZCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9ka3BrZy9Db21tb25zTGFuZ19PQ2FtbC8uZ2l0aHViL3dvcmtmbG93cy9kaXN0cmlidXRlLTAuMS55bWxAcmVmcy90YWdzLzAuMS4yMDI2MDkyMDE0NDM0NyJ9LCJtZXRhZGF0YSI6eyJpbnZvY2F0aW9uSWQiOiJodHRwczovL2dpdGh1Yi5jb20vZGtwa2cvQ29tbW9uc0xhbmdfT0NhbWwvYWN0aW9ucy9ydW5zLzM1NTI3OTU2OTI4L2F0dGVtcHRzLzEifX19fQ==","payloadType":"application/vnd.in-toto+json","signatures":[{"sig":"MEUCIQC1+4niBSBnSGwe/qAsdKvTkEVEibyI2wjEG6uNvKYhFwIgETaRZLlqmwH1FuBx3gGlRNq+PrVeL/wkPTSOHXfxAqA="}]}}
|
| 579 |
+
] },
|
| 580 |
+
"github_slsa_v1_l3": {},
|
| 581 |
+
"openbsd_signify": {}
|
| 582 |
+
},
|
| 583 |
+
"build_to_sign": {
|
| 584 |
+
"bundle_canonical": "e642f7f8d391d3051b99aee6cf7d803e213bcc41b861965a1d993bbcd9dff79b",
|
| 585 |
+
"bundle_modver": "CommonsLang_OCaml.Distribution@0.1.20260920144347",
|
| 586 |
+
"modules": [
|
| 587 |
+
"CommonsLang_OCaml.Base@5.5.0",
|
| 588 |
+
"CommonsLang_OCaml.Distribution@0.1.20260916151007",
|
| 589 |
+
"CommonsLang_OCaml.Distribution@0.1.20260916234322",
|
| 590 |
+
"CommonsLang_OCaml.Distribution@0.1.20260920144347",
|
| 591 |
+
"CommonsLang_OCaml.DkML@4.14.3001",
|
| 592 |
+
"CommonsLang_OCaml.Dune@3.23.2",
|
| 593 |
+
"CommonsLang_OCaml.MSYS2@2026.6.11",
|
| 594 |
+
"CommonsLang_OCaml.Opam@2.5.2",
|
| 595 |
+
"CommonsLang_OCaml.Apparatus.DkMLCleanupSlot@1.0.1",
|
| 596 |
+
"CommonsLang_OCaml.Apparatus.DkMLDetectVsEnvBat@1.0.1",
|
| 597 |
+
"CommonsLang_OCaml.Apparatus.DkMLGlibcEnv@1.0.1",
|
| 598 |
+
"CommonsLang_OCaml.Apparatus.DkMLMuslBuildHost@1.0.1",
|
| 599 |
+
"CommonsLang_OCaml.Apparatus.DkMLMuslEnv@1.0.13",
|
| 600 |
+
"CommonsLang_OCaml.Apparatus.DkMLMuslWrap@1.0.1",
|
| 601 |
+
"CommonsLang_OCaml.Apparatus.DkMLPatchRelocatableVersion@1.0.1",
|
| 602 |
+
"CommonsLang_OCaml.Apparatus.DkMLPatchStandardCompilerEnvWv18@1.0.1",
|
| 603 |
+
"CommonsLang_OCaml.Apparatus.DkMLPieCheck@1.0.1",
|
| 604 |
+
"CommonsLang_OCaml.Apparatus.DkMLRoot@1.0.1",
|
| 605 |
+
"CommonsLang_OCaml.Apparatus.DkMLRunBuildHost@1.0.1",
|
| 606 |
+
"CommonsLang_OCaml.Apparatus.DkMLX86BuildHost@1.0.1",
|
| 607 |
+
"CommonsLang_OCaml.Apparatus.DkMLX86Env@1.0.13",
|
| 608 |
+
"CommonsLang_OCaml.Apparatus.DkMLX86Wrap@1.0.1",
|
| 609 |
+
"CommonsLang_OCaml.Apparatus.DuneBootstrapMsvc@1.0.1",
|
| 610 |
+
"CommonsLang_OCaml.Apparatus.OpamBuildSeqMeta@1.0.1",
|
| 611 |
+
"CommonsLang_OCaml.Apparatus.OpamBuildWin@1.0.1",
|
| 612 |
+
"CommonsLang_OCaml.Apparatus.OpamBuildWinVcvars@1.0.1",
|
| 613 |
+
"CommonsLang_OCaml.Apparatus.OpamBuildWrapper@1.0.12",
|
| 614 |
+
"CommonsLang_OCaml.Apparatus.OpamFileFormat@1.0.1",
|
| 615 |
+
"CommonsLang_OCaml.Apparatus.OpamLockHelper@1.0.19",
|
| 616 |
+
"CommonsLang_OCaml.Apparatus.OpamMccsGlpkStub@1.0.1",
|
| 617 |
+
"CommonsLang_OCaml.Apparatus.OpamMsvsDetectStub@1.0.1",
|
| 618 |
+
"CommonsLang_OCaml.Apparatus.Patches@1.0.1",
|
| 619 |
+
"CommonsLang_OCaml.Apparatus.Scripts@1.0.1",
|
| 620 |
+
"CommonsLang_OCaml.Apparatus.Tables@1.0.1",
|
| 621 |
+
"CommonsLang_OCaml.Apparatus.WineHostShim@1.0.1",
|
| 622 |
+
"CommonsLang_OCaml.Base.Bundle@5.5.0",
|
| 623 |
+
"CommonsLang_OCaml.Base.Unix@5.5.0",
|
| 624 |
+
"CommonsLang_OCaml.Base.Win32@5.5.0",
|
| 625 |
+
"CommonsLang_OCaml.Dk.OpamBuild.Export@1.0.0",
|
| 626 |
+
"CommonsLang_OCaml.Dk.OpamBuild.Export@1.0.29",
|
| 627 |
+
"CommonsLang_OCaml.Dk.OpamBuild.F_BuildLockedClosure@1.0.29",
|
| 628 |
+
"CommonsLang_OCaml.Dk.OpamBuild.F_BuildLockedPackage@1.0.29",
|
| 629 |
+
"CommonsLang_OCaml.Dk.OpamLock.Adopt@1.1.22",
|
| 630 |
+
"CommonsLang_OCaml.Dk.OpamLock.Export@1.1.22",
|
| 631 |
+
"CommonsLang_OCaml.Dk.OpamLock.GenerateDriver@1.1.22",
|
| 632 |
+
"CommonsLang_OCaml.Dk.OpamLock.GenerateFinal@1.1.22",
|
| 633 |
+
"CommonsLang_OCaml.Dk.OpamLock.GenerateForms@1.1.22",
|
| 634 |
+
"CommonsLang_OCaml.Dk.OpamLock.GenerateSrc@1.1.22",
|
| 635 |
+
"CommonsLang_OCaml.Dk.OpamLock.OpamVenv@1.1.22",
|
| 636 |
+
"CommonsLang_OCaml.Dk.OpamLock.Refresh@1.1.22",
|
| 637 |
+
"CommonsLang_OCaml.Dk.OpamLock.Solve@1.1.22",
|
| 638 |
+
"CommonsLang_OCaml.DkML.Bundle@4.14.3001",
|
| 639 |
+
"CommonsLang_OCaml.DkML.FlexdllSourceTree@0.43.0",
|
| 640 |
+
"CommonsLang_OCaml.DkML.OCamlSourceTree@4.14.3001",
|
| 641 |
+
"CommonsLang_OCaml.DkML.Unix@4.14.3001",
|
| 642 |
+
"CommonsLang_OCaml.DkML.Win32@4.14.3001",
|
| 643 |
+
"CommonsLang_OCaml.DkML.RuntimeCommon.Bundle@2.4.2-26",
|
| 644 |
+
"CommonsLang_OCaml.Dune.Bundle@3.23.1",
|
| 645 |
+
"CommonsLang_OCaml.Dune.Unix@3.23.2",
|
| 646 |
+
"CommonsLang_OCaml.Dune.Win32@3.23.2",
|
| 647 |
+
"CommonsLang_OCaml.MSYS2.Bundle@2026.6.11",
|
| 648 |
+
"CommonsLang_OCaml.MSYS2.Zip.Base@2026.6.11",
|
| 649 |
+
"CommonsLang_OCaml.MSYS2.Zip.Diffutils@2026.6.11",
|
| 650 |
+
"CommonsLang_OCaml.MSYS2.Zip.Dos2unix@2026.6.11",
|
| 651 |
+
"CommonsLang_OCaml.MSYS2.Zip.Libxxhash@2026.6.11",
|
| 652 |
+
"CommonsLang_OCaml.MSYS2.Zip.Patch@2026.6.11",
|
| 653 |
+
"CommonsLang_OCaml.MSYS2.Zip.Popt@2026.6.11",
|
| 654 |
+
"CommonsLang_OCaml.MSYS2.Zip.Rsync@2026.6.11",
|
| 655 |
+
"CommonsLang_OCaml.MSYS2.Zip.Unzip@2026.6.11",
|
| 656 |
+
"CommonsLang_OCaml.MuslCC.Bundle@11.2.1",
|
| 657 |
+
"CommonsLang_OCaml.Opam.Bundle@2.5.1",
|
| 658 |
+
"CommonsLang_OCaml.Opam.Unix@2.5.2",
|
| 659 |
+
"CommonsLang_OCaml.Opam.Menhir.Bundle@2025.9.3",
|
| 660 |
+
"CommonsLang_OCaml.Opam.Win32.X64@2.5.2",
|
| 661 |
+
"CommonsLang_OCaml.Opam.Win32.X86@2.5.2"
|
| 662 |
+
],
|
| 663 |
+
"producer_accepts": [],
|
| 664 |
+
"distmeta": {
|
| 665 |
+
"traces": [
|
| 666 |
+
{
|
| 667 |
+
"tag": "cts.1",
|
| 668 |
+
"path": "CommonsLang_OCaml-Darwin_arm64.distmeta.cts.1.tracestore"
|
| 669 |
+
},
|
| 670 |
+
{
|
| 671 |
+
"tag": "cts.1",
|
| 672 |
+
"path": "CommonsLang_OCaml-Darwin_x86_64-Darwin_x86_64.distmeta.cts.1.tracestore"
|
| 673 |
+
},
|
| 674 |
+
{
|
| 675 |
+
"tag": "cts.1",
|
| 676 |
+
"path": "CommonsLang_OCaml-Linux_x86-Linux_x86.distmeta.cts.1.tracestore"
|
| 677 |
+
},
|
| 678 |
+
{
|
| 679 |
+
"tag": "cts.1",
|
| 680 |
+
"path": "CommonsLang_OCaml-Linux_x86_64-Linux_x86_64.distmeta.cts.1.tracestore"
|
| 681 |
+
},
|
| 682 |
+
{
|
| 683 |
+
"tag": "cts.1",
|
| 684 |
+
"path": "CommonsLang_OCaml-Linux_x86_64_musl-Linux_x86_64_musl.distmeta.cts.1.tracestore"
|
| 685 |
+
},
|
| 686 |
+
{
|
| 687 |
+
"tag": "cts.1",
|
| 688 |
+
"path": "CommonsLang_OCaml-Windows_x86-Windows_x86.distmeta.cts.1.tracestore"
|
| 689 |
+
},
|
| 690 |
+
{
|
| 691 |
+
"tag": "cts.1",
|
| 692 |
+
"path": "CommonsLang_OCaml-Windows_x86_64.distmeta.cts.1.tracestore"
|
| 693 |
+
}
|
| 694 |
+
],
|
| 695 |
+
"values": [
|
| 696 |
+
{
|
| 697 |
+
"path": "CommonsLang_OCaml-Darwin_arm64.distmeta.valuestore.zip"
|
| 698 |
+
},
|
| 699 |
+
{
|
| 700 |
+
"path": "CommonsLang_OCaml-Darwin_x86_64-Darwin_x86_64.distmeta.valuestore.zip"
|
| 701 |
+
},
|
| 702 |
+
{
|
| 703 |
+
"path": "CommonsLang_OCaml-Linux_x86-Linux_x86.distmeta.valuestore.zip"
|
| 704 |
+
},
|
| 705 |
+
{
|
| 706 |
+
"path": "CommonsLang_OCaml-Linux_x86_64-Linux_x86_64.distmeta.valuestore.zip"
|
| 707 |
+
},
|
| 708 |
+
{
|
| 709 |
+
"path": "CommonsLang_OCaml-Linux_x86_64_musl-Linux_x86_64_musl.distmeta.valuestore.zip"
|
| 710 |
+
},
|
| 711 |
+
{
|
| 712 |
+
"path": "CommonsLang_OCaml-Windows_x86-Windows_x86.distmeta.valuestore.zip"
|
| 713 |
+
},
|
| 714 |
+
{
|
| 715 |
+
"path": "CommonsLang_OCaml-Windows_x86_64.distmeta.valuestore.zip"
|
| 716 |
+
}
|
| 717 |
+
]
|
| 718 |
+
},
|
| 719 |
+
"package": {
|
| 720 |
+
"traces": [
|
| 721 |
+
{
|
| 722 |
+
"tag": "cts.1",
|
| 723 |
+
"path": "CommonsLang_OCaml-Darwin_arm64.package.cts.1.tracestore"
|
| 724 |
+
},
|
| 725 |
+
{
|
| 726 |
+
"tag": "cts.1",
|
| 727 |
+
"path": "CommonsLang_OCaml-Darwin_x86_64-Darwin_x86_64.package.cts.1.tracestore"
|
| 728 |
+
},
|
| 729 |
+
{
|
| 730 |
+
"tag": "cts.1",
|
| 731 |
+
"path": "CommonsLang_OCaml-Linux_x86-Linux_x86.package.cts.1.tracestore"
|
| 732 |
+
},
|
| 733 |
+
{
|
| 734 |
+
"tag": "cts.1",
|
| 735 |
+
"path": "CommonsLang_OCaml-Linux_x86_64-Linux_x86_64.package.cts.1.tracestore"
|
| 736 |
+
},
|
| 737 |
+
{
|
| 738 |
+
"tag": "cts.1",
|
| 739 |
+
"path": "CommonsLang_OCaml-Linux_x86_64_musl-Linux_x86_64_musl.package.cts.1.tracestore"
|
| 740 |
+
},
|
| 741 |
+
{
|
| 742 |
+
"tag": "cts.1",
|
| 743 |
+
"path": "CommonsLang_OCaml-Windows_x86-Windows_x86.package.cts.1.tracestore"
|
| 744 |
+
},
|
| 745 |
+
{
|
| 746 |
+
"tag": "cts.1",
|
| 747 |
+
"path": "CommonsLang_OCaml-Windows_x86_64.package.cts.1.tracestore"
|
| 748 |
+
}
|
| 749 |
+
],
|
| 750 |
+
"values": [
|
| 751 |
+
{
|
| 752 |
+
"path": "CommonsLang_OCaml-Darwin_arm64.package.valuestore.zip"
|
| 753 |
+
},
|
| 754 |
+
{
|
| 755 |
+
"path": "CommonsLang_OCaml-Darwin_x86_64-Darwin_x86_64.package.valuestore.zip"
|
| 756 |
+
},
|
| 757 |
+
{
|
| 758 |
+
"path": "CommonsLang_OCaml-Linux_x86-Linux_x86.package.valuestore.zip"
|
| 759 |
+
},
|
| 760 |
+
{
|
| 761 |
+
"path": "CommonsLang_OCaml-Linux_x86_64-Linux_x86_64.package.valuestore.zip"
|
| 762 |
+
},
|
| 763 |
+
{
|
| 764 |
+
"path": "CommonsLang_OCaml-Linux_x86_64_musl-Linux_x86_64_musl.package.valuestore.zip"
|
| 765 |
+
},
|
| 766 |
+
{
|
| 767 |
+
"path": "CommonsLang_OCaml-Windows_x86-Windows_x86.package.valuestore.zip"
|
| 768 |
+
},
|
| 769 |
+
{
|
| 770 |
+
"path": "CommonsLang_OCaml-Windows_x86_64.package.valuestore.zip"
|
| 771 |
+
}
|
| 772 |
+
]
|
| 773 |
+
},
|
| 774 |
+
"script_module_sha256s": [
|
| 775 |
+
"2c008b1284de7c17ccda33e6fff84766276b5f412ee1ba66f6b4ec1ed1e375ff",
|
| 776 |
+
"c30e27473d1542c87d82b67f81d15a62f0d42189a4e4230f79398e87bbc66d1d"
|
| 777 |
+
]
|
| 778 |
+
}
|
| 779 |
+
},
|
| 780 |
+
"continuations": {
|
| 781 |
+
"attestation": {
|
| 782 |
+
"openbsd_signify": {
|
| 783 |
+
"signature": "untrusted comment: signed by key 2b19619c380dd657\nRWQrGWGcOA3WV/SC5szyffbUIzdMAOjD33Y9fQe9ngEw7QoRVn5420I7hpPpiOR1WF4pLrxV5L0AHe3zRd7zAHSOjc/0d8TwsAU=\n"
|
| 784 |
+
}
|
| 785 |
+
},
|
| 786 |
+
"continuations_to_sign": {
|
| 787 |
+
"0.2": {
|
| 788 |
+
"application": { "name": "dk0", "version": "2.4.2+rev-253" },
|
| 789 |
+
"openbsd_signify": {
|
| 790 |
+
"public_key": "untrusted comment: CommonsLang_OCaml-0.2\nRWRnKsyKvFT87Z/voU2a8RFDBjdtzKzfcFgCn+eTXCTheCs3Nd2BGz0H\n"
|
| 791 |
+
}
|
| 792 |
+
},
|
| 793 |
+
"1.0": {
|
| 794 |
+
"application": { "name": "dk0", "version": "2.4.2+rev-253" },
|
| 795 |
+
"openbsd_signify": {
|
| 796 |
+
"public_key": "untrusted comment: CommonsLang_OCaml-1.0\nRWRLh0MTaL/vE2fN07NUPRSEHBMs2FZpBBSCi++qsCUY3vHSttJWh66e\n"
|
| 797 |
+
}
|
| 798 |
+
}
|
| 799 |
+
}
|
| 800 |
+
},
|
| 801 |
+
"id": "CommonsLang_OCaml@0.1.20260920144347",
|
| 802 |
+
"license": { "spdx": "Apache-2.0" },
|
| 803 |
+
"producer": {
|
| 804 |
+
"application": { "name": "dk0", "version": "2.4.3+rev-22" },
|
| 805 |
+
"github_slsa_v1_l2": { "repository": "dkpkg/CommonsLang_OCaml" },
|
| 806 |
+
"openbsd_signify": {
|
| 807 |
+
"public_key": "untrusted comment: CommonsLang_OCaml-0.1\nRWQrGWGcOA3WV93QbuXdm8aAWjDkYvCM5jgFAanfDRiW9n3PzSvLESmR\n"
|
| 808 |
+
}
|
| 809 |
+
},
|
| 810 |
+
"min_dk_version": "2.4.2.213"
|
| 811 |
+
}
|
| 812 |
+
],
|
| 813 |
+
"forms": [],
|
| 814 |
+
"schema_version": { "major": 1, "minor": 0 }
|
| 815 |
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# dk closure manifest v1: library version values_file_sha256 source
|
| 2 |
+
CommonsBase_Build 0.1.20260913085659 12b5a47d353d5abe52580ec47ff3c309107aee4594e6d52544a76b447216ed65 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 3 |
+
CommonsBase_Build 0.1.20260916234322 4843aa52a49cc9c02574562407e196893c8f786a62674574de028b86b6fac751 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 4 |
+
CommonsBase_Build 0.1.20260920144347 eb05f811a4e114f46ab25b978a3728467d00149023b83cc6267021ffc5ac67af etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 5 |
+
CommonsBase_FileMagic 0.1.20260913085659 ac662bb7e78faddf667b007df133157d9f588fb635e5edbfdccc830a8823abdb etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 6 |
+
CommonsBase_FileMagic 0.1.20260916234322 bdd8c70111bffdd6666e7dc2ff74bd92ce62faa64b2542fe217f321094a1c668 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 7 |
+
CommonsBase_FileMagic 0.1.20260920144347 9795f60a23f3135597b06cf41d13983757f1488f71dc301e0a90f85834a340d7 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 8 |
+
CommonsBase_GNU 0.1.20260913085659 9500243faab7e00ea8c604e4b6ace72f8784587fcee453f3959304934d37c5d1 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 9 |
+
CommonsBase_GNU 0.1.20260916234322 b244854bfcba1585234befef8d966f5fce276df458829850d926c2d5869beb34 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 10 |
+
CommonsBase_GNU 0.1.20260920144347 53e60fcbf502ffbdf433ac2faa585d8c9eff6c5b27aedd90d2f63330a7414218 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 11 |
+
CommonsBase_LLVM 0.1.20260913085659 c51d6e04e6779799c4df31630c75ed17d95386492c7e0ddc046f3734c816e929 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 12 |
+
CommonsBase_LLVM 0.1.20260916234322 e66256adfd231ea822bbad59bba124c3c851243082be0426af191ae18751611a etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 13 |
+
CommonsBase_LLVM 0.1.20260920144347 56312cd1d2868eff482798255793a35f8b2dbaf9c80a697622780d67639783fe etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 14 |
+
CommonsBase_Std 2.6.20260913085659 25224920a4b704b3693afe5343ce05c5cd2c0d9e19ce1641511707fb5af59887 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 15 |
+
CommonsBase_Std 2.6.20260916234322 eafd48ee3331a4be2fee20055a7d2f88c33b53989c2dcc7f9a6b5ac51349f250 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 16 |
+
CommonsBase_Std 2.6.20260920144347 b3c67724e09942596d8af32635b585698f931047e74332bc011a532a430d5438 etc/dk/i/CommonsBase_Std.2.6.20260920144347.values.json
|
| 17 |
+
CommonsBase_Std 2.6.20260920144347 b3c67724e09942596d8af32635b585698f931047e74332bc011a532a430d5438 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 18 |
+
CommonsBase_Win32 0.1.20260913085659 3bf82182b61b0800bcbb7cf8f6c6fb270228e78fab9120a0ac9e169d12a451af etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 19 |
+
CommonsBase_Win32 0.1.20260916234322 2c26c7595a79bd6e88bb5665dcbb552d3b72c828ebe7385315c4e8f64a8ed7ce etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 20 |
+
CommonsBase_Win32 0.1.20260920144347 4c1ae11415083c10650bdecf2b02c22ba5dce75362eb9b4139dd2575efe608e5 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 21 |
+
CommonsLang_OCaml 0.1.20260916151007 eec79d51d9e8906d861310f9d9fb04a251e0208caf6cae46f8e6ded13a498132 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 22 |
+
CommonsLang_OCaml 0.1.20260916234322 bbd0879f0808f8fbe230df44ba1d9a9804ce6773eb8ecda93af47d1a765a00e3 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 23 |
+
CommonsLang_OCaml 0.1.20260920144347 54c5ccfd53e87797ea4fea161b0fd6c869ba80a45b3b3870848407c6797741a8 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 24 |
+
NotMatveevKondratyev_Libinotify 0.1.20260913085659 994c3d7ae357b88c19e0cd330186a97a6078f37b1601c46fef06491756535b77 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 25 |
+
NotMatveevKondratyev_Libinotify 0.1.20260916234322 68849e07e20594dd003d052415ce2d181c1c00c65ba614ceb25ba970ba108976 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 26 |
+
NotMatveevKondratyev_Libinotify 0.1.20260920144347 33f86058acc7b9f1ca512237477d867926748f4ed3ff0d9174f14d200b649560 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 27 |
+
NotMitEdu_Kerberos 0.1.20260913085659 bac376f7b4b3f09a2a2e877fbce59c80e17b0661d5bd3c8d8d9c506fd47d3653 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 28 |
+
NotMitEdu_Kerberos 0.1.20260916234322 c208ebae1ecb09dc590b8d6f9df7cbee1c4edb83fbe4150ff50a903040f7842a etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
| 29 |
+
NotMitEdu_Kerberos 0.1.20260920144347 85cd3dd87bb48561bbcc75a624764d1214f7f07b78df7c8e751cd21e1e2757b8 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
|
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Written by dk0. The values.json copies and the imports.json ledger are
|
| 2 |
+
# machine-written verification records for THIS workspace; do not commit.
|
| 3 |
+
# capabilities.json (explicit human authorization grants) is committable.
|
| 4 |
+
*.values.json
|
| 5 |
+
imports.json
|
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"version": 1,
|
| 3 |
+
"acceptances": [
|
| 4 |
+
{
|
| 5 |
+
"package": "CommonsLang_OCaml",
|
| 6 |
+
"pubkey_base64": "RWQrGWGcOA3WV93QbuXdm8aAWjDkYvCM5jgFAanfDRiW9n3PzSvLESmR"
|
| 7 |
+
}
|
| 8 |
+
]
|
| 9 |
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"version": 1,
|
| 3 |
+
"grants": [
|
| 4 |
+
{
|
| 5 |
+
"package": "CommonsLang_OCaml",
|
| 6 |
+
"pubkey_base64": "RWQrGWGcOA3WV93QbuXdm8aAWjDkYvCM5jgFAanfDRiW9n3PzSvLESmR",
|
| 7 |
+
"capabilities": [ "run", "write" ]
|
| 8 |
+
}
|
| 9 |
+
]
|
| 10 |
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// Driver for the opam build of `earlybird`: ONE run-function precommand
|
| 2 |
+
// instantiates the closure build rule, which reads the lock once and registers
|
| 3 |
+
// every per-package build form (each still its own content-addressed dk object,
|
| 4 |
+
// so an interrupted build resumes) plus the aggregate `.Built` output form.
|
| 5 |
+
//
|
| 6 |
+
// GENERATED by the CommonsLang_OCaml.Dk.OpamLock.GenerateDriver dialog from
|
| 7 |
+
// `dk.opam-lock.jsonc`. Regenerate (do not hand-edit) when the lock changes.
|
| 8 |
+
//
|
| 9 |
+
// Regenerate with:
|
| 10 |
+
// dk0 dialog CommonsLang_OCaml.Dk.OpamLock.GenerateDriver@1.1.22 pkg=NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 roots[]=earlybird
|
| 11 |
+
{
|
| 12 |
+
"$schema": "https://diskuv.com/dk/schema/dk-value-1.0.json",
|
| 13 |
+
"schema_version": { "major": 1, "minor": 0 },
|
| 14 |
+
"generated": {
|
| 15 |
+
"tool": "CommonsLang_OCaml.Dk.OpamLock.GenerateDriver@1.1.22",
|
| 16 |
+
"rulefn": "CommonsLang_OCaml.Dk.OpamBuild.F_BuildLockedClosure@1.0.29",
|
| 17 |
+
"lock": "dk.opam-lock.jsonc",
|
| 18 |
+
"lock-sha256": "8b0cbeeb0d8a11845f3cadc288bf4cb22cad3623c0673892d0b85f5256f0d967",
|
| 19 |
+
"localsrc": "NotHackwaly_Ocamlearlybird.Ocamlearlybird.Src@1.3.6",
|
| 20 |
+
"locksrcpath": "./dk-opam-lock.jsonc",
|
| 21 |
+
"roots": ["earlybird"],
|
| 22 |
+
"formid": "NotHackwaly_Ocamlearlybird.Ocamlearlybird.Closure@1.3.6",
|
| 23 |
+
"pkgpath": "NotHackwaly_Ocamlearlybird.Ocamlearlybird",
|
| 24 |
+
"version": "1.3.6",
|
| 25 |
+
"parallel": "t"
|
| 26 |
+
},
|
| 27 |
+
"forms": [
|
| 28 |
+
{
|
| 29 |
+
"id": "NotHackwaly_Ocamlearlybird.Ocamlearlybird.Closure@1.3.6",
|
| 30 |
+
"precommands": {
|
| 31 |
+
"sequential": false,
|
| 32 |
+
"private": [
|
| 33 |
+
"run-function CommonsLang_OCaml.Dk.OpamBuild.F_BuildLockedClosure@1.0.29 -d built modver=NotHackwaly_Ocamlearlybird.Ocamlearlybird.Closure.Built@1.3.6 pkgpath=NotHackwaly_Ocamlearlybird.Ocamlearlybird version=1.3.6 root=earlybird localsrc=NotHackwaly_Ocamlearlybird.Ocamlearlybird.Src@1.3.6 locksrcpath=./dk-opam-lock.jsonc targetabi=Release.target_abi ocaml=CommonsLang_OCaml.DkML@4.14.3001"
|
| 34 |
+
]
|
| 35 |
+
},
|
| 36 |
+
"function": {
|
| 37 |
+
"commands": [
|
| 38 |
+
[
|
| 39 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')",
|
| 40 |
+
"cp", "built/install.zip", "${SLOT.request}/install.zip"
|
| 41 |
+
]
|
| 42 |
+
]
|
| 43 |
+
},
|
| 44 |
+
"outputs": { "assets": [ { "slots": ["Release.Windows_x86_64", "Release.Windows_x86", "Release.Linux_x86_64", "Release.Linux_x86_64_musl", "Release.Linux_x86", "Release.Linux_arm64", "Release.Darwin_x86_64", "Release.Darwin_arm64"], "paths": ["install.zip"] } ] }
|
| 45 |
+
}
|
| 46 |
+
]
|
| 47 |
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// NotHackwaly_Ocamlearlybird.Ocamlearlybird.Src@1.3.6 -- the localized working tree as one
|
| 2 |
+
// content-addressed object (output.zip + dk-opam-lock.jsonc) that the generic
|
| 3 |
+
// OpamBuild rule stages via localsrc= as the source for the one local package.
|
| 4 |
+
//
|
| 5 |
+
// GENERATED by the CommonsLang_OCaml.Dk.OpamLock.GenerateSrc dialog. Regenerate
|
| 6 |
+
// (do not hand-edit) when the source tree or lock changes.
|
| 7 |
+
//
|
| 8 |
+
// Regenerate with:
|
| 9 |
+
// dk0 dialog CommonsLang_OCaml.Dk.OpamLock.GenerateSrc@1.1.22 pkg=NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6
|
| 10 |
+
{
|
| 11 |
+
"$schema": "https://diskuv.com/dk/schema/dk-value-1.0.json",
|
| 12 |
+
"schema_version": { "major": 1, "minor": 0 },
|
| 13 |
+
"generated": {
|
| 14 |
+
"tool": "CommonsLang_OCaml.Dk.OpamLock.GenerateSrc@1.1.22",
|
| 15 |
+
"pkg": "NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6",
|
| 16 |
+
"root": "earlybird",
|
| 17 |
+
"srcdirs": ["src"],
|
| 18 |
+
"rootfiles": ["dune", "dune-project", "earlybird.opam"]
|
| 19 |
+
},
|
| 20 |
+
"forms": [
|
| 21 |
+
{
|
| 22 |
+
"id": "NotHackwaly_Ocamlearlybird.Ocamlearlybird.Src@1.3.6",
|
| 23 |
+
"precommands": {
|
| 24 |
+
"private": [
|
| 25 |
+
"get-asset NotHackwaly_Ocamlearlybird.Apparatus.Src@1.3.6 -p src -d earlybird-1.3.6"
|
| 26 |
+
]
|
| 27 |
+
},
|
| 28 |
+
"function": {
|
| 29 |
+
"commands": [
|
| 30 |
+
[
|
| 31 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "mkdir", "-p", "${SLOT.request}"
|
| 32 |
+
],
|
| 33 |
+
[
|
| 34 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp",
|
| 35 |
+
"$(get-asset NotHackwaly_Ocamlearlybird.Apparatus.DuneWorkspace@1.3.6 -p dk-src/dune-workspace -f dune-workspace)",
|
| 36 |
+
"earlybird-1.3.6/dune-workspace"
|
| 37 |
+
],
|
| 38 |
+
[
|
| 39 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp",
|
| 40 |
+
"$(get-asset NotHackwaly_Ocamlearlybird.Apparatus.DuneRoot@1.3.6 -p dune -f dune)",
|
| 41 |
+
"earlybird-1.3.6/dune"
|
| 42 |
+
],
|
| 43 |
+
[
|
| 44 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp",
|
| 45 |
+
"$(get-asset NotHackwaly_Ocamlearlybird.Apparatus.DuneProject@1.3.6 -p dune-project -f dune-project)",
|
| 46 |
+
"earlybird-1.3.6/dune-project"
|
| 47 |
+
],
|
| 48 |
+
[
|
| 49 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp",
|
| 50 |
+
"$(get-asset NotHackwaly_Ocamlearlybird.Apparatus.Opam@1.3.6 -p earlybird.opam -f earlybird.opam)",
|
| 51 |
+
"earlybird-1.3.6/earlybird.opam"
|
| 52 |
+
],
|
| 53 |
+
[
|
| 54 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp",
|
| 55 |
+
"$(get-asset NotHackwaly_Ocamlearlybird.Apparatus.Lock@1.3.6 -p dk.opam-lock.jsonc -f lock.jsonc)",
|
| 56 |
+
"${SLOT.request}/dk-opam-lock.jsonc"
|
| 57 |
+
],
|
| 58 |
+
[
|
| 59 |
+
"--zip", "${SLOT.request}/output.zip", "earlybird-1.3.6"
|
| 60 |
+
]
|
| 61 |
+
]
|
| 62 |
+
},
|
| 63 |
+
"outputs": { "assets": [ { "slots": ["Release.Windows_x86_64", "Release.Windows_x86", "Release.Linux_x86_64", "Release.Linux_x86_64_musl", "Release.Linux_x86", "Release.Linux_arm64", "Release.Darwin_x86_64", "Release.Darwin_arm64"], "paths": ["output.zip", "dk-opam-lock.jsonc"] } ] }
|
| 64 |
+
}
|
| 65 |
+
]
|
| 66 |
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 -- the final per-slot executable(s).
|
| 2 |
+
//
|
| 3 |
+
// Republishes the NotHackwaly_Ocamlearlybird.Ocamlearlybird.Closure@1.3.6 install prefix's
|
| 4 |
+
// executable(s) as bin/<exe>.exe. GENERATED by the
|
| 5 |
+
// CommonsLang_OCaml.Dk.OpamLock.GenerateFinal dialog; regenerate (do not
|
| 6 |
+
// hand-edit) when the exe set changes.
|
| 7 |
+
//
|
| 8 |
+
// Regenerate with:
|
| 9 |
+
// dk0 dialog CommonsLang_OCaml.Dk.OpamLock.GenerateFinal@1.1.22 pkg=NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6
|
| 10 |
+
{
|
| 11 |
+
"$schema": "https://diskuv.com/dk/schema/dk-value-1.0.json",
|
| 12 |
+
"schema_version": { "major": 1, "minor": 0 },
|
| 13 |
+
"generated": {
|
| 14 |
+
"tool": "CommonsLang_OCaml.Dk.OpamLock.GenerateFinal@1.1.22",
|
| 15 |
+
"pkg": "NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6",
|
| 16 |
+
"exes": ["ocamlearlybird"]
|
| 17 |
+
},
|
| 18 |
+
"forms": [
|
| 19 |
+
{
|
| 20 |
+
"id": "NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6",
|
| 21 |
+
"precommands": {
|
| 22 |
+
"private": [
|
| 23 |
+
"get-object NotHackwaly_Ocamlearlybird.Ocamlearlybird.Closure@1.3.6 -s ${SLOTNAME.request} -m ./install.zip -d ip"
|
| 24 |
+
]
|
| 25 |
+
},
|
| 26 |
+
"function": {
|
| 27 |
+
"commands": [
|
| 28 |
+
[
|
| 29 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "mkdir", "-p", "${SLOT.request}/bin"
|
| 30 |
+
],
|
| 31 |
+
[
|
| 32 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "env", "-u", "${SLOT.Release.Windows_x86_64}", "--",
|
| 33 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp", "ip/bin/ocamlearlybird.exe", "${SLOT.request}/bin/ocamlearlybird.exe"
|
| 34 |
+
],
|
| 35 |
+
[
|
| 36 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "env", "-u", "${SLOT.Release.Windows_x86}", "--",
|
| 37 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp", "ip/bin/ocamlearlybird.exe", "${SLOT.request}/bin/ocamlearlybird.exe"
|
| 38 |
+
],
|
| 39 |
+
[
|
| 40 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "env", "-u", "${SLOT.Release.Linux_x86_64}", "--",
|
| 41 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp", "ip/bin/ocamlearlybird", "${SLOT.request}/bin/ocamlearlybird.exe"
|
| 42 |
+
],
|
| 43 |
+
[
|
| 44 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "env", "-u", "${SLOT.Release.Linux_x86_64_musl}", "--",
|
| 45 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp", "ip/bin/ocamlearlybird", "${SLOT.request}/bin/ocamlearlybird.exe"
|
| 46 |
+
],
|
| 47 |
+
[
|
| 48 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "env", "-u", "${SLOT.Release.Linux_x86}", "--",
|
| 49 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp", "ip/bin/ocamlearlybird", "${SLOT.request}/bin/ocamlearlybird.exe"
|
| 50 |
+
],
|
| 51 |
+
[
|
| 52 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "env", "-u", "${SLOT.Release.Linux_arm64}", "--",
|
| 53 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp", "ip/bin/ocamlearlybird", "${SLOT.request}/bin/ocamlearlybird.exe"
|
| 54 |
+
],
|
| 55 |
+
[
|
| 56 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "env", "-u", "${SLOT.Release.Darwin_x86_64}", "--",
|
| 57 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp", "ip/bin/ocamlearlybird", "${SLOT.request}/bin/ocamlearlybird.exe"
|
| 58 |
+
],
|
| 59 |
+
[
|
| 60 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "env", "-u", "${SLOT.Release.Darwin_arm64}", "--",
|
| 61 |
+
"$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp", "ip/bin/ocamlearlybird", "${SLOT.request}/bin/ocamlearlybird.exe"
|
| 62 |
+
]
|
| 63 |
+
]
|
| 64 |
+
},
|
| 65 |
+
"outputs": { "assets": [
|
| 66 |
+
{ "slots": ["Release.Windows_x86_64"], "paths": ["bin/ocamlearlybird.exe"] },
|
| 67 |
+
{ "slots": ["Release.Windows_x86"], "paths": ["bin/ocamlearlybird.exe"] },
|
| 68 |
+
{ "slots": ["Release.Linux_x86_64"], "paths": ["bin/ocamlearlybird.exe"] },
|
| 69 |
+
{ "slots": ["Release.Linux_x86_64_musl"], "paths": ["bin/ocamlearlybird.exe"] },
|
| 70 |
+
{ "slots": ["Release.Linux_x86"], "paths": ["bin/ocamlearlybird.exe"] },
|
| 71 |
+
{ "slots": ["Release.Linux_arm64"], "paths": ["bin/ocamlearlybird.exe"] },
|
| 72 |
+
{ "slots": ["Release.Darwin_x86_64"], "paths": ["bin/ocamlearlybird.exe"] },
|
| 73 |
+
{ "slots": ["Release.Darwin_arm64"], "paths": ["bin/ocamlearlybird.exe"] }
|
| 74 |
+
] }
|
| 75 |
+
}
|
| 76 |
+
]
|
| 77 |
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// THE MEASUREMENT COVERED EVERY SLOT IT CLAIMS TO COVER, OR THIS FAILS.
|
| 2 |
+
//
|
| 3 |
+
// WHY THIS EXISTS. The dk matrix in measure-performance.yml runs `fail-fast: false`,
|
| 4 |
+
// so one leg can die while the others finish and the workflow still completes with
|
| 5 |
+
// numbers. Those numbers then refresh CLO.md and both PR descriptions while silently
|
| 6 |
+
// describing a slot nobody measured. Nothing noticed that before this file.
|
| 7 |
+
//
|
| 8 |
+
// WHY IT IS NOT A TIMING THRESHOLD. Repeated runs at one pin put 6 of the 12 dk cells
|
| 9 |
+
// at or above 10 percent coefficient of variation, and the two cells quiet enough to
|
| 10 |
+
// carry a threshold were not the same two before and after an unrelated workflow
|
| 11 |
+
// repair. A threshold chosen on either sample rests on a property the next fix moves.
|
| 12 |
+
// A MISSING or FAILED measurement has no such dependence, and it is the failure that
|
| 13 |
+
// actually happened: the one real regression on record did not run slower, it did not
|
| 14 |
+
// build at all.
|
| 15 |
+
//
|
| 16 |
+
// WHAT IT ASSERTS. Every slot named in scripts/expected-measurement.json reported
|
| 17 |
+
// every phase named there, with a numeric millisecond value greater than zero.
|
| 18 |
+
//
|
| 19 |
+
// IT PROVES ITSELF BEFORE IT IS TRUSTED. `--selftest` builds a complete fixture and a
|
| 20 |
+
// damaged one and requires this file to accept the first and reject the second. The
|
| 21 |
+
// gate job runs that before applying the check to real data, because a check that has
|
| 22 |
+
// only ever been observed passing is evidence about the run and not about the check.
|
| 23 |
+
|
| 24 |
+
import fs from "node:fs";
|
| 25 |
+
import path from "node:path";
|
| 26 |
+
import os from "node:os";
|
| 27 |
+
|
| 28 |
+
const argv = process.argv.slice(2);
|
| 29 |
+
const KNOWN = new Set(["--expected", "--dir", "--selftest", "--help"]);
|
| 30 |
+
for (const a of argv) {
|
| 31 |
+
if (a.startsWith("--") && !KNOWN.has(a)) {
|
| 32 |
+
console.error(`FAIL unknown flag ${a}. Known flags: ${[...KNOWN].join(", ")}`);
|
| 33 |
+
process.exit(2);
|
| 34 |
+
}
|
| 35 |
+
}
|
| 36 |
+
const opt = (name, dflt) => {
|
| 37 |
+
const i = argv.indexOf(name);
|
| 38 |
+
return i >= 0 && argv[i + 1] && !argv[i + 1].startsWith("--") ? argv[i + 1] : dflt;
|
| 39 |
+
};
|
| 40 |
+
|
| 41 |
+
// A millisecond reading, without a backslash class. Digits only, at least one, and a
|
| 42 |
+
// value above zero. A phase that reported 0 ms did not run.
|
| 43 |
+
const isPositiveInteger = (s) => {
|
| 44 |
+
if (typeof s !== "string" || s.length === 0) return false;
|
| 45 |
+
for (const ch of s) {
|
| 46 |
+
const c = ch.codePointAt(0);
|
| 47 |
+
if (c < 0x30 || c > 0x39) return false;
|
| 48 |
+
}
|
| 49 |
+
return Number(s) > 0;
|
| 50 |
+
};
|
| 51 |
+
|
| 52 |
+
function readPhases(file) {
|
| 53 |
+
const out = {};
|
| 54 |
+
for (const line of fs.readFileSync(file, "utf8").split(/\r?\n/)) {
|
| 55 |
+
const t = line.trim();
|
| 56 |
+
if (!t) continue;
|
| 57 |
+
const eq = t.indexOf("=");
|
| 58 |
+
if (eq <= 0) continue;
|
| 59 |
+
out[t.slice(0, eq).trim()] = t.slice(eq + 1).trim();
|
| 60 |
+
}
|
| 61 |
+
return out;
|
| 62 |
+
}
|
| 63 |
+
|
| 64 |
+
function check(expectedFile, dir) {
|
| 65 |
+
const spec = JSON.parse(fs.readFileSync(expectedFile, "utf8"));
|
| 66 |
+
const slots = spec.slots ?? [];
|
| 67 |
+
const phases = spec.phases ?? [];
|
| 68 |
+
if (!slots.length || !phases.length) {
|
| 69 |
+
return { failures: [`${expectedFile} declares ${slots.length} slot(s) and ${phases.length} phase(s); a declaration that expects nothing cannot be violated, so it is refused rather than passed`], checked: 0 };
|
| 70 |
+
}
|
| 71 |
+
const failures = [];
|
| 72 |
+
let checked = 0;
|
| 73 |
+
for (const slot of slots) {
|
| 74 |
+
const file = path.join(dir, `${slot}.txt`);
|
| 75 |
+
if (!fs.existsSync(file)) {
|
| 76 |
+
failures.push(`slot ${slot} reported NO measurement at all: ${path.basename(file)} is absent. Its leg failed, was skipped, or was dropped from the matrix while this branch still claims to cover it.`);
|
| 77 |
+
continue;
|
| 78 |
+
}
|
| 79 |
+
const got = readPhases(file);
|
| 80 |
+
for (const p of phases) {
|
| 81 |
+
checked += 1;
|
| 82 |
+
if (!(p in got)) {
|
| 83 |
+
failures.push(`slot ${slot} is MISSING phase ${p}: the leg ran and produced no reading for it.`);
|
| 84 |
+
} else if (!isPositiveInteger(got[p])) {
|
| 85 |
+
failures.push(`slot ${slot} phase ${p} is ${JSON.stringify(got[p])}, which is not a positive whole number of milliseconds.`);
|
| 86 |
+
}
|
| 87 |
+
}
|
| 88 |
+
}
|
| 89 |
+
return { failures, checked };
|
| 90 |
+
}
|
| 91 |
+
|
| 92 |
+
// ---------------------------------------------------------------- selftest
|
| 93 |
+
if (argv.includes("--selftest")) {
|
| 94 |
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), "measgate-"));
|
| 95 |
+
const expected = path.join(root, "expected.json");
|
| 96 |
+
fs.writeFileSync(expected, JSON.stringify({ slots: ["A", "B"], phases: ["p1", "p2"] }));
|
| 97 |
+
|
| 98 |
+
const good = path.join(root, "good");
|
| 99 |
+
fs.mkdirSync(good);
|
| 100 |
+
fs.writeFileSync(path.join(good, "A.txt"), "p1=10\np2=20\n");
|
| 101 |
+
fs.writeFileSync(path.join(good, "B.txt"), "p1=30\np2=40\n");
|
| 102 |
+
|
| 103 |
+
const missingSlot = path.join(root, "missing-slot");
|
| 104 |
+
fs.mkdirSync(missingSlot);
|
| 105 |
+
fs.writeFileSync(path.join(missingSlot, "A.txt"), "p1=10\np2=20\n");
|
| 106 |
+
|
| 107 |
+
const missingPhase = path.join(root, "missing-phase");
|
| 108 |
+
fs.mkdirSync(missingPhase);
|
| 109 |
+
fs.writeFileSync(path.join(missingPhase, "A.txt"), "p1=10\n");
|
| 110 |
+
fs.writeFileSync(path.join(missingPhase, "B.txt"), "p1=30\np2=40\n");
|
| 111 |
+
|
| 112 |
+
const zero = path.join(root, "zero");
|
| 113 |
+
fs.mkdirSync(zero);
|
| 114 |
+
fs.writeFileSync(path.join(zero, "A.txt"), "p1=0\np2=20\n");
|
| 115 |
+
fs.writeFileSync(path.join(zero, "B.txt"), "p1=30\np2=40\n");
|
| 116 |
+
|
| 117 |
+
const cases = [
|
| 118 |
+
["a complete measurement is ACCEPTED", good, 0],
|
| 119 |
+
["a slot that reported nothing is REJECTED", missingSlot, 1],
|
| 120 |
+
["a slot missing one phase is REJECTED", missingPhase, 1],
|
| 121 |
+
["a phase reporting 0 ms is REJECTED", zero, 1],
|
| 122 |
+
];
|
| 123 |
+
let bad = 0;
|
| 124 |
+
for (const [name, dir, want] of cases) {
|
| 125 |
+
const { failures } = check(expected, dir);
|
| 126 |
+
const got = failures.length ? 1 : 0;
|
| 127 |
+
const ok = got === want;
|
| 128 |
+
if (!ok) bad += 1;
|
| 129 |
+
console.log(` ${ok ? "PASS" : "FAIL"} selftest: ${name} (expected exit ${want}, got ${got})`);
|
| 130 |
+
for (const f of failures) console.log(` ${f}`);
|
| 131 |
+
}
|
| 132 |
+
fs.rmSync(root, { recursive: true, force: true });
|
| 133 |
+
if (bad) {
|
| 134 |
+
console.error(`FAIL measurement_gate_selftest ${bad} of ${cases.length} selftest case(s) behaved wrongly. The check is NOT trustworthy and the real result below must not be believed.`);
|
| 135 |
+
process.exit(1);
|
| 136 |
+
}
|
| 137 |
+
console.log(`PASS measurement_gate_selftest ${cases.length} case(s): it accepts a complete measurement and rejects a missing slot, a missing phase and a zero reading.`);
|
| 138 |
+
process.exit(0);
|
| 139 |
+
}
|
| 140 |
+
|
| 141 |
+
// ---------------------------------------------------------------- the check
|
| 142 |
+
const expectedFile = opt("--expected", "scripts/expected-measurement.json");
|
| 143 |
+
const dir = opt("--dir", null);
|
| 144 |
+
if (!dir) {
|
| 145 |
+
console.error("usage: check-measurement-complete.mjs --dir <phases-dir> [--expected <file>]");
|
| 146 |
+
console.error(" check-measurement-complete.mjs --selftest");
|
| 147 |
+
process.exit(2);
|
| 148 |
+
}
|
| 149 |
+
if (!fs.existsSync(dir)) {
|
| 150 |
+
console.error(`FAIL measurement_complete the phases directory ${dir} does not exist, so NOTHING was collected. That is not the same as a measurement that passed.`);
|
| 151 |
+
process.exit(1);
|
| 152 |
+
}
|
| 153 |
+
|
| 154 |
+
const { failures, checked } = check(expectedFile, dir);
|
| 155 |
+
for (const f of failures) console.log(` FAIL ${f}`);
|
| 156 |
+
if (failures.length) {
|
| 157 |
+
console.error(`FAIL measurement_complete ${failures.length} problem(s). This branch declares its coverage in ${expectedFile}; either a leg did not report, or the declaration is stale. Fix the run or move the declaration in the same commit that changes the matrix.`);
|
| 158 |
+
process.exit(1);
|
| 159 |
+
}
|
| 160 |
+
console.log(`PASS measurement_complete every declared slot reported every declared phase (${checked} reading(s) checked).`);
|
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"$what": "What THIS branch claims measure-performance.yml covers. The gate job compares it against what the dk matrix actually reported, and fails when they disagree.",
|
| 3 |
+
"$why_a_declaration_and_not_the_matrix": "Reading the coverage back out of the matrix would make the check agree with whatever the matrix says, including after a slot is quietly dropped. A separate declaration is the thing a dropped slot can DISAGREE with, which is the whole point. When a slot is added or removed on purpose, this file moves in the same commit.",
|
| 4 |
+
"$why_it_matters": "The dk matrix runs fail-fast: false, so one leg can die while the others publish numbers and the workflow still finishes. Those numbers then refresh CLO.md and both PR bodies while describing a slot nobody measured. That is the failure this gate exists for: a MISSING measurement, not a slower one.",
|
| 5 |
+
"$phases_differ_by_branch": "This branch measures build_cold, run_warm and run_edit. The high-performance branch measures fetch_cold, run_reconcile and run_warm, because it consumes a prebuilt object rather than building one. The two declarations are therefore NOT interchangeable, and copying one over the other would make each branch's gate check for phases its workflow never emits.",
|
| 6 |
+
"slots": [
|
| 7 |
+
"Release.Linux_x86_64",
|
| 8 |
+
"Release.Windows_x86_64"
|
| 9 |
+
],
|
| 10 |
+
"phases": [
|
| 11 |
+
"dk_build_cold",
|
| 12 |
+
"dk_run_warm",
|
| 13 |
+
"dk_run_edit"
|
| 14 |
+
]
|
| 15 |
+
}
|
|
@@ -50,8 +50,7 @@ let spawn_terminal ~kind ~rpc ?name ?env ?cwd prog args =
|
|
| 50 |
Debug_rpc.exec_command rpc
|
| 51 |
(module Run_in_terminal_command)
|
| 52 |
Run_in_terminal_command.Arguments.
|
| 53 |
-
{ kind = Some kind; title = name; cwd; env; args = prog :: args
|
| 54 |
-
args_can_be_interpreted_by_shell = None }
|
| 55 |
in
|
| 56 |
Lwt.return ());
|
| 57 |
Lwt.return ()
|
|
|
|
| 50 |
Debug_rpc.exec_command rpc
|
| 51 |
(module Run_in_terminal_command)
|
| 52 |
Run_in_terminal_command.Arguments.
|
| 53 |
+
{ kind = Some kind; title = name; cwd; env; args = prog :: args }
|
|
|
|
| 54 |
in
|
| 55 |
Lwt.return ());
|
| 56 |
Lwt.return ()
|