/ 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