|
1 | 1 | # https://www.xiexianbin.cn/program/tools/2016-01-09-makefile/index.html |
2 | | -.PHONY: all test clean build build-linux build-mac build-windows |
3 | | - |
4 | | -GOCMD=go |
5 | | -GOBUILD=$(GOCMD) build |
6 | | -GOCLEAN=$(GOCMD) clean |
7 | | -GOTEST=$(GOCMD) test |
8 | | -BINARY_NAME=xca |
9 | | -BINARY_LINUX=$(BINARY_NAME)-linux |
10 | | -BINARY_MAC=$(BINARY_NAME)-darwin |
11 | | -BINARY_WIN=$(BINARY_NAME)-windows |
12 | | - |
13 | | -help: ## Show this help. |
14 | | - @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {sub("\\\\n",sprintf("\n%22c"," "), $$2);printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) |
15 | | - |
16 | | -all: clean test build build-linux build-mac build-windows ## Build all |
17 | | -test: ## run test |
| 2 | +export SHELL:=bash |
| 3 | +export SHELLOPTS:=$(if $(SHELLOPTS),$(SHELLOPTS):)pipefail:errexit |
| 4 | + |
| 5 | +# https://stackoverflow.com/questions/4122831/disable-make-builtin-rules-and-variables-from-inside-the-make-file |
| 6 | +MAKEFLAGS += --no-builtin-rules |
| 7 | +.SUFFIXES: |
| 8 | + |
| 9 | +VERSION := latest |
| 10 | +BUILD_DATE := $(shell TZ=UTC-8 date +'%Y-%m-%dT%H:%M:%SZ+08:00') |
| 11 | +GIT_COMMIT := $(shell git rev-parse HEAD || echo unknown) |
| 12 | +GIT_BRANCH := $(shell git rev-parse --symbolic-full-name --verify --quiet --abbrev-ref HEAD) |
| 13 | +GIT_TAG := $(shell git describe --exact-match --tags --abbrev=0 2> /dev/null || echo untagged) |
| 14 | +GIT_TREE_STATE := $(shell if [ -z "`git status --porcelain`" ]; then echo "clean" ; else echo "dirty"; fi) |
| 15 | +RELEASE_TAG := $(shell if [[ "$(GIT_TAG)" =~ ^v[0-9]+\.[0-9]+\.[0-9]+.*$$ ]]; then echo "true"; else echo "false"; fi) |
| 16 | +DEV_BRANCH := $(shell [ "$(GIT_BRANCH)" = master ] || [ `echo $(GIT_BRANCH) | cut -c -8` = release- ] || [ `echo $(GIT_BRANCH) | cut -c -4` = dev- ] || [ $(RELEASE_TAG) = true ] && echo false || echo true) |
| 17 | + |
| 18 | +GOCMD ?= go |
| 19 | +GOBUILD ?= $(GOCMD) build -v |
| 20 | +GOCLEAN ?= $(GOCMD) clean |
| 21 | +GOTEST ?= $(GOCMD) test -v -p 20 |
| 22 | + |
| 23 | +linux-amd64: GOARGS = GOOS=linux GOARCH=amd64 |
| 24 | +linux-arm64: GOARGS = GOOS=linux GOARCH=arm64 |
| 25 | +linux-ppc64le: GOARGS = GOOS=linux GOARCH=ppc64le |
| 26 | +linux-s390x: GOARGS = GOOS=linux GOARCH=s390x |
| 27 | +darwin-amd64: GOARGS = GOOS=darwin GOARCH=amd64 |
| 28 | +darwin-arm64: GOARGS = GOOS=darwin GOARCH=arm64 |
| 29 | +windows-amd64: GOARGS = GOOS=windows GOARCH=amd64 |
| 30 | + |
| 31 | +BINARY_NAME ?= xca |
| 32 | +IMG ?= xiexianbin/go-actions-demo:latest |
| 33 | + |
| 34 | +ifeq ($(RELEASE_TAG),true) |
| 35 | +VERSION := $(GIT_TAG) |
| 36 | +endif |
| 37 | + |
| 38 | +# $(info GIT_COMMIT=$(GIT_COMMIT) GIT_BRANCH=$(GIT_BRANCH) GIT_TAG=$(GIT_TAG) GIT_TREE_STATE=$(GIT_TREE_STATE) RELEASE_TAG=$(RELEASE_TAG) DEV_BRANCH=$(DEV_BRANCH) VERSION=$(VERSION)) |
| 39 | +# $(info MAKEFILE_LIST=${MAKEFILE_LIST}) |
| 40 | + |
| 41 | +# -X github.com/xiexianbin/go-actions-demo.version=$(VERSION) |
| 42 | +override LDFLAGS += \ |
| 43 | + -X main.version=$(VERSION) \ |
| 44 | + -X main.buildDate=$(BUILD_DATE) \ |
| 45 | + -X main.gitCommit=$(GIT_COMMIT) \ |
| 46 | + -X main.gitTreeState=$(GIT_TREE_STATE) |
| 47 | + |
| 48 | +ifneq ($(GIT_TAG),) |
| 49 | +override LDFLAGS += -X main.gitTag=${GIT_TAG} |
| 50 | +endif |
| 51 | + |
| 52 | +SUB_BUILD_CMD ?= $(GOBUILD) -gcflags '${GCFLAGS}' -ldflags '${LDFLAGS} -extldflags -static' |
| 53 | + |
| 54 | +.PHONY: help |
| 55 | +help: ## Show this help |
| 56 | + @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z0-9_-]+:.*?## / {sub("\\\\n",sprintf("\n%22c"," "), $$2);printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) |
| 57 | + |
| 58 | +.PHONY: all |
| 59 | +all: clean test build linux-amd64 linux-arm64 linux-ppc64le linux-s390x darwin-amd64 darwin-arm64 windows-amd64 ## Build all |
| 60 | + |
| 61 | +.PHONY: test |
| 62 | +test: ## Run test |
18 | 63 | $(GOTEST) -v ./... |
19 | | -clean: ## run clean bin files |
| 64 | + |
| 65 | +.PHONY: clean |
| 66 | +clean: ## Run clean bin files |
20 | 67 | $(GOCLEAN) |
21 | | - rm -f bin/$(BINARY_NAME) |
22 | | -build: ## build for current os |
23 | | - $(GOBUILD) -o bin/$(BINARY_NAME) -v |
24 | | - |
25 | | -build-linux: ## build linux amd64 |
26 | | - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GOBUILD) -o bin/$(BINARY_LINUX) -v |
27 | | -build-mac: ## build mac amd64 |
28 | | - CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 $(GOBUILD) -o bin/$(BINARY_MAC) -v |
29 | | -build-windows: ## build windows amd64 |
30 | | - CGO_ENABLED=0 GOOS=windows GOARCH=amd64 $(GOBUILD) -o bin/$(BINARY_WIN) -v |
| 68 | + rm -f bin/* |
| 69 | + |
| 70 | +.PHONY: build |
| 71 | +build: ## Build for current os |
| 72 | + ${SUB_BUILD_CMD} -o bin/$(BINARY_NAME) |
| 73 | + |
| 74 | +.PHONY: linux-amd64 |
| 75 | +linux-amd64: ## Build linux amd64 |
| 76 | + CGO_ENABLED=0 ${GOARGS} ${SUB_BUILD_CMD} -o bin/${BINARY_NAME}-$@ |
| 77 | + |
| 78 | +.PHONY: linux-arm64 |
| 79 | +linux-arm64: ## Build linux arm64 |
| 80 | + CGO_ENABLED=0 ${GOARGS} ${SUB_BUILD_CMD} -o bin/${BINARY_NAME}-$@ |
| 81 | + |
| 82 | +.PHONY: linux-ppc64le |
| 83 | +linux-ppc64le: ## Build linux ppc64le |
| 84 | + CGO_ENABLED=0 ${GOARGS} ${SUB_BUILD_CMD} -o bin/${BINARY_NAME}-$@ |
| 85 | + |
| 86 | +.PHONY: linux-s390x |
| 87 | +linux-s390x: ## Build linux s390x |
| 88 | + CGO_ENABLED=0 ${GOARGS} ${SUB_BUILD_CMD} -o bin/${BINARY_NAME}-$@ |
| 89 | + |
| 90 | +.PHONY: darwin-amd64 |
| 91 | +darwin-amd64: ## Build darwin amd64 |
| 92 | + CGO_ENABLED=0 ${GOARGS} ${SUB_BUILD_CMD} -o bin/${BINARY_NAME}-$@ |
| 93 | + |
| 94 | +.PHONY: darwin-arm64 |
| 95 | +darwin-arm64: ## Build darwin arm64 |
| 96 | + CGO_ENABLED=0 ${GOARGS} ${SUB_BUILD_CMD} -o bin/${BINARY_NAME}-$@ |
| 97 | + |
| 98 | +.PHONY: windows-amd64 |
| 99 | +windows-amd64: ## Build windows amd64 |
| 100 | + CGO_ENABLED=0 ${GOARGS} ${SUB_BUILD_CMD} -o bin/${BINARY_NAME}-$@.exe |
| 101 | + |
| 102 | +.PHONY: docker-build |
| 103 | +docker-build: test ## Build docker image |
| 104 | + docker build -t ${IMG} . |
| 105 | + |
| 106 | +.PHONY: docker-push |
| 107 | +docker-push: ## Push docker image |
| 108 | + docker push ${IMG} |
0 commit comments