dk packages /

CommonsLang_OCaml 0.1.20260821175730

Relocatable OCaml compiler toolchains and developer tools (the OCaml compiler, flexdll, dune, opam, and Diskuv's DkML MSVC track) as dk packages for Windows, Linux, and macOS.

Apache-2.0 AND LGPL-2.1-only WITH OCaml-LGPL-linking-exception AND LGPL-2.0-only WITH OCaml-LGPL-linking-exception AND LGPL-3.0-or-later AND GPL-2.0-only AND Zlib AND MIT AND GPL-3.0-or-later AND BSD-2-Clause AND Info-ZIP Source → Generated

Relocatable OCaml compiler toolchains and developer tools (the OCaml compiler, flexdll, dune, opam, and Diskuv's DkML MSVC track) as dk packages for Windows, Linux, and macOS.

CommonsLang_OCaml builds and redistributes an OCaml developer toolchain (the OCaml compiler, runtime, and standard library at 4.14.3, 5.4.1, and 5.5.0-beta1, the flexdll linker, dune 3.23.1, and opam 2.5.1) across the dk build system's Windows, Linux, and macOS slots. It also ships Diskuv's Apache-2.0 DkML MSVC track and an MSYS2 tree used to build and run the Windows toolchain. Because it is assembled from many upstreams, its redistributed payload carries several licenses in combination.

Resolution of imports

When a workspace drives per-package opam builds through Dk.OpamLock.GenerateDriver + Dk.OpamBuild.F_BuildLockedPackage and declares one or more package-import sources (imports[]), the generated driver reuses a locked opam package that a source already built and distributes, fetching the prebuilt object lazily. Resolution runs per package, against the imports[] sources in precedence order.

  1. Read each source's own opam lock. Every import source ships the exact opam lock it was built from. For a CommonsBase_Dk.Dk0.Pkg source that is the dk-opam-lock.jsonc member of its localsrc (CommonsBase_Dk.Dk0.MlFrontSource@<mv>), fetched from the pinned import. That lock is authoritative for which opam package and version each of the source's objects contains.

  2. Map object id to opam package and version. For an opam package <name>.<opamver> in a source's lock, the source provides the dk object <source-lib>.<Segment(name)>@<module-version>, whose version component is the source's release version (imports[].version, for example @2.4.2). The opam version is recorded only in the source's lock, which is what step 3 matches against.

  3. Match on opam name and opam version. For each opam <name>.<needver> the consumer's (with-test) lock requires, a source matches when its lock pins <name> at the same <needver>. On the first matching source the package is imported: the driver stages it with get-object <source-lib>.<Seg>@<mv>, lazily, fetched when a build needs its install.zip, and emits no local build form. A package that no source provides at the required opam version is built locally through F_BuildLockedPackage, with its own dependencies resolved the same way.

  4. The compiler must match; Dune and MSYS2 need not. Each lock records the OCaml compiler its packages are built with in a top-level ocaml field, a full module id such as CommonsLang_OCaml.DkML@4.14.3 (or a CommonsLang_OCaml.Base@5.5.x for a 5.5 toolchain); a lock without the field takes the default CommonsLang_OCaml.DkML@4.14.3. Dk.OpamLock.GenerateDriver reads the ocaml field from both the consumer's lock and each source's lock (already fetched in step 1) and passes it to F_BuildLockedPackage as the ocaml= argument, along with dune=CommonsLang_OCaml.Dune@<v> and (Windows) msys2=CommonsLang_OCaml.MSYS2@<v>. An imported package ships compiled .cmi/.cmx/.cmxa, whose magic numbers are fixed by the compiler, so a source is consumable only when its lock's ocaml equals the consumer's; a package from a source whose ocaml differs is built locally instead. Dune and MSYS2 leave no trace in the compiled artifacts, so a dune or msys2 difference does not affect consumability.

Dk.OpamLock

Run one rule of the CommonsLang_OCaml.Dk.OpamLock scriptmodule so its author-time OpamLock uirule ships in this distribution. Running any rule of a scriptmodule brings in the whole scriptmodule; the marker output is otherwise unused. The value-id is harvested from the first CI run (the DkML pattern).

The @1.1.8 revision makes the two generated artifacts self-describing and adds the Refresh uirule (see "### Refresh: self-describing regeneration"). Solve stamps its roots/pins (and wtest/local_opam_dir when set) into the lock's generated block, and GenerateDriver stamps its full parameter set into a top-level generated member of the driver values.jsonc (right after schema_version). This needs no dk-value schema change: MlFront's value reader pulls members by name and ignores unknown top-level members. The helper moves to Apparatus.OpamLockHelper@1.0.14. Its Export value-id is per-version and is harvested from CI as usual.

The @1.1.7 revision flips the default host-tool ABI (see "### Host tools and the hosttoolabi= escape hatch"): GenerateDriver now emits targetabi=Release.target_abi for ocamlfind/ocamlbuild and takes an optional hosttoolabi=SLOT parameter that restores Release.execution_abi for a matrix with a host-unemulatable cross slot. Its Export value-id is per-version and is harvested from CI as usual.

The @1.1.6 revision is behaviorally identical to @1.1.5. It exists because the lock-helper assets were collapsed onto the stable assets/opam-lock/dk_opam_lock.ml path (Apparatus.OpamLockHelper@1.0.10, the same bytes as the retired dk_opam_lock_filtered.ml) and every earlier OpamLock revision was retired from HEAD; see "## Assets". Its Export value-id is per-version and is harvested from CI as usual.

How the lock is produced: the OpamLock.Solve uirule launches opam to SOLVE the dependency closure -- it runs opam list --resolve to compute the closure and opam show to read each package's version/source/deps/build commands, and never opam installs. opam has no switch-less solve (the solver needs a switch's repositories, pins, and os/arch variables), so Solve creates an EMPTY opam switch purely as a throwaway resolution context: it adds the pinned repositories, applies the version pins from dk-opam-pins.txt, path-pins the local packages, then resolves. By default that switch is an ephemeral LOCAL switch in the rule's sandbox -- unique per run (no cross-project or cross-run pin contamination, so the lock is reproducible) and removed once the solve finishes; nothing is ever installed into it.

Resolving ocaml 5.1.1 as the solve compiler

ocaml is left unpinned so the solve resolves it from the pinned repository commit to 5.1.1, one of the first releases with the corrected ocaml-env, host-arch and conf-mingw-w64 selectors (pinning ocaml in the shared pin table would break the CI build's DkML toolchain). The pinned commit makes that resolution deterministic, and the version is a solve artifact only: the DkML 4.14.3 toolchain ocaml replaces it at build time.

  • ocaml 5.1.1 carries the corrected ocaml-env, host-arch and conf-mingw-w64 selectors, so the solved closure resolves the right platform packages for every slot.
  • The resolved ocaml version drives per-slot mingw selection: 5.1.1 resolves the Windows_x86 slot to the 32-bit ocaml-env-mingw32 toolchain, where 4.14.2 resolves the wrong 64-bit one.
  • The DkML 4.14.3 toolchain ocaml replaces this solve compiler at build time, so the lock's ocaml and ocaml-base-compiler entries are solve artifacts, not build inputs.

Relocatable ocamlfind and ocamlbuild

The solver still resolves ocamlfind and ocamlbuild (so the rest of the closure resolves and both still satisfy their dependents at the resolved version), but when the helper emits these two entries it substitutes a fixed relocatable specification for the solved source and build commands. A stock findlib bakes an absolute stdlib path into topfind and findlib.conf, and a stock ocamlbuild bakes an absolute libdir. Those absolute paths are valid only in the build tree that produced them, so a prebuilt CommonsBase_Dk.Dk0.Pkg.Ocamlfind or Pkg.Ocamlbuild object is unusable once imported into a different build tree (the imported #use "topfind" loads a dead #directory). The relocatable builds write paths relative to the tool's own location instead, so the imported objects stay usable across build trees.

  • ocamlfind is pinned to dra27's relocatable fork (v1.9.8) and built with -sitelib ".", so findlib writes a relative topfind and findlib.conf.
  • ocamlbuild is pinned to dra27's relocatable-0.14.3 fork (0.14.3 plus the relocatable patch) and built through configure.make with OCAMLBUILD_LIBDIR=.., so ocamlbuild computes its libdir at runtime.
  • Both sources are addressed by git commit, so the pin does not move. The substitution is a property of the lock the helper writes; downstream projects do not list these packages in their dk-opam-pins.txt.
  • The DkML 4.14.3+relocatable toolchain supplies the runtime support the two forks rely on (standard_library_relative, -set-runtime-default), so no compiler change is needed.

Host tools and the hosttoolabi= escape hatch

ocamlfind and ocamlbuild are host tools: their built artifacts are native executables that run on the build host during every later package build (topkg's ocaml pkg/pkg.ml build invokes ocamlfind and ocamlbuild). They are dual-role: the build must RUN them, and their findlib metadata (stdlib path, ocamlmklib/ocamlc config, arch flags) flows into every later package build. Since @1.1.7 GenerateDriver emits targetabi=Release.target_abi for these two by default, so on a cross slot whose host can emulate the target (Windows_x86 under WOW64, Darwin_x86_64 under Rosetta, Linux_x86 under multilib) the metadata matches the target and the tool still runs. This is the dual-role convention in SPECIFICATION "Object Slot ABI"; it was validated as the ocamlearlybird 57fd802 hand edit before it moved into the generator.

The hosttoolabi=SLOT parameter restores Release.execution_abi for a matrix that contains a cross slot the host CANNOT emulate. Building a host tool at the target ABI there produces a binary the host cannot run: on Release.Linux_x86_64_musl the tool links against the target musl toolchain and becomes a musl-dynamic executable, and the glibc host that must run it during the build lacks the musl loader. Worse, the opam-build form is host-keyed and carries the Release.target_abi wildcard in its value-id, so a single such build is stored under one key and shared to every slot -- including the glibc Release.Linux_x86_64 one, where the tool then fails to exec. A consumer whose matrix includes such a slot passes hosttoolabi=Release.execution_abi to keep the host tools host-native; that is the musl hazard the @1.1.4 execution-abi pin originally guarded.

Refresh: self-describing regeneration

Since @1.1.8 the lock and the driver stamp their inputs, and the Refresh uirule reads those stamps back. Solve records roots/pins in the lock's generated block; GenerateDriver records its full parameter set in a top-level generated member of the driver values.jsonc. A consumer therefore regenerates without re-copying the roughly ten parameters that used to live only in prose, and CI detects a stale driver in seconds instead of hours into a release build.

Refresh has four modes. Default (driver) regenerates the driver from the existing lock using the stamped parameters, so a routine repin never silently changes solved package versions; when the lock is not checked in (a consume-from-archive consumer), it substitutes the target rulefn in place, which equals a full regeneration for a rule-version-only move. mode=solve fetches opam hermetically, re-solves the lock from its stamped roots/pins, then regenerates. mode=check is read-only: it compares each driver's stamped rulefn/tool against the newest the imported etc/dk/i/CommonsLang_OCaml.<ver>.values.json declares (and, when the lock is checked in, the stamped lock-sha256 against the lock on disk), prints the exact fix command and exits nonzero when stale. version=NEW rewrites the coupled version/formid/localsrc and regenerates.

A pre-@1.1.8 driver carries no stamp; the first driver-mode Refresh recovers its parameters from the generated text and emits the stamped form. mode=check on such a driver still recovers the rulefn: it fails when that rulefn is stale (the check that would have caught the 2026-08-20 stale-driver incident) and otherwise prints an "unstamped: run Refresh once to adopt" advisory and exits zero, so CI adoption is graceful. Rule versions are co-versioned: Refresh@1.1.8 bakes in its sibling Solve@1.1.8/GenerateDriver@1.1.8 and the newest F_BuildLockedPackage; rulefn= remains an explicit override.

Dk.OpamBuild

Run one rule of the CommonsLang_OCaml.Dk.OpamBuild scriptmodule so its per-package build rule ships in this distribution. Running any rule of a scriptmodule brings in the whole scriptmodule; the marker output is otherwise unused. The value-id is harvested from the first CI run (the DkML pattern).

The @1.0.1 revision ships alongside @1.0.0 for the MlFront with-test closure (short-circuit filter eval, an arch fenv, and the dune-install --prefix repair); its per-slot value-id is likewise harvested from the first CI run.

The @1.0.8 revision ships alongside @1.0.7: it fetches the build wrapper from the fresh Apparatus.OpamBuildWrapper@1.0.4 (build-locked-package-v2.sh), whose @INSTALL@ installs Windows executables under their .exe name so cmd.exe can run a staged ocamlbuild. @1.0.4 is a new asset module because an in-place edit of @1.0.1 does not propagate through a distribution (value id hashes the invocation, not the content). All other assets stay at @1.0.1; the Export marker value-id is shared with @1.0.0/@1.0.6/@1.0.7, so no new harvest is needed.

The @1.0.9 revision supersedes @1.0.8's wrapper: @1.0.4's @INSTALL@ only added .exe when a literal <name>.exe existed, but DkML's ocamlopt emits <name> with no .exe when -o carries an extension (ocamlbuild.native), so nothing matched and the staged ocamlbuild stayed unrunnable. @1.0.9 fetches Apparatus.OpamBuildWrapper@1.0.5 (build-locked-package-v3.sh), which instead gives every bin/sbin destination the .exe suffix on Windows. @1.0.5 is again a new asset module for the same propagation reason; the Export marker value-id stays shared.

The @1.0.10 revision fetches Apparatus.OpamBuildWrapper@1.0.6 (build-locked-package-v4.sh), whose ocamlbuild-nh shim passes -install-lib-dir p/lib/ocamlbuild so ocamlbuild -where resolves to the package prefix. The relocatable ocamlbuild otherwise computes -where beside the compiler (dirname of ocaml_libdir), but the dk0 closure keeps the compiler separate and installs ocamlbuild.cmo into the package prefix, so compiling a myocamlbuild.ml plugin (e.g. ptime) fails to find ocamlbuild.cmo. @1.0.6 is a new asset module; the Export marker value-id stays shared.

The @1.0.11 revision fetches Apparatus.OpamBuildWrapper@1.0.7 (build-locked-package-v5.sh), which makes the imported relocatable findlib usable by a topkg #use "topfind". @1.0.10's wrapper set only OCAML_TOPLEVEL_PATH, which findlib_config reads to resolve its location, but the OCaml >= 4.13 toplevel does NOT search that variable for #use, so #use "topfind" failed with Cannot find file topfind whenever ocamlfind was imported (rather than built in-closure, where its build also seeded topfind into the then-writable shared stdlib). @1.0.7 also exports OCAMLTOP_INCLUDE_PATH (the toplevel's actual #use search path) and OCAMLFIND_LDCONF (pointing at the running compiler's ld.conf), because findlib_config bakes ocaml_stdlib/ocaml_ldconf as an absolute compile-time path that is dead once the object is imported into another build tree. All three variables are required together; the imported Dk0.Pkg.Ocamlfind object itself is correct and unchanged. @1.0.7 is a new asset module; the Export marker value-id stays shared.

The @1.0.15 revision fetches Apparatus.OpamBuildWrapper@1.0.9 (build-locked-package-v6.sh), which additionally rewrites the imported findlib.conf's stdlib= (and ldconf=) to the running compiler's lib/ocaml. @1.0.11's OCAMLFIND_LDCONF fixed ocamlfind list, but findlib_config's baked ocaml_stdlib still pointed at the dead compile-time path, so -package compiler-libs.toplevel (findlib expands it to <ocaml_stdlib>/compiler-libs) resolved into that dead directory and any consumer of the toplevel libraries failed with Unbound module Toploop -- first hit compiling astring's src/astring_top.ml. findlib exposes no environment override for stdlib (unlike ldconf), so the wrapper must rewrite findlib.conf itself; the DkML compiler does ship compiler-libs/toploop.cmi + ocamltoplevel.cma, so once stdlib points at it the toplevel packages resolve. @1.0.9 is a new asset module; the Export marker value-id stays shared.

The @1.0.16 revision is behaviorally identical to @1.0.15. It exists because the wrapper assets were collapsed onto the stable assets/opam/build-locked-package.sh path (Apparatus.OpamBuildWrapper@1.0.10, the same bytes as the retired build-locked-package-v6.sh) and every earlier OpamBuild revision was retired from HEAD; see "## Assets". The revision paragraphs above are history: the file names they mention exist only in earlier release tags. The Export marker value-id stays shared, so no new harvest is needed.

The @1.0.17 revision fetches Apparatus.OpamBuildWrapper@1.0.11, the same build-locked-package.sh with one Unix addition: it exports CAML_LD_LIBRARY_PATH pointing at the running compiler's stublibs. A package build that runs a bytecode helper linking unix -- first hit ocamlbuild's man/options_man.byte, run during the build to generate a man page -- loads dllunix-* at runtime via CAML_LD_LIBRARY_PATH and then the compiler's ld.conf. The DkML relocatable compiler's baked ld.conf lists a dead absolute stublibs dir (the same dead-baked-path root cause as the findlib stdlib above) and the rule strips CAML_LD_LIBRARY_PATH for hermeticity, so ocamlrun aborted (core dump) and the build failed. It is set on every slot -- as a native path (cygpath -m) on Windows, matching OCAMLFIND_LDCONF -- so the stub load path is correct regardless of how the host resolves DLLs. @1.0.11 is an OpamBuildWrapper patch bump (its bytes changed); the Export marker value-id stays shared.

The @1.0.18 revision fetches Apparatus.OpamBuildWrapper@1.0.12, the same build-locked-package.sh with a toolchain-fingerprint gate added on both sides. Producer half: after a successful build it records the sha256 of the DkML compiler-libs it linked against (compiler-libs/ocamlcommon.cmxa) into each library dir it produced, as a p/lib-mergeable ip/lib/<pkg>/.dk-provenance key=value sidecar. Consumer half: before building, it compares every staged dependency's recorded compiler-libs sha against the compiler-libs THIS build links against and, on a mismatch, fails fast with an actionable [abi-toolchain] message instead of letting the build die deep inside with the opaque .cmxa make inconsistent assumptions over implementation <Module> link error (the ppxlib astlib-vs-skewed-DkML failure). OCaml native compiler-libs are not bit-reproducible, so the SAME declaration-stable DkML object can hold different .cmx CRCs across CLO releases; this content fingerprint catches a producer and consumer that resolved different CLO releases even though their DkML module-id STRING matches. It is fail-open for dependencies with no recorded fingerprint (objects built by an earlier wrapper), so coverage grows as objects are rebuilt; fail-closed only when a fingerprint is present and differs. @1.0.12 is an OpamBuildWrapper patch bump (its bytes changed); the Export marker value-id stays shared.

Usage

DkML

  $ get-object CommonsLang_OCaml.DkML@4.14.3 -s Release.Darwin_arm64 -d ${RUNTIME}/Darwin_arm64-DkML-4.14.3
  \test(pass)
  \dk.object(abi: "Release.Darwin_arm64", value-id: "oo4ayzg7xkx5jehdewwtopexnnwmwidon22bpm5qpu7zwtui3uduq")\;

  $ run-object CommonsBase_FileMagic.File@7.8.50407 -s Release.execution_abi -m ./bin/file.exe -e bin/file.exe --
  >   -b $(get-object CommonsLang_OCaml.DkML@4.14.3 -s Release.target_abi -d : -e file.exe)/bin/ocamlopt
  \test(pass)
  \dk.target(abi: "Darwin_arm64")[Mach-O 64-bit executable, flags:<NOUNDEFS|DYLDLINK|TWOLEVEL|WEAK_DEFINES|BINDS_TO_WEAK|PIE>
  ]\;

  $ run-object CommonsLang_OCaml.DkML@4.14.3 -s Release.Darwin_arm64 -e 'bin/*' -c bin/ocamlopt -- -version
  \test(pass)
  \dk.target(abi: "Darwin_arm64")[4.14.3+relocatable
  ]\;

  $ get-object CommonsLang_OCaml.DkML@4.14.3 -s Release.Darwin_x86_64 -d ${RUNTIME}/Darwin_x86_64-DkML-4.14.3
  \test(pass)
  \dk.object(abi: "Release.Darwin_x86_64", value-id: "okzumfa6r4confdol3ixdbc7txprthvklwsrnmdiygkxwqr75fmea")\;

  $ run-object CommonsBase_FileMagic.File@7.8.50407 -s Release.execution_abi -m ./bin/file.exe -e bin/file.exe --
  >   -b $(get-object CommonsLang_OCaml.DkML@4.14.3 -s Release.target_abi -d : -e file.exe)/bin/ocamlopt
  \test(pass)
  \dk.target(abi: "Darwin_x86_64")[Mach-O 64-bit executable, flags:<NOUNDEFS|DYLDLINK|TWOLEVEL|WEAK_DEFINES|BINDS_TO_WEAK|PIE>
  ]\;

  $ get-object CommonsLang_OCaml.DkML@4.14.3 -s Release.Linux_arm64 -d ${RUNTIME}/Linux_arm64-DkML-4.14.3
  \test(pass)

  $ run-object CommonsBase_FileMagic.File@7.8.50407 -s Release.execution_abi -m ./bin/file.exe -e bin/file.exe --
  >   -b $(get-object CommonsLang_OCaml.DkML@4.14.3 -s Release.target_abi -d : -e file.exe)/bin/ocamlopt
  \test(pass)
  \dk.target(abi: "Linux_arm64")[ELF 64-bit LSB executable, ARM aarch64
  ]\;

  $ run-object CommonsLang_OCaml.DkML@4.14.3 -s Release.Linux_arm64 -e 'bin/*' -c bin/ocamlopt -- -version
  \test(pass)

  $ get-object CommonsLang_OCaml.DkML@4.14.3 -s Release.Linux_x86 -d ${RUNTIME}/Linux_x86-DkML-4.14.3
  \test(pass)
  \dk.object(abi: "Release.Linux_x86", value-id: "ovy2o34buas5pmhkxreefofjtqdxcr6c6rzshp3opang7uuznzbma")\;

  $ run-object CommonsBase_FileMagic.File@7.8.50407 -s Release.execution_abi -m ./bin/file.exe -e bin/file.exe --
  >   -b $(get-object CommonsLang_OCaml.DkML@4.14.3 -s Release.target_abi -d : -e file.exe)/bin/ocamlopt
  \test(pass)
  \dk.target(abi: "Linux_x86")[ELF 32-bit LSB executable, Intel i386, version 1 (SYSV)
  ]\;

  $ get-object CommonsLang_OCaml.DkML@4.14.3 -s Release.Linux_x86_64 -d ${RUNTIME}/Linux_x86_64-DkML-4.14.3
  \test(pass)
  \dk.object(abi: "Release.Linux_x86_64", value-id: "ot73vapttmhsm5oskmtiousmp7bmqheglknykhprnqp36bbzcm7ha")\;

  $ run-object CommonsBase_FileMagic.File@7.8.50407 -s Release.execution_abi -m ./bin/file.exe -e bin/file.exe --
  >   -b $(get-object CommonsLang_OCaml.DkML@4.14.3 -s Release.target_abi -d : -e file.exe)/bin/ocamlopt
  \test(pass)
  \dk.target(abi: "Linux_x86_64")[ELF 64-bit LSB executable, x86-64, version 1 (SYSV)
  ]\;

  $ run-object CommonsLang_OCaml.DkML@4.14.3 -s Release.Linux_x86_64 -e 'bin/*' -c bin/ocamlopt -- -version
  \test(pass)
  \dk.target(abi: "Linux_x86_64")[4.14.3+relocatable
  ]\;

The native_pack_linker must be a relocatable, PATH-resolved partial linker (a
bare `ld -r -o`), never an absolute build-host path such as the ephemeral
`.../src-ocaml/support/with-host-c-compiler.sh.ld64.sh` a stock build bakes;
otherwise `ocamlopt -pack` fails off the build machine.

  $ run-object CommonsLang_OCaml.DkML@4.14.3 -s Release.Linux_x86_64 -e 'bin/*' -c bin/ocamlopt -- -config-var native_pack_linker
  \test(pass)
  \dk.target(abi: "Linux_x86_64")[ld -r -o ]\;

The baked C toolchain must be bare PATH-resolved single-word names, never the
absolute /opt/rh/gcc-toolset-14 paths of the manylinux build container
(issue #2): end-user hosts supply their own PATH toolchain, while the release
build still resolves the same gcc-toolset-14 first on PATH.

  $ run-object CommonsLang_OCaml.DkML@4.14.3 -s Release.Linux_x86_64 -e 'bin/*' -c bin/ocamlopt -- -config-var c_compiler
  \test(pass)
  \dk.target(abi: "Linux_x86_64")[gcc]\;

  $ run-object CommonsLang_OCaml.DkML@4.14.3 -s Release.Linux_x86_64 -e 'bin/*' -c bin/ocamlopt -- -config-var asm
  \test(pass)
  \dk.target(abi: "Linux_x86_64")[as]\;

The runtime archives must be PIE-safe (issue #3): a link forced to -pie fails
on a non-PIC libasmrun.a with `relocation R_X86_64_32S ... can not be used
when making a PIE object`, reproducing on the non-PIE-default gcc-toolset
builder exactly what PIE-default consumer hosts do by default.

  $ run-object CommonsLang_OCaml.DkML@4.14.3 -s Release.Linux_x86_64 -e 'bin/*' -c bin/ocamlopt --
  >   -ccopt -pie -o ${RUNTIME}/piecheck.exe
  >   $(get-asset CommonsLang_OCaml.Apparatus.DkMLPieCheck@1.0.1 -p assets/dkml/piecheck.ml -f piecheck.ml)
  \test(pass)
  \dk.target(abi: "Linux_x86_64")\;

  $ get-object CommonsLang_OCaml.DkML@4.14.3 -s Release.Linux_x86_64_musl -d ${RUNTIME}/Linux_x86_64_musl-DkML-4.14.3
  \test(pass)
  \dk.object(abi: "Release.Linux_x86_64_musl", value-id: "obazby47qzcgflxlvkysgb7tcxcqfsm5ljhxktojhoui6dmuswzma")\;

The musl ocamlopt is a musl binary (ELF interpreter /lib/ld-musl-x86_64.so.1),
so it runs wherever the musl loader is present: natively on musl hosts, and on
the glibc manylinux build host because the build provisions the loader at that
path (see the per-ABI dynamic linker in DK0-REFERENCE.md). The file(1) string
below is harvested from the first CI run.

  $ run-object CommonsBase_FileMagic.File@7.8.50407 -s Release.execution_abi -m ./bin/file.exe -e bin/file.exe --
  >   -b $(get-object CommonsLang_OCaml.DkML@4.14.3 -s Release.target_abi -d : -e file.exe)/bin/ocamlopt
  \test(pass)
  \dk.target(abi: "Linux_x86_64_musl")[ELF 64-bit LSB ${x?pie executable:shared object}, x86-64, version 1 (SYSV)
  ]\;

  $ run-object CommonsLang_OCaml.DkML@4.14.3 -s Release.Linux_x86_64_musl -e 'bin/*' -c bin/ocamlopt -- -version
  \test(pass)
  \dk.target(abi: "Linux_x86_64_musl")[4.14.3+relocatable
  ]\;

The native_pack_linker must be a relocatable, PATH-resolved partial linker (a
bare `x86_64-linux-musl-ld -r -o`, resolved through the slot's
bin/x86_64-linux-musl-* dispatch wrappers), never an absolute build-host path
such as the ephemeral `.../src-ocaml/support/with-host-c-compiler.sh.ld64.sh` a
stock build bakes; otherwise `ocamlopt -pack` fails off the build machine. The
musl partial linker is required because the host `ld` cannot read the musl
toolchain's compressed debug sections.

  $ run-object CommonsLang_OCaml.DkML@4.14.3 -s Release.Linux_x86_64_musl -e 'bin/*' -c bin/ocamlopt -- -config-var native_pack_linker
  \test(pass)
  \dk.target(abi: "Linux_x86_64_musl")[x86_64-linux-musl-ld -r -o ]\;

The baked C compiler must be the bare musl cross driver, resolved through the
bin/x86_64-linux-musl-* dispatch wrappers shipped in the same slot, so
consumer machines link static musl executables wherever the slot's bin/ is on
PATH.

  $ run-object CommonsLang_OCaml.DkML@4.14.3 -s Release.Linux_x86_64_musl -e 'bin/*' -c bin/ocamlopt -- -config-var c_compiler
  \test(pass)
  \dk.target(abi: "Linux_x86_64_musl")[x86_64-linux-musl-gcc]\;

  $ get-object CommonsLang_OCaml.DkML@4.14.3 -s Release.Windows_x86 -d ${RUNTIME}/Windows_x86-DkML-4.14.3
  \test(pass)
  \dk.object(abi: "Release.Windows_x86", value-id: "otj6lfdhsvf6qonulwtjephn7wu7ow5ocwzkjknfplo2uanj65kya")\;

Release.Windows_x86_64 will be used as Release.execution_abi on normal (64-bit) build + CI machines.

  $ run-object CommonsBase_FileMagic.File@7.8.50407 -s Release.execution_abi -m ./bin/file.exe -e bin/file.exe --
  >   -b $(get-object CommonsLang_OCaml.DkML@4.14.3 -s Release.target_abi -d : -e file.exe)/bin/ocamlopt.exe
  \test(pass)
  \dk.target(abi: "Windows_x86")[PE32 executable for MS Windows 6.00 (console),, 5 sections
  ]\;

  $ run-object CommonsLang_OCaml.DkML@4.14.3 -s Release.Windows_x86 -c bin/ocamlopt.exe -- -version
  \test(pass)
  \dk.target(abi: "Windows_x86")[4.14.3+relocatable
  ]\;

  $ get-object CommonsLang_OCaml.DkML@4.14.3 -s Release.Windows_x86_64 -d ${RUNTIME}/Windows_x86_64-DkML-4.14.3
  \test(pass)
  \dk.object(abi: "Release.Windows_x86_64", value-id: "oxeed6f2bmqzx32bc4f5gy4fdkpmq7qzq7mizyrhlydogzmiaylua")\;

  $ run-object CommonsBase_FileMagic.File@7.8.50407 -s Release.execution_abi -m ./bin/file.exe -e bin/file.exe --
  >   -b $(get-object CommonsLang_OCaml.DkML@4.14.3 -s Release.target_abi -d : -e file.exe)/bin/ocamlopt.exe
  \test(pass)
  \dk.target(abi: "Windows_x86_64")[PE32+ executable for MS Windows 6.00 (console),, 6 sections
  ]\;

  $ run-object CommonsLang_OCaml.DkML@4.14.3 -s Release.Windows_x86_64 -c bin/ocamlopt.exe -- -version
  \test(pass)
  \dk.target(abi: "Windows_x86_64")[4.14.3+relocatable
  ]\;

Base

  $ run-object CommonsLang_OCaml.Base@5.5.0 -s Release.Darwin_arm64 -e 'bin/*' -c bin/ocamlopt -- -version
  \test(pass)
  \dk.target(abi: "Darwin_arm64")[5.5.0
  ]\;

  $ run-object CommonsLang_OCaml.Base@5.5.0 -s Release.Darwin_x86_64 -e 'bin/*' -c bin/ocamlopt -- -version
  \test(pass)
  \dk.target(abi: "Darwin_x86_64")[5.5.0
  ]\;

  $ run-object CommonsLang_OCaml.Base@5.5.0 -s Release.Linux_x86_64 -e 'bin/*' -c bin/ocamlopt -- -version
  \test(pass)
  \dk.target(abi: "Linux_x86_64")[5.5.0
  ]\;

The Base runtime archives must be PIE-safe like the DkML ones (issue #3): the
same forced -pie link exercises the -fPIC CFLAGS/ASPP added to the Base Linux
glibc configure blocks.

  $ run-object CommonsLang_OCaml.Base@5.5.0 -s Release.Linux_x86_64 -e 'bin/*' -c bin/ocamlopt --
  >   -ccopt -pie -o ${RUNTIME}/basepiecheck.exe
  >   $(get-asset CommonsLang_OCaml.Apparatus.DkMLPieCheck@1.0.1 -p assets/dkml/piecheck.ml -f piecheck.ml)
  \test(pass)
  \dk.target(abi: "Linux_x86_64")\;

  $ run-object CommonsLang_OCaml.Base@5.5.0 -s Release.Windows_x86_64 -e 'bin/*' -c bin/ocamlopt.exe -- -version
  \test(pass)
  \dk.target(abi: "Windows_x86_64")[5.5.0
  ]\;

Dune

  $ run-object CommonsLang_OCaml.Dune@3.23.1 -s Release.Darwin_arm64 -e 'bin/*' -c bin/dune.exe -- --version
  \test(pass)
  \dk.target(abi: "Darwin_arm64")[3.23.1
  ]\;

  $ run-object CommonsLang_OCaml.Dune@3.23.1 -s Release.Darwin_x86_64 -e 'bin/*' -c bin/dune.exe -- --version
  \test(pass)
  \dk.target(abi: "Darwin_x86_64")[3.23.1
  ]\;

  $ run-object CommonsLang_OCaml.Dune@3.23.1 -s Release.Linux_arm64 -e 'bin/*' -c bin/dune.exe -- --version
  \test(pass)
  \dk.target(abi: "Linux_arm64")[3.23.1
  ]\;

  $ run-object CommonsLang_OCaml.Dune@3.23.1 -s Release.Linux_x86 -e 'bin/*' -c bin/dune.exe -- --version
  \test(pass)
  \dk.target(abi: "Linux_x86")[3.23.1
  ]\;

  $ run-object CommonsLang_OCaml.Dune@3.23.1 -s Release.Linux_x86_64 -e 'bin/*' -c bin/dune.exe -- --version
  \test(pass)
  \dk.target(abi: "Linux_x86_64")[3.23.1
  ]\;

  $ run-object CommonsLang_OCaml.Dune@3.23.1 -s Release.Linux_x86_64_musl -e 'bin/*' -c bin/dune.exe -- --version
  \test(pass)
  \dk.target(abi: "Linux_x86_64_musl")[3.23.1
  ]\;

  $ run-object CommonsLang_OCaml.Dune@3.23.1 -s Release.Windows_x86 -e 'bin/*' -c bin/dune.exe -- --version
  \test(pass)
  \dk.target(abi: "Windows_x86")[3.23.1
  ]\;

  $ run-object CommonsLang_OCaml.Dune@3.23.1 -s Release.Windows_x86_64 -e 'bin/*' -c bin/dune.exe -- --version
  \test(pass)
  \dk.target(abi: "Windows_x86_64")[3.23.1
  ]\;

Opam

  $ run-object CommonsLang_OCaml.Opam@2.5.1 -s Release.Darwin_arm64 -e 'bin/*' -c bin/opam.exe -- --version
  \test(pass)
  \dk.target(abi: "Darwin_arm64")[2.5.1
  ]\;

  $ run-object CommonsLang_OCaml.Opam@2.5.1 -s Release.Darwin_x86_64 -e 'bin/*' -c bin/opam.exe -- --version
  \test(pass)
  \dk.target(abi: "Darwin_x86_64")[2.5.1
  ]\;

  $ run-object CommonsLang_OCaml.Opam@2.5.1 -s Release.Linux_arm64 -e 'bin/*' -c bin/opam.exe -- --version
  \test(pass)
  \dk.target(abi: "Linux_arm64")[2.5.1
  ]\;

  $ run-object CommonsLang_OCaml.Opam@2.5.1 -s Release.Linux_x86 -e 'bin/*' -c bin/opam.exe -- --version
  \test(pass)
  \dk.target(abi: "Linux_x86")[2.5.1
  ]\;

  $ run-object CommonsLang_OCaml.Opam@2.5.1 -s Release.Linux_x86_64 -e 'bin/*' -c bin/opam.exe -- --version
  \test(pass)
  \dk.target(abi: "Linux_x86_64")[2.5.1
  ]\;

  $ run-object CommonsLang_OCaml.Opam@2.5.1 -s Release.Windows_x86 -e 'bin/*' -c bin/opam.exe -- --version
  \test(pass)
  \dk.target(abi: "Windows_x86")[2.5.1
  ]\;

  $ run-object CommonsLang_OCaml.Opam@2.5.1 -s Release.Windows_x86_64 -e 'bin/*' -c bin/opam.exe -- --version
  \test(pass)
  \dk.target(abi: "Windows_x86_64")[2.5.1
  ]\;

Dk.OpamLock

Only the current OpamLock revision ships. The retired Export@1.0.0-@1.1.7
ladder lives in pre-2026-08 release tags and git history (see dk.u
"## Assets" for the keep-latest-only policy).

  $ run-function CommonsLang_OCaml.Dk.OpamLock.Export@1.1.8 -f ${RUNTIME}/OpamLock.Export-1.1.8.zip
  \test(pass)
  \dk.object(abi: "Release.Darwin_arm64", value-id: "o3p64mbiduxpp3bliviomwb3t2vca2naizevok5fmkmfakcug572a")\;


Only the current OpamLock revision ships. The retired Export@1.0.0-@1.1.7
ladder lives in pre-2026-08 release tags and git history (see dk.u
"## Assets" for the keep-latest-only policy).

  $ run-function CommonsLang_OCaml.Dk.OpamLock.Export@1.1.8 -f ${RUNTIME}/OpamLock.Export-1.1.8.zip
  \test(pass)
  \dk.object(abi: "Release.Darwin_arm64", value-id: "o3p64mbiduxpp3bliviomwb3t2vca2naizevok5fmkmfakcug572a")\;


Only the current OpamLock revision ships. The retired Export@1.0.0-@1.1.7
ladder lives in pre-2026-08 release tags and git history (see dk.u
"## Assets" for the keep-latest-only policy). As before on this arm64 slot
the marker output is unused (no object value-id is recorded).

  $ run-function CommonsLang_OCaml.Dk.OpamLock.Export@1.1.8 -f ${RUNTIME}/OpamLock.Export-1.1.8.zip
  \test(pass)

Only the current OpamLock revision ships. The retired Export@1.0.0-@1.1.7
ladder lives in pre-2026-08 release tags and git history (see dk.u
"## Assets" for the keep-latest-only policy).

  $ run-function CommonsLang_OCaml.Dk.OpamLock.Export@1.1.8 -f ${RUNTIME}/OpamLock.Export-1.1.8.zip
  \test(pass)
  \dk.object(abi: "Release.Linux_x86_64", value-id: "ofdz6u35qxanoad2v5mpnbzz7mm6ji3y52pxew4b4gfqvnqhm2fka")\;


Only the current OpamLock revision ships. The retired Export@1.0.0-@1.1.7
ladder lives in pre-2026-08 release tags and git history (see dk.u
"## Assets" for the keep-latest-only policy).

  $ run-function CommonsLang_OCaml.Dk.OpamLock.Export@1.1.8 -f ${RUNTIME}/OpamLock.Export-1.1.8.zip
  \test(pass)
  \dk.object(abi: "Release.Linux_x86_64", value-id: "ofdz6u35qxanoad2v5mpnbzz7mm6ji3y52pxew4b4gfqvnqhm2fka")\;


Only the current OpamLock revision ships. The retired Export@1.0.0-@1.1.7
ladder lives in pre-2026-08 release tags and git history (see dk.u
"## Assets" for the keep-latest-only policy).

  $ run-function CommonsLang_OCaml.Dk.OpamLock.Export@1.1.8 -f ${RUNTIME}/OpamLock.Export-1.1.8.zip
  \test(pass)
  \dk.object(abi: "Release.Linux_x86_64", value-id: "ofdz6u35qxanoad2v5mpnbzz7mm6ji3y52pxew4b4gfqvnqhm2fka")\;

Only the current OpamLock revision ships. The retired Export@1.0.0-@1.1.7
ladder lives in pre-2026-08 release tags and git history (see dk.u
"## Assets" for the keep-latest-only policy).

  $ run-function CommonsLang_OCaml.Dk.OpamLock.Export@1.1.8 -f ${RUNTIME}/OpamLock.Export-1.1.8.zip
  \test(pass)
  \dk.object(abi: "Release.Windows_x86_64", value-id: "osnobe53gdkgf7knhlnmb5z77pf5lguffbfmttbluhajhyuc5fovq")\;


Only the current OpamLock revision ships. The retired Export@1.0.0-@1.1.7
ladder lives in pre-2026-08 release tags and git history (see dk.u
"## Assets" for the keep-latest-only policy).

  $ run-function CommonsLang_OCaml.Dk.OpamLock.Export@1.1.8 -f ${RUNTIME}/OpamLock.Export-1.1.8.zip
  \test(pass)
  \dk.object(abi: "Release.Windows_x86_64", value-id: "osnobe53gdkgf7knhlnmb5z77pf5lguffbfmttbluhajhyuc5fovq")\;


Dk.OpamBuild

Only the current OpamBuild revision ships. The retired Export@1.0.0-@1.0.15
ladder lives in pre-2026-08 release tags and git history (see dk.u
"## Assets" for the keep-latest-only policy).

  $ run-function CommonsLang_OCaml.Dk.OpamBuild.Export@1.0.18 -f ${RUNTIME}/OpamBuild.Export-1.0.18.zip
  \test(pass)
  \dk.object(abi: "Release.Darwin_arm64", value-id: "ot36qu3466etoe2n4fwegx5oven5jtringcjn4njmy7n4ayspxb6q")\;
Only the current OpamBuild revision ships. The retired Export@1.0.0-@1.0.15
ladder lives in pre-2026-08 release tags and git history (see dk.u
"## Assets" for the keep-latest-only policy).

  $ run-function CommonsLang_OCaml.Dk.OpamBuild.Export@1.0.18 -f ${RUNTIME}/OpamBuild.Export-1.0.18.zip
  \test(pass)
  \dk.object(abi: "Release.Darwin_arm64", value-id: "ot36qu3466etoe2n4fwegx5oven5jtringcjn4njmy7n4ayspxb6q")\;
Only the current OpamBuild revision ships. The retired Export@1.0.0-@1.0.15
ladder lives in pre-2026-08 release tags and git history (see dk.u
"## Assets" for the keep-latest-only policy).

  $ run-function CommonsLang_OCaml.Dk.OpamBuild.Export@1.0.18 -f ${RUNTIME}/OpamBuild.Export-1.0.18.zip
  \test(pass)
  \dk.object(abi: "Release.Linux_arm64", value-id: "ow53l5vi6n5qcxrcherm65hd2t3u245u6uthawrgryjjeospk5kjq")\;
Only the current OpamBuild revision ships. The retired Export@1.0.0-@1.0.15
ladder lives in pre-2026-08 release tags and git history (see dk.u
"## Assets" for the keep-latest-only policy).

  $ run-function CommonsLang_OCaml.Dk.OpamBuild.Export@1.0.18 -f ${RUNTIME}/OpamBuild.Export-1.0.18.zip
  \test(pass)
  \dk.object(abi: "Release.Linux_x86_64", value-id: "ox2yguwbuo7ev3o5ovs5vcjgsljpqjev73hi6ze6isy6mmksrfasq")\;
Only the current OpamBuild revision ships. The retired Export@1.0.0-@1.0.15
ladder lives in pre-2026-08 release tags and git history (see dk.u
"## Assets" for the keep-latest-only policy).

  $ run-function CommonsLang_OCaml.Dk.OpamBuild.Export@1.0.18 -f ${RUNTIME}/OpamBuild.Export-1.0.18.zip
  \test(pass)
  \dk.object(abi: "Release.Linux_x86_64", value-id: "ox2yguwbuo7ev3o5ovs5vcjgsljpqjev73hi6ze6isy6mmksrfasq")\;
Only the current OpamBuild revision ships. The retired Export@1.0.0-@1.0.15
ladder lives in pre-2026-08 release tags and git history (see dk.u
"## Assets" for the keep-latest-only policy).

  $ run-function CommonsLang_OCaml.Dk.OpamBuild.Export@1.0.18 -f ${RUNTIME}/OpamBuild.Export-1.0.18.zip
  \test(pass)
  \dk.object(abi: "Release.Linux_x86_64", value-id: "ox2yguwbuo7ev3o5ovs5vcjgsljpqjev73hi6ze6isy6mmksrfasq")\;
Only the current OpamBuild revision ships. The retired Export@1.0.0-@1.0.15
ladder lives in pre-2026-08 release tags and git history (see dk.u
"## Assets" for the keep-latest-only policy).

  $ run-function CommonsLang_OCaml.Dk.OpamBuild.Export@1.0.18 -f ${RUNTIME}/OpamBuild.Export-1.0.18.zip
  \test(pass)
  \dk.object(abi: "Release.Windows_x86_64", value-id: "orlivsdhgqn6hmk3yq3gm35adggjgmx3bccn6nyluhahl4wl27cvq")\;
Only the current OpamBuild revision ships. The retired Export@1.0.0-@1.0.15
ladder lives in pre-2026-08 release tags and git history (see dk.u
"## Assets" for the keep-latest-only policy).

  $ run-function CommonsLang_OCaml.Dk.OpamBuild.Export@1.0.18 -f ${RUNTIME}/OpamBuild.Export-1.0.18.zip
  \test(pass)
  \dk.object(abi: "Release.Windows_x86_64", value-id: "orlivsdhgqn6hmk3yq3gm35adggjgmx3bccn6nyluhahl4wl27cvq")\;

MSYS2

MSYS2 tree for `opam init --cygwin-local-install --cygwin-location=<obj>` in
the Dk.OpamLock hermetic bootstrap (opam detects MSYS2 via
usr/bin/cygpath.exe). Windows x86_64 only: x86/arm64 Windows hosts run the
x64 tree through WOW64/emulation.

  $ get-object CommonsLang_OCaml.MSYS2@2026.6.11 -s Release.Windows_x86_64 -f ${RUNTIME}/Windows_x86_64-MSYS2-2026.6.11.zip
  \test(pass)
  \dk.object(abi: "Release.Windows_x86_64", value-id: "ozjqpoyewgl2wsnrk5uekbleo3644auhcyri2gexstfr3k5slof5q")\;

Provides

ModuleVersionPlatformvalue-id
CommonsLang_OCaml.DkML 4.14.3 Darwin_arm64 oo4ayzg7xkx5…
CommonsLang_OCaml.DkML 4.14.3 Darwin_x86_64 okzumfa6r4co…
CommonsLang_OCaml.DkML 4.14.3 Linux_x86 ovy2o34buas5…
CommonsLang_OCaml.DkML 4.14.3 Linux_x86_64 ot73vapttmhs…
CommonsLang_OCaml.DkML 4.14.3 Linux_x86_64_musl obazby47qzcg…
CommonsLang_OCaml.DkML 4.14.3 Windows_x86 otj6lfdhsvf6…
CommonsLang_OCaml.DkML 4.14.3 Windows_x86_64 oxeed6f2bmqz…
CommonsLang_OCaml.Base 5.5.0 apparatus
CommonsLang_OCaml.Dune 3.23.1 apparatus
CommonsLang_OCaml.Opam 2.5.1 apparatus
CommonsLang_OCaml.Dk.OpamLock.Export 1.1.8 Darwin_arm64 o3p64mbiduxp…
CommonsLang_OCaml.Dk.OpamLock.Export 1.1.8 Darwin_arm64 o3p64mbiduxp…
CommonsLang_OCaml.Dk.OpamLock.Export 1.1.8 Linux_x86_64 ofdz6u35qxan…
CommonsLang_OCaml.Dk.OpamLock.Export 1.1.8 Linux_x86_64 ofdz6u35qxan…
CommonsLang_OCaml.Dk.OpamLock.Export 1.1.8 Linux_x86_64 ofdz6u35qxan…
CommonsLang_OCaml.Dk.OpamLock.Export 1.1.8 Windows_x86_64 osnobe53gdkg…
CommonsLang_OCaml.Dk.OpamLock.Export 1.1.8 Windows_x86_64 osnobe53gdkg…
CommonsLang_OCaml.Dk.OpamBuild.Export 1.0.18 Darwin_arm64 ot36qu3466et…
CommonsLang_OCaml.Dk.OpamBuild.Export 1.0.18 Darwin_arm64 ot36qu3466et…
CommonsLang_OCaml.Dk.OpamBuild.Export 1.0.18 Linux_arm64 ow53l5vi6n5q…
CommonsLang_OCaml.Dk.OpamBuild.Export 1.0.18 Linux_x86_64 ox2yguwbuo7e…
CommonsLang_OCaml.Dk.OpamBuild.Export 1.0.18 Linux_x86_64 ox2yguwbuo7e…
CommonsLang_OCaml.Dk.OpamBuild.Export 1.0.18 Linux_x86_64 ox2yguwbuo7e…
CommonsLang_OCaml.Dk.OpamBuild.Export 1.0.18 Windows_x86_64 orlivsdhgqn6…
CommonsLang_OCaml.Dk.OpamBuild.Export 1.0.18 Windows_x86_64 orlivsdhgqn6…
CommonsLang_OCaml.MSYS2 2026.6.11 Windows_x86_64 ozjqpoyewgl2…

Workspace assets

Files and directories in the package repo, bundled into the build.

AssetProject pathType
Patches assets/p directory
Scripts assets/s directory
Tables assets/table directory
WineHostShim assets/wine-hostshim directory
DkMLRoot assets/dkml/dkmlroot.2.4.2-29.txt file
DkMLPatchRelocatableVersion assets/dkml/patch-r-c-ocaml-1-setup-relocatable-version.sh file
DkMLRunBuildHost assets/dkml/run-build-host.sh file
DkMLDetectVsEnvBat assets/dkml/detect-vsenv.bat file
DkMLCleanupSlot assets/dkml/cleanup-dkml-slot.sh file
DkMLPatchStandardCompilerEnvWv18 assets/dkml/patch-standard-compiler-env-wv18.sh file
DkMLMuslWrap assets/dkml/musl-tool-wrapper.sh file
DkMLMuslBuildHost assets/dkml/run-musl-build-host.sh file
DkMLX86Wrap assets/dkml/x86-tool-wrapper.sh file
DkMLX86BuildHost assets/dkml/run-x86-build-host.sh file
DkMLGlibcEnv assets/dkml/glibc-compiler-env-to-ocaml-configure-env.sh file
DkMLPieCheck assets/dkml/piecheck.ml file
DuneBootstrapMsvc assets/dune/bootstrap-msvc.bat file
OpamBuildWin assets/opam/opam-build-win.sh file
OpamBuildWinVcvars assets/opam/opam-build-win-vcvars.bat file
OpamMsvsDetectStub assets/opam/msvs-detect-stub.sh file
OpamMccsGlpkStub assets/opam/mccs-glpk-wrmip-stub.c file
OpamBuildSeqMeta assets/opam/seq-META file
OpamFileFormat assets/opam-lock/opam_file_format.ml file
OpamBuildWrapper assets/opam/build-locked-package.sh file
DkMLMuslEnv assets/dkml/musl-compiler-env-to-ocaml-configure-env.sh file
DkMLX86Env assets/dkml/x86-compiler-env-to-ocaml-configure-env.sh file
OpamLockHelper assets/opam-lock/dk_opam_lock.ml file

Downloaded assets

Third-party sources fetched and checksum-verified during the build.

AssetSizesha256Source
4.14.3.tar.gz 5.3 MB e510689183b2d62b… https://github.com/ocaml/ocaml/archive/refs/tags/4.14.3.tar.gz
5.5.0.tar.gz 4.8 MB c018052c8264a379… https://github.com/ocaml/ocaml/archive/5.5.0.tar.gz
ocaml-5.4.1.tar.gz 6.2 MB d4528517aaa1a44b… https://github.com/ocaml/ocaml/releases/download/5.4.1/ocaml-5.4.1.tar.gz
2.5.1.tar.gz 1.2 MB 459a57cb84c3ea16… https://github.com/ocaml/opam/archive/refs/tags/2.5.1.tar.gz
menhir-20250903-no-symlinks.tar 4.2 MB 087792aff8fb1238… https://github.com/dkpkg/CommonsLang_OCaml/releases/download/opam-menhir-20250903-no-symlinks/menhir-20250903-no-symlinks.tar
2.4.2-50.zip 1.5 MB 3239282aaa91fff1… https://github.com/diskuv/dkml-compiler/archive/refs/tags/2.4.2-50.zip
src.zip 61 KB 6dde51c5f6605a83… https://github.com/diskuv/dkml-runtime-common/releases/download/2.4.2-26/src.zip
msys2-base-x86_64-20260611.tar.xz 51.1 MB a2d047e8ee213c3c… https://github.com/dkpkg/CommonsLang_OCaml/releases/download/msys2-20260611-assets/msys2-base-x86_64-20260611.tar.xzhttps://github.com/msys2/msys2-installer/releases/download/2026-06-11/msys2-base-x86_64-20260611.tar.xz
3.23.1.tar.gz 3.5 MB 63fbef75d09dd4a0… https://github.com/ocaml/dune/archive/refs/tags/3.23.1.tar.gz
x86_64-linux-musl-cross.tgz 107.2 MB c6226824d6b7214c… https://github.com/dkpkg/CommonsLang_OCaml/releases/download/muslcc-x86_64-11.2.1/x86_64-linux-musl-cross.tgzhttps://more.musl.cc/11.2.1/x86_64-linux-musl/x86_64-linux-musl-cross.tgz

Dependencies

PackageVersionsha256
CommonsBase_FileMagic 0.1.20260723064047 db96de9d371ce051…
CommonsBase_LLVM 0.1.20260723061853 bc04736f7a5897fa…
CommonsBase_Win32 0.1.20260720170430 82665762f663fab6…
NotMitEdu_Kerberos 0.1.20260722181247 f43c2a4762aaee8c…
NotMatveevKondratyev_Libinotify 0.1.20260719215723 fb8fdd1de5dd4f6b…
CommonsBase_GNU 0.1.20260803042217 e4e77c1e3e625835…
CommonsBase_Std 2.6.20260813134421 f932d71bd74c858f…
CommonsBase_Build 0.1.20260718232516 f48d91a5fad0af89…

Producer signing key

Releases of this package are signed with this OpenBSD signify key. After you import the package, dk1 trust list prints the same public key and fingerprint; compare them here to confirm you are trusting the intended publisher over a channel independent of the download.

Fingerprint 2b19619c380dd657
Public key RWQrGWGcOA3WV93QbuXdm8aAWjDkYvCM5jgFAanfDRiW9n3PzSvLESmR