-
Notifications
You must be signed in to change notification settings - Fork 70
/
Makefile
136 lines (119 loc) · 5.73 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
################################################################################
# Global: Variables #
################################################################################
# Formatted symbol markers (=>, [needs root]) for info output
INFOMARK = $(shell printf "\033[34;1m=>\033[0m")
ROOTMARK = $(shell printf "\033[31;1m[needs root]\033[0m")
# Optional Make arguments
CGO_ENABLED ?= 0
CLI_VERSION ?= edge
DEBUG ?= 0
NODE_VERSION ?= 20-bookworm-slim
# Go build metadata variables
BASE_PACKAGE_NAME := github.com/project-copacetic/copacetic
GIT_COMMIT := $(shell git rev-list -1 HEAD)
GIT_VERSION := $(shell git describe --always --tags --dirty)
BUILD_DATE := $(shell date -u +'%Y-%m-%dT%H:%M:%SZ')
DEFAULT_LDFLAGS := -X $(BASE_PACKAGE_NAME)/pkg/version.GitCommit=$(GIT_COMMIT) \
-X $(BASE_PACKAGE_NAME)/pkg/version.GitVersion=$(GIT_VERSION) \
-X $(BASE_PACKAGE_NAME)/pkg/version.BuildDate=$(BUILD_DATE) \
-X main.version=$(CLI_VERSION)
GOARCH := $(shell go env GOARCH)
GOOS := $(shell go env GOOS)
# Message lack of native build support in Windows
ifeq ($(GOOS),windows)
$(error Windows native build is unsupported, use WSL instead)
endif
# Build configuration variables
ifeq ($(DEBUG),0)
BUILDTYPE_DIR:=release
LDFLAGS:="$(DEFAULT_LDFLAGS) -s -w -extldflags -static"
else
BUILDTYPE_DIR:=debug
LDFLAGS:="$(DEFAULT_LDFLAGS)"
GCFLAGS:=-gcflags="all=-N -l"
$(info $(INFOMARK) Build with debug information)
endif
# Build output variables
CLI_BINARY := copa
OUT_DIR := ./dist
BINS_OUT_DIR ?= $(OUT_DIR)/$(GOOS)_$(GOARCH)/$(BUILDTYPE_DIR)
################################################################################
# Target: build (default action) #
################################################################################
.PHONY: build
build: $(CLI_BINARY)
$(CLI_BINARY):
$(info $(INFOMARK) Building $(CLI_BINARY) ...)
CGO_ENABLED=$(CGO_ENABLED) GOOS=$(GOOS) GOARCH=$(GOARCH) \
go build $(GCFLAGS) -ldflags $(LDFLAGS) -o $(BINS_OUT_DIR)/$(CLI_BINARY);
################################################################################
# Target: lint #
################################################################################
.PHONY: lint
lint:
$(info $(INFOMARK) Linting go code ...)
golangci-lint run -v ./...
################################################################################
# Target: format #
################################################################################
.PHONY: format
format:
$(info $(INFOMARK) Formatting all go files with gofumpt ...)
gofumpt -l -w .
################################################################################
# Target: archive #
################################################################################
ARCHIVE_OUT_DIR ?= $(BINS_OUT_DIR)
ARCHIVE_NAME = $(CLI_BINARY)_$(CLI_VERSION)_$(GOOS)_$(GOARCH).tar.gz
archive: $(ARCHIVE_NAME)
$(ARCHIVE_NAME):
$(info $(INFOMARK) Building release package $(ARCHIVE_NAME) ...)
chmod +x $(BINS_OUT_DIR)/$(CLI_BINARY)
tar czf "$(ARCHIVE_OUT_DIR)/$(ARCHIVE_NAME)" -C "$(BINS_OUT_DIR)" "$(CLI_BINARY)"
(cd $(ARCHIVE_OUT_DIR) && sha256sum -b "$(ARCHIVE_NAME)" > "$(ARCHIVE_NAME).sha256")
################################################################################
# Target: release #
################################################################################
.PHONY: release
release: build archive
################################################################################
# Target: release-manifest #
################################################################################
.PHONY: release-manifest
release-manifest:
@sed -i -e 's/^CLI_VERSION := .*/CLI_VERSION := ${NEWVERSION}/' ./Makefile
################################################################################
# Target: test - unit testing #
################################################################################
.PHONY: test
test:
$(info $(INFOMARK) Running unit tests on pkg libraries ...)
go test ./pkg/... $(CODECOV_OPTS)
################################################################################
# Target: clean #
################################################################################
.PHONY: clean
clean:
$(info $(INFOMARK) Cleaning $(OUT_DIR) folder ...)
rm -r $(OUT_DIR)
################################################################################
# Target: setup #
################################################################################
.PHONY: setup
setup:
$(info $(INFOMARK) Installing Makefile go binary dependencies $(ROOTMARK) ...)
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
go install mvdan.cc/gofumpt@latest
################################################################################
# Target: version-docs #
################################################################################
.PHONY: version-docs
version-docs:
$(info $(INFOMARK) Creating versioned docs ...)
docker run --rm \
-v $(shell pwd)/website:/website \
-w /website \
-u $(shell id -u):$(shell id -g) \
node:${NODE_VERSION} \
sh -c "yarn install --frozen lockfile && yarn run docusaurus docs:version ${NEWVERSION}"