.POSIX: # Standard GNU-ish install variables, so a packager can redirect everything: # make install PREFIX=/usr DESTDIR=/tmp/pkg DESTDIR ?= PREFIX ?= $(HOME)/.local BINDIR := $(DESTDIR)$(PREFIX)/bin MANDIR := $(DESTDIR)$(PREFIX)/share/man/man1 BIN := prognosis DIST := dist MODULE := github.com/lukaszkasprzak/prognosis # Version comes from git when there is a tag, "dev" otherwise, and is stamped # into the binary so -version reports something meaningful. VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo dev) GOFLAGS := -trimpath LDFLAGS := -s -w -X main.version=$(VERSION) PLATFORMS := linux/amd64 linux/arm64 android/arm64 darwin/amd64 darwin/arm64 freebsd/amd64 .PHONY: help build install uninstall test vet fmt lint ci cross release install-hooks clean help: ## show this help @grep -E '^[a-z-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | \ awk 'BEGIN {FS = ":.*?## "}; {printf " \033[1m%-14s\033[0m %s\n", $$1, $$2}' @echo @echo " version: $(VERSION) prefix: $(PREFIX)" build: ## build ./$(BIN) go build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BIN) ./cmd/prognosis install: build ## install the binary and man page mkdir -p $(BINDIR) $(MANDIR) # rm first: the target may be a symlink, and cp follows symlinks. rm -f $(BINDIR)/$(BIN) install -m 755 $(BIN) $(BINDIR)/$(BIN) install -m 644 man/prognosis.1 $(MANDIR)/prognosis.1 @echo "installed $(BINDIR)/$(BIN) and $(MANDIR)/prognosis.1" uninstall: ## remove the installed binary and man page rm -f $(BINDIR)/$(BIN) $(MANDIR)/prognosis.1 test: ## run the tests go test ./... vet: ## go vet go vet ./... fmt: ## gofmt the tree gofmt -w . lint: ## check the man page renders without warnings @out=$$(man --warnings -l man/prognosis.1 2>&1 >/dev/null); \ test -z "$$out" || { echo "man page warnings:"; echo "$$out"; exit 1; } @echo "man page ok" ci: ## the gate: gofmt, vet, tests, man page, and no third-party deps @test -z "$$(gofmt -l .)" || { echo "gofmt needed:"; gofmt -l .; exit 1; } go vet ./... go test ./... @$(MAKE) --no-print-directory lint @deps=$$(go list -deps ./... | grep -E '^[a-z0-9-]+\.[a-z]+/' | grep -v '^$(MODULE)' || true); \ test -z "$$deps" || { echo "third-party dependencies crept in:"; echo "$$deps"; exit 1; } @echo "ci ok" cross: ## cross-compile every platform into $(DIST)/ @mkdir -p $(DIST) @for p in $(PLATFORMS); do \ os=$${p%/*}; arch=$${p#*/}; \ echo " $$os/$$arch"; \ CGO_ENABLED=0 GOOS=$$os GOARCH=$$arch \ go build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(DIST)/$(BIN)-$$os-$$arch ./cmd/prognosis || exit 1; \ done @ls -la $(DIST) release: ## tag a release: make release VERSION=0.2.0 (add its CHANGELOG entry first) @test "$(VERSION)" != "dev" || { echo "give a version: make release VERSION=0.2.0"; exit 1; } @grep -q "^## $(VERSION)" CHANGELOG.md || \ { echo "CHANGELOG.md has no '## $(VERSION)' entry; write it first"; exit 1; } @test -z "$$(git status --porcelain)" || { echo "working tree is dirty"; exit 1; } @$(MAKE) --no-print-directory ci git tag -a v$(VERSION) -m "prognosis v$(VERSION)" @echo "tagged v$(VERSION); push it with: git push --tags" install-hooks: ## install the pre-push hook that runs make ci install -m 755 scripts/hooks/pre-push .git/hooks/pre-push @echo "installed .git/hooks/pre-push" clean: ## remove build artifacts rm -rf $(BIN) $(DIST)