kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

commit 0b2ac3d8b7b48659b680243876657755192b1f9a
parent 2c7434a4beb4f2c026bd1713c26008e4725174cd
Author: Ryan Sepassi <rsepassi@gmail.com>
Date:   Wed, 17 Jun 2026 13:27:27 -0700

selfdist: make dist emits signed kpkg + tar.gz + detached minisig; DIST_MAX_ARTIFACTS>=DIST_MAX_FILES so multi-file (kit) packages build

Diffstat:
Mmk/dist.mk | 50+++++++++++++++++++++++++++++++++++++++++---------
Msrc/dist/dist.h | 9++++++---
2 files changed, 47 insertions(+), 12 deletions(-)

diff --git a/mk/dist.mk b/mk/dist.mk @@ -1,21 +1,53 @@ # mk/dist.mk # =========================================================================== -# Release tarball staging: a self-contained kit/ tree (binary, libkit.a, -# public headers, runtime sources) packaged as kit.tar.gz. +# Release packaging: dogfood kit's own signed pkg/cas pipeline onto kit's own +# release (doc/plan/SELFDIST.md). `make dist` builds RELEASE=1, stages a +# self-contained kit/ tree, and emits — for the native host triple — a signed +# fat .kpkg, a signed portable .tar.gz, and a detached .tar.gz.minisig (the +# stock-minisign bootstrap path). It signs with $(KIT_SIGN_KEY) when set, else +# the in-tree NON-RELEASE test key (with a loud warning), so the full +# make-dist -> verify -> update pipeline runs hermetically. The multi-target +# matrix + channel index live in scripts/release.sh. .PHONY: dist -DIST_STAGING = build/dist/kit -DIST_TARBALL = build/dist/kit.tar.gz +DIST_DIR = build/dist +DIST_STAGING = $(DIST_DIR)/kit +DIST_REL_BIN = build/release/kit +DIST_REL_LIB = build/release/libkit.a +DIST_KEY = $(if $(KIT_SIGN_KEY),$(KIT_SIGN_KEY),test/dist/keys/nonrelease.key) +DIST_BASE = kit-$(KIT_VERSION)-$(KIT_HOST_TRIPLE) +DIST_KPKG = $(DIST_DIR)/$(DIST_BASE).kpkg +DIST_TARGZ = $(DIST_DIR)/$(DIST_BASE).tar.gz dist: $(MAKE) RELEASE=1 bin + @if [ -z "$(KIT_SIGN_KEY)" ]; then \ + printf '\n*** WARNING: KIT_SIGN_KEY is unset — signing with the in-tree\n'; \ + printf '*** NON-RELEASE test key (test/dist/keys/nonrelease.key). The\n'; \ + printf '*** artifacts verify but are NOT a real release. Set KIT_SIGN_KEY\n'; \ + printf '*** to sign for distribution.\n\n'; \ + fi @rm -rf $(DIST_STAGING) - @mkdir -p $(DIST_STAGING)/support/rt $(DIST_STAGING)/lib - cp build/release/kit $(DIST_STAGING)/kit - cp build/release/libkit.a $(DIST_STAGING)/lib/libkit.a + @mkdir -p $(DIST_STAGING)/bin $(DIST_STAGING)/lib $(DIST_STAGING)/support/rt + cp $(DIST_REL_BIN) $(DIST_STAGING)/bin/kit + cp $(DIST_REL_LIB) $(DIST_STAGING)/lib/libkit.a cp -r include $(DIST_STAGING)/include cp -r rt/include $(DIST_STAGING)/support/rt/include cp -r rt/lib $(DIST_STAGING)/support/rt/lib - cd build/dist && tar czf kit.tar.gz kit - @echo "dist: $(abspath $(DIST_TARBALL))" + cp VERSION $(DIST_STAGING)/VERSION + @cp README.md $(DIST_STAGING)/README.txt 2>/dev/null || true + @for f in LICENSE LICENSE.txt LICENSE.md NOTICE NOTICE.txt; do \ + [ -f "$$f" ] && cp "$$f" "$(DIST_STAGING)/$$f"; done; true + $(DIST_REL_BIN) pkg create --name kit --version $(KIT_VERSION) \ + --format kpkg --native-shape fat -s $(DIST_KEY) \ + --root $(DIST_STAGING) -o $(DIST_KPKG) + $(DIST_REL_BIN) pkg create --name kit --version $(KIT_VERSION) \ + --format tar.gz -s $(DIST_KEY) \ + --root $(DIST_STAGING) -o $(DIST_TARGZ) + $(DIST_REL_BIN) pkg sign -s $(DIST_KEY) \ + -o $(DIST_TARGZ).minisig --comment "kit $(KIT_VERSION) $(KIT_HOST_TRIPLE)" \ + $(DIST_TARGZ) + @echo "dist: $(abspath $(DIST_KPKG))" + @echo "dist: $(abspath $(DIST_TARGZ))" + @echo "dist: $(abspath $(DIST_TARGZ)).minisig" diff --git a/src/dist/dist.h b/src/dist/dist.h @@ -22,10 +22,13 @@ #define DIST_KEYID_LEN 8u /* Fixed parse/build capacities. These caps bound a single package's metadata - * and member count. */ -#define DIST_MAX_ARTIFACTS 64u -#define DIST_MAX_DEPS 64u + * and member count. create-from-root emits one [artifact] overlay per tree + * file, so DIST_MAX_ARTIFACTS must stay >= DIST_MAX_FILES or a package with + * more than DIST_MAX_ARTIFACTS files cannot be built (e.g. a kit release, which + * ships its headers + rt sources). */ #define DIST_MAX_FILES 256u +#define DIST_MAX_ARTIFACTS 256u +#define DIST_MAX_DEPS 64u #define DIST_MAX_OUTPUTS 16u /* (No per-blob chunk cap: dist_blob_root computes the chunk Merkle root in