|
| 1 | +# Makefile will understack go binary for multiple GOOS and GOARCH |
| 2 | +# |
| 3 | +# Output will be like this: |
| 4 | +# understack_darwin_amd64/ |
| 5 | +# └── understack |
| 6 | +# understack_windows_amd64/ |
| 7 | +# └── understack.exe |
| 8 | +# understack_darwin_amd64.tar.gz |
| 9 | +# understack_windows_amd64.zip |
| 10 | +# |
| 11 | +# package-all: will package folders into .tar.gz and for windows .zip |
| 12 | + |
| 13 | +BINARY_NAME=understack |
| 14 | + |
| 15 | +GOOS_LIST=linux darwin windows |
| 16 | +GOARCH_LIST=386 amd64 arm64 |
| 17 | + |
| 18 | +BUILD_DIR=build |
| 19 | + |
| 20 | +VERSION := $(shell git describe --tags --abbrev=0 2>/dev/null || echo "dev") |
| 21 | +COMMIT := $(shell git rev-parse --short HEAD) |
| 22 | +LDFLAGS := -ldflags="-s -w -X 'main.version=$(VERSION)' -X 'main.commit=$(COMMIT)'" |
| 23 | + |
| 24 | +.PHONY: all |
| 25 | +all: build build-all package-all |
| 26 | + |
| 27 | +.PHONY: build |
| 28 | +build: |
| 29 | + @echo "Building for current OS/Arch..." |
| 30 | + @mkdir -p $(BUILD_DIR)/$(BINARY_NAME) |
| 31 | + CGO_ENABLED=0 GOOS=$(shell go env GOOS) GOARCH=$(shell go env GOARCH) go build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)/$(BINARY_NAME) . |
| 32 | + |
| 33 | +.PHONY: build-all |
| 34 | +build-all: |
| 35 | + @mkdir -p $(BUILD_DIR) |
| 36 | + @for GOOS in $(GOOS_LIST); do \ |
| 37 | + for GOARCH in $(GOARCH_LIST); do \ |
| 38 | + if [ "$$GOOS" = "darwin" ] && [ "$$GOARCH" = "386" ]; then \ |
| 39 | + continue; \ |
| 40 | + fi; \ |
| 41 | + DIR=$(BUILD_DIR)/$(BINARY_NAME)_$$GOOS\_$$GOARCH; \ |
| 42 | + EXT=$$([ "$$GOOS" = "windows" ] && echo ".exe" || echo ""); \ |
| 43 | + OUTFILE=$$DIR/$(BINARY_NAME)$$EXT; \ |
| 44 | + mkdir -p $$DIR; \ |
| 45 | + echo "Building $$OUTFILE..."; \ |
| 46 | + CGO_ENABLED=0 GOOS=$$GOOS GOARCH=$$GOARCH go build $() -o $$OUTFILE . || echo "Failed to build $$GOOS/$$GOARCH"; \ |
| 47 | + done \ |
| 48 | + done |
| 49 | + |
| 50 | +# Loops over all the dirs in build/ folder |
| 51 | +# for windows build zip |
| 52 | +# else use .tar.gz |
| 53 | +.PHONY: package-all |
| 54 | +package-all: |
| 55 | + @echo "Packaging builds..." |
| 56 | + @cd $(BUILD_DIR) && for d in $(BINARY_NAME)_*; do \ |
| 57 | + if echo $$d | grep -q "windows"; then \ |
| 58 | + zip -qr "$$d.zip" "$$d"; \ |
| 59 | + else \ |
| 60 | + tar -czf "$$d.tar.gz" "$$d"; \ |
| 61 | + fi \ |
| 62 | + done |
| 63 | + |
| 64 | + |
| 65 | +# Loops over *.zip and *.tar.gz in build/ |
| 66 | +# Uses sha256sum if available (Linux) |
| 67 | +# Falls back to shasum -a 256 on macOS |
| 68 | +# Outputs clean filenames without ./ |
| 69 | +# Result is stored in build/checksums.txt |
| 70 | +.PHONY: checksums |
| 71 | +checksums: |
| 72 | + @echo "Generating checksums..." |
| 73 | + @cd $(BUILD_DIR) && \ |
| 74 | + for f in *.zip *.tar.gz; do \ |
| 75 | + if command -v sha256sum >/dev/null 2>&1; then \ |
| 76 | + sha256sum "$$f"; \ |
| 77 | + else \ |
| 78 | + shasum -a 256 "$$f"; \ |
| 79 | + fi; \ |
| 80 | + done | sort > checksums.txt |
| 81 | + |
| 82 | +# remove build dir |
| 83 | +.PHONY: clean |
| 84 | +clean: |
| 85 | + rm -rf $(BUILD_DIR) |
0 commit comments