dist.mk (3226B)
1 # mk/dist.mk 2 # =========================================================================== 3 # Release packaging: dogfood kit's own signed pkg/cas pipeline onto kit's own 4 # release (doc/plan/SELFDIST.md). `make dist` builds RELEASE=1, stages a 5 # self-contained kit/ tree, and emits — for the native host triple — a signed 6 # fat .kpkg, a signed portable .tar.gz, and a detached .tar.gz.minisig (the 7 # stock-minisign bootstrap path). Release trust is mandatory: callers provide 8 # KIT_SIGN_KEY, KIT_RELEASE_PUBKEYS, and KIT_UPDATE_INDEX_URL. Hermetic tests 9 # that intentionally use the in-tree non-release key must opt in explicitly 10 # with KIT_RELEASE_ALLOW_TEST_KEY=1. `make dist-dev` supplies that hermetic 11 # configuration as a convenience. The multi-target matrix + channel index live 12 # in scripts/release.sh. 13 14 .PHONY: dist dist-dev 15 16 ifneq ($(filter dist,$(MAKECMDGOALS)),) 17 ifeq ($(strip $(KIT_SIGN_KEY)),) 18 $(error dist requires KIT_SIGN_KEY (production Minisign secret key file)) 19 endif 20 ifneq ($(KIT_RELEASE_ALLOW_TEST_KEY),1) 21 DIST_TEST_KEY_ID := $(strip $(shell sh scripts/minisign_key_id.sh test/dist/keys/nonrelease.key 2>/dev/null)) 22 DIST_SIGN_KEY_ID := $(strip $(shell sh scripts/minisign_key_id.sh "$(KIT_SIGN_KEY)" 2>/dev/null)) 23 ifeq ($(DIST_SIGN_KEY_ID),$(DIST_TEST_KEY_ID)) 24 $(error dist refuses the repository NON-RELEASE test signing key) 25 endif 26 endif 27 endif 28 29 DIST_DIR = build/dist 30 DIST_STAGING = $(DIST_DIR)/kit 31 DIST_REL_BIN = build/release/kit 32 DIST_REL_LIB = build/release/libkit.a 33 DIST_KEY = $(KIT_SIGN_KEY) 34 DIST_BASE = kit-$(KIT_VERSION)-$(KIT_HOST_TRIPLE) 35 DIST_KPKG = $(DIST_DIR)/$(DIST_BASE).kpkg 36 DIST_TARGZ = $(DIST_DIR)/$(DIST_BASE).tar.gz 37 38 dist-dev: 39 $(MAKE) dist \ 40 KIT_SIGN_KEY=test/dist/keys/nonrelease.key \ 41 KIT_RELEASE_PUBKEYS=test/dist/keys/nonrelease.pub \ 42 KIT_RELEASE_ALLOW_TEST_KEY=1 \ 43 KIT_UPDATE_INDEX_URL=https://example.invalid/stable.index 44 45 dist: 46 @if [ ! -f "$(KIT_SIGN_KEY)" ]; then \ 47 printf '%s\n' 'dist: KIT_SIGN_KEY is not a file: $(KIT_SIGN_KEY)' >&2; \ 48 exit 2; \ 49 fi 50 $(MAKE) RELEASE=1 bin 51 @rm -rf $(DIST_STAGING) 52 @mkdir -p $(DIST_STAGING)/bin $(DIST_STAGING)/lib $(DIST_STAGING)/support/rt 53 cp $(DIST_REL_BIN) $(DIST_STAGING)/bin/kit 54 cp $(DIST_REL_LIB) $(DIST_STAGING)/lib/libkit.a 55 cp -r include $(DIST_STAGING)/include 56 cp -r rt/include $(DIST_STAGING)/support/rt/include 57 cp -r rt/lib $(DIST_STAGING)/support/rt/lib 58 cp VERSION $(DIST_STAGING)/VERSION 59 cp README.md $(DIST_STAGING)/README.md 60 @sh scripts/stage_docs.sh . $(DIST_STAGING)/doc 61 @for f in LICENSE LICENSE.txt LICENSE.md NOTICE NOTICE.txt; do \ 62 [ -f "$$f" ] && cp "$$f" "$(DIST_STAGING)/$$f"; done; true 63 $(DIST_REL_BIN) pkg create --name kit --version $(KIT_VERSION) \ 64 --format kpkg --native-shape fat -s "$(DIST_KEY)" \ 65 --root $(DIST_STAGING) -o $(DIST_KPKG) 66 $(DIST_REL_BIN) pkg create --name kit --version $(KIT_VERSION) \ 67 --format tar.gz -s "$(DIST_KEY)" \ 68 --root $(DIST_STAGING) -o $(DIST_TARGZ) 69 $(DIST_REL_BIN) pkg sign -s "$(DIST_KEY)" \ 70 -o $(DIST_TARGZ).minisig --comment "kit $(KIT_VERSION) $(KIT_HOST_TRIPLE)" \ 71 $(DIST_TARGZ) 72 @echo "dist: $(abspath $(DIST_KPKG))" 73 @echo "dist: $(abspath $(DIST_TARGZ))" 74 @echo "dist: $(abspath $(DIST_TARGZ)).minisig"