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' -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} .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: build @go test -v ./... # ---------------- # 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: @for target in $(TARGETS); do \ $(MAKE) dist-target GOOS=`echo $$target | cut -d / -f 1` GOARCH=`echo $$target | cut -d / -f 2`; \ done .PHONY: dist-target dist-target: build-target @set -e; \ if [ -z "$(BINARY_VERSION)" ]; then \ echo "No version set"; \ exit 1; \ fi; \ 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)