The shared multi-call plugin host for charly.
charly-lib is one statically-linked Go binary that hosts every "welded" charly
plugin and dispatches it by the base name it was invoked as (argv[0]). The distro
packages install it once at /usr/lib/charly/charly-lib and symlink
/usr/lib/charly/plugins/plugin-<word> → charly-lib, so the shared SDK/spec
closure is stored once instead of re-linked into each per-plugin binary
(opencharly/sdk#256; ~87% smaller plugin payload).
- The plugin set is DATA —
scripts/host-command-plugins.txtinopencharly/charly(fetched at thecharly_refinput). No plugin is named in hand-written code. - The host source is GENERATED —
charly-lib-gen(opencharly/sdk/cmd/charly-lib-gen) emitsmain.go+go.modthat register each pinned plugin intocharlylib.Run(opencharly/sdk/charlylib), then the binary is built pure-Go (CGO_ENABLED=0) for amd64 + arm64 + armv7. - The loader contract is unchanged — a
.providersword manifest beside an executable namedplugin-<word>; charly'sbakedPluginDirsworks as-is.
| asset | what |
|---|---|
charly-lib-linux-amd64 / charly-lib-linux-arm64 / charly-lib-linux-armv7 |
the host binary |
<plugin>.providers |
each plugin's word manifest (maps class:word → the plugin-<word> symlink) |
armv7 is the 32-bit appliance target (a JetKVM's uClibc armv7l userland, older
32-bit SBCs) — the same third architecture the main charly release publishes.
It builds as GOARCH=arm GOARM=7 (armv7 is not a valid GOARCH).
Actions → build → Run workflow. Inputs:
charly_ref— the charly ref holdingscripts/host-command-plugins.txt(the pins).sdk_ref— the opencharly/sdk ref carryingcmd/charly-lib-gen.sdk_version— thegithub.com/opencharly/sdkGo module version the host requires (must be compatible with every pinned plugin — see opencharly/charly#605).version— a CalVer to tag + publish; empty = build-only (no release).
The build clones the SDK (generator) and every pinned plugin, generates the host,
builds both arches, emits the .providers manifests, verifies every word dispatches
by running each plugin-<word> symlink in go-plugin serve mode, and (when version
is set) publishes the release.