BINNAME = gomonop BINDIR = $(CURDIR)/bin DISTDIR = $(CURDIR)/dist TARGETS = linux/amd64 linux/386 linux/arm linux/arm64 STATICFILES = README.md LICENSE SRC := $(shell find . -type f -name '*.go' -not -path './dist/*' -print) go.mod go.sum GOHOSTOS = $(shell go env GOHOSTOS) GOHOSTARCH ?= $(shell go env GOHOSTARCH) GIT_TAG = $(shell git describe --tags --abbrev=0 --exact-match 2>/dev/null) GIT_COMMIT ?= $(shell git rev-parse --short HEAD 2>/dev/null) GIT_STATUS ?= $(shell test -n "`git status --porcelain`" && echo "dirty" || echo "clean") ifneq ($(VERSION),) BINARY_VERSION = $(VERSION) endif BINARY_VERSION ?= $(GIT_TAG) LDFLAGS += -w -s ifneq ($(BINARY_VERSION),) LDFLAGS += -X nocternity.net/gomonop/pkg/version.version=${BINARY_VERSION} endif LDFLAGS += -X nocternity.net/gomonop/pkg/version.commit=${GIT_COMMIT} LDFLAGS += -X nocternity.net/gomonop/pkg/version.status=${GIT_STATUS} # Use bash as the shell, mostly for -o pipefail SHELL = /usr/bin/env bash .PHONY: all all: build # --------------- # Basic building .PHONY: build build: GOOS=$(GOHOSTOS) build: GOARCH=$(GOHOSTARCH) build: build-target symlink .PHONY: symlink symlink: @ln -sf $(BINDIR)/$(GOOS)-$(GOARCH)/$(BINNAME) $(BINDIR)/$(BINNAME) .PHONY: build-target build-target: LDFLAGS += -X nocternity.net/gomonop/pkg/version.target=${GOOS}/${GOARCH} build-target: $(BINDIR)/$(GOOS)-$(GOARCH)/$(BINNAME) $(BINDIR)/$(GOOS)-$(GOARCH)/$(BINNAME): $(SRC) @mkdir -p $(BINDIR)/$(GOOS)-$(GOARCH) @CGO_ENABLED=0 go build -ldflags "$(LDFLAGS)" -o $(BINDIR)/$(GOOS)-$(GOARCH)/$(BINNAME) . .PHONY: test test: @go test -v ./... .PHONY: lint lint: @go run -modfile=tools/go.mod github.com/golangci/golangci-lint/cmd/golangci-lint run # ---------------- # Cross compiling .PHONY: build-cross build-cross: @for target in $(TARGETS); do \ $(MAKE) build-target GOOS=`echo $$target | cut -d / -f 1` GOARCH=`echo $$target | cut -d / -f 2`; \ done # ---------- # Packaging .PHONY: dist dist: GOOS=$(GOHOSTOS) dist: GOARCH=$(GOHOSTARCH) dist: dist-target .PHONY: dist-all dist-all: dist-source @set -eu -o pipefail; \ for target in $(TARGETS); do \ $(MAKE) dist-target GOOS=`echo $$target | cut -d / -f 1` GOARCH=`echo $$target | cut -d / -f 2`; \ done; \ mkdir -p $(DISTDIR)/release; \ mv $(DISTDIR)/$(BINNAME)-$(BINARY_VERSION)*.tar.xz $(DISTDIR)/release .PHONY: dist-source dist-source: @set -eu -o pipefail; \ if [ -z "$(BINARY_VERSION)" ]; then \ echo "No version set"; \ exit 1; \ fi; \ rm -rf $(DISTDIR)/$(BINNAME)-$(BINARY_VERSION); \ mkdir -p $(DISTDIR)/$(BINNAME)-$(BINARY_VERSION); \ for f in $(SRC) $(STATICFILES); do \ install -m 644 -D $$f $(DISTDIR)/$(BINNAME)-$(BINARY_VERSION)/$$f; \ done; \ ( \ echo "VERSION = ${BINARY_VERSION}"; \ echo "GIT_COMMIT = ${GIT_COMMIT}"; \ echo "GIT_STATUS = ${GIT_STATUS}"; \ cat Makefile; \ ) > $(DISTDIR)/$(BINNAME)-$(BINARY_VERSION)/Makefile; \ cd $(DISTDIR); \ tar cJf $(BINNAME)-$(BINARY_VERSION).tar.xz $(BINNAME)-$(BINARY_VERSION) .PHONY: dist-target dist-target: build-target @set -eu -o pipefail; \ if [ -z "$(BINARY_VERSION)" ]; then \ echo "No version set"; \ exit 1; \ fi; \ rm -rf $(DISTDIR)/$(BINNAME)-$(BINARY_VERSION)-$(GOOS)-$(GOARCH); \ mkdir -p $(DISTDIR)/$(BINNAME)-$(BINARY_VERSION)-$(GOOS)-$(GOARCH); \ cp $(BINDIR)/$(GOOS)-$(GOARCH)/$(BINNAME) $(DISTDIR)/$(BINNAME)-$(BINARY_VERSION)-$(GOOS)-$(GOARCH); \ for f in $(STATICFILES); do \ cp $$f $(DISTDIR)/$(BINNAME)-$(BINARY_VERSION)-$(GOOS)-$(GOARCH); \ done; \ cd $(DISTDIR); \ tar cJf $(BINNAME)-$(BINARY_VERSION)-$(GOOS)-$(GOARCH).tar.xz $(BINNAME)-$(BINARY_VERSION)-$(GOOS)-$(GOARCH) # -------- # Cleanup .PHONY: clean clean: @rm -rf $(BINDIR) $(DISTDIR)