golang.mk 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #===================================================
  2. # Makefile helper functions for golang
  3. #
  4. GO :=go
  5. GO_SUPPORTED_VERSIONS ?= 1.13|1.14|1.15|1.16|1.17|1.18|1.19|1.20|1.21|1.22
  6. GO_LDFLAGS += -X $(VERSION_PACKAGE).GitVersion=$(VERSION) \
  7. -X $(VERSION_PACKAGE).GitCommit=$(GIT_COMMIT) \
  8. -X $(VERSION_PACKAGE).GitTreeState=$(GIT_TREE_STATE) \
  9. -X $(VERSION_PACKAGE).BuildDate=$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')
  10. ifneq ($(DLV),)
  11. GO_BUILD_FLAGS += -gcflags "all=-N -l"
  12. LDFLAGS = ""
  13. endif
  14. GO_BUILD_FLAGS += -tags=jsoniter -ldflags "$(GO_LDFLAGS)"
  15. ifeq ($(GOOS),windows)
  16. GO_OUT_EXT := .exe
  17. endif
  18. ifeq ($(ROOT_PACKAGE),)
  19. $(error the variable ROOT_PACKAGE must be set prior to including golang.mk)
  20. endif
  21. GOPATH := $(shell go env GOPATH)
  22. ifeq ($(origin GOBIN), undefined)
  23. GOBIN := $(GOPATH)/bin
  24. endif
  25. COMMANDS ?= $(filter-out %docs, $(wildcard ${ROOT_DIR}/cmd/*))
  26. BINS ?= $(foreach cmd,${COMMANDS},$(notdir ${cmd}))
  27. ifeq (${COMMANDS},)
  28. $(error Could not determine COMMANDS, set ROOT_DIR or run in source dir)
  29. endif
  30. ifeq (${BINS},)
  31. $(error Could not determine BINS, set ROOT_DIR or run in source dir)
  32. endif
  33. # 指定测试用例目录
  34. EXCLUDE_TESTS= admin-layout/test
  35. # 判断go版本
  36. .PHONY: go.build.verify
  37. go.build.verify:
  38. ifneq ($(shell $(GO) version | grep -q -E '\bgo($(GO_SUPPORTED_VERSIONS))\b' && echo 0 || echo 1), 0)
  39. $(error unsupported go version. Please make install one of the following supported version: '$(GO_SUPPORTED_VERSIONS)')
  40. endif
  41. # 编译函数
  42. .PHONY: go.build.%
  43. go.build.%:
  44. $(eval COMMAND := $(word 2,$(subst ., ,$*)))
  45. $(eval PLATFORM := $(word 1,$(subst ., ,$*)))
  46. $(eval OS := $(word 1,$(subst _, ,$(PLATFORM))))
  47. $(eval ARCH := $(word 2,$(subst _, ,$(PLATFORM))))
  48. @echo "===========> Building binary $(COMMAND) $(VERSION) for $(OS) $(ARCH)"
  49. @mkdir -p $(OUTPUT_DIR)/platforms/$(OS)/$(ARCH)
  50. @CGO_ENABLED=0 GOOS=$(OS) GOARCH=$(ARCH) $(GO) build $(GO_BUILD_FLAGS) -o $(OUTPUT_DIR)/platforms/$(OS)/$(ARCH)/$(COMMAND)$(GO_OUT_EXT) $(ROOT_PACKAGE)/cmd/$(COMMAND)
  51. # 根据当前平台编译
  52. .PHONY: go.build
  53. go.build: go.build.verify $(addprefix go.build., $(addprefix $(PLATFORM)., $(BINS)))
  54. # 多平台编译
  55. .PHONY: go.build.multiarch
  56. go.build.multiarch: go.build.verify $(foreach p,$(PLATFORMS),$(addprefix go.build.,$(addprefix $(p).,$(BINS))))
  57. # 代码检查
  58. .PHONY: go.lint
  59. go.lint: tools.verify.golangci-lint
  60. @echo "===========> Run golangci to lint source codes"
  61. @golangci-lint run -c $(ROOT_DIR)/.golangci.yaml $(ROOT_DIR)/...
  62. # 测试用例执行和报告
  63. # 测试覆盖率检查