BINARY := rip PKG := ./cmd/rip VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo dev) COMMIT ?= $(shell git rev-parse HEAD 2>/dev/null) DATE ?= $(shell date -u +%Y-%m-%dT%H:%M:%SZ) LDFLAGS := -X main.version=$(VERSION) -X main.commit=$(COMMIT) -X main.date=$(DATE) .DEFAULT_GOAL := build .PHONY: build build: ## Build the rip binary go build -ldflags "$(LDFLAGS)" -o $(BINARY) $(PKG) .PHONY: install install: ## Install rip into GOBIN go install -ldflags "$(LDFLAGS)" $(PKG) .PHONY: test test: ## Run the test suite go test ./... .PHONY: race race: ## Run the test suite under the race detector go test -race ./... .PHONY: cover cover: ## Run tests and report per-package coverage go test -coverprofile=coverage.out ./... go tool cover -func=coverage.out | tail -1 .PHONY: fmt fmt: ## Format all Go files gofmt -w . .PHONY: fmt-check fmt-check: ## Fail if any file is not gofmt-clean @out="$$(gofmt -l .)"; \ if [ -n "$$out" ]; then echo "not gofmt-clean:"; echo "$$out"; exit 1; fi .PHONY: vet vet: ## Run go vet go vet ./... .PHONY: lint lint: ## Run golangci-lint if it is installed @if command -v golangci-lint >/dev/null 2>&1; then \ golangci-lint run; \ else \ echo "golangci-lint not installed; skipping"; \ echo " go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest"; \ fi .PHONY: check check: fmt-check vet test ## Everything CI runs .PHONY: clean clean: ## Remove build and coverage artifacts rm -f $(BINARY) coverage.out .PHONY: help help: ## List targets @grep -hE '^[a-z-]+:.*?## ' $(MAKEFILE_LIST) | awk -F':.*?## ' '{printf " %-12s %s\n", $$1, $$2}'