/ Makefile
Makefile
1 BINARY := bupdate 2 OUT := bupdate 3 VERSION := $(shell grep '^version' Cargo.toml | head -1 | cut -d'"' -f2) 4 DIST := dist 5 EPOCH := $(shell git log -1 --format=%ct 2>/dev/null || date +%s) 6 CROSS := $(shell command -v cross 2>/dev/null || echo "$(HOME)/.cargo/bin/cross") 7 8 TARGETS := x86_64-unknown-linux-musl \ 9 aarch64-unknown-linux-musl \ 10 x86_64-pc-windows-gnu \ 11 x86_64-unknown-freebsd 12 13 RUSTFLAGS_RELEASE := -C strip=symbols 14 15 .PHONY: all clean docker cross native checksums setup-hooks help 16 17 help: 18 @echo "bupdate v$(VERSION) build targets:" 19 @echo "" 20 @echo " make native - Build for current platform (release)" 21 @echo " make cross - Cross-compile all targets via cross-rs" 22 @echo " make docker - Deterministic build via Docker (linux + windows + freebsd)" 23 @echo " Pinned: Rust 1.85, Debian bookworm, all deps locked." 24 @echo " Same source = same SHA256 on any host." 25 @echo " make checksums - Generate SHA256 + BLAKE2 checksums for dist/" 26 @echo " make setup-hooks - Install git pre-commit hook" 27 @echo " make clean - Remove dist/ and target/" 28 @echo "" 29 @echo "Targets: $(TARGETS)" 30 31 native: 32 SOURCE_DATE_EPOCH=$(EPOCH) RUSTFLAGS="$(RUSTFLAGS_RELEASE)" \ 33 cargo build --release 34 @mkdir -p $(DIST) 35 @cp target/release/$(BINARY) $(DIST)/$(OUT)-native 36 @echo "-> $(DIST)/$(OUT)-native" 37 38 cross: $(addprefix cross-,$(TARGETS)) 39 40 cross-%: 41 @mkdir -p $(DIST) 42 SOURCE_DATE_EPOCH=$(EPOCH) RUSTFLAGS="$(RUSTFLAGS_RELEASE)" \ 43 $(CROSS) build --release --target $* 44 $(eval EXT := $(if $(findstring windows,$*),.exe,)) 45 $(eval ARCH := $(word 1,$(subst -, ,$*))) 46 $(eval OS := $(if $(findstring linux,$*),linux,$(if $(findstring windows,$*),windows,$(if $(findstring freebsd,$*),freebsd,unknown)))) 47 @cp target/$*/release/$(BINARY)$(EXT) $(DIST)/$(OUT)-$(OS)-$(ARCH)$(EXT) 48 @echo "-> $(DIST)/$(OUT)-$(OS)-$(ARCH)$(EXT)" 49 50 docker: 51 @mkdir -p $(DIST) 52 docker build \ 53 --build-arg SOURCE_DATE_EPOCH=$(EPOCH) \ 54 -t bupdate-build \ 55 -f Dockerfile . 56 @CID=$$(docker create bupdate-build) && \ 57 docker cp $$CID:/out/. $(DIST)/ && \ 58 docker rm $$CID > /dev/null 59 @echo "-> $(DIST)/" 60 @ls -lh $(DIST)/ 61 62 checksums: 63 @cd $(DIST) && { \ 64 files=""; \ 65 for f in $(OUT)-linux-* $(OUT)-windows-* $(OUT)-freebsd-*; do \ 66 if [ -f "$$f" ]; then files="$$files $$f"; fi; \ 67 done; \ 68 if [ -z "$$files" ]; then echo "No binaries in $(DIST)/"; exit 1; fi; \ 69 sha256sum $$files > SHA256SUMS; \ 70 b2sum $$files > B2SUMS; \ 71 } 72 @echo "-> $(DIST)/SHA256SUMS" 73 @cat $(DIST)/SHA256SUMS 74 @echo "" 75 @echo "-> $(DIST)/B2SUMS" 76 @cat $(DIST)/B2SUMS 77 78 clean: 79 rm -rf $(DIST) 80 cargo clean 81 82 setup-hooks: 83 @mkdir -p .git/hooks 84 @cp hooks/pre-commit .git/hooks/pre-commit 85 @chmod +x .git/hooks/pre-commit 86 @echo "Git pre-commit hook installed." 87 88 all: docker checksums