-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
216 lines (180 loc) · 6.48 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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
SHELL = /usr/bin/env bash
.SHELLFLAGS = -ecuo pipefail
MAKEFLAGS += --warn-undefined-variables
MAKEFLAGS += --no-builtin-rules
MAKEFLAGS += --no-builtin-variables
.DEFAULT_GOAL := help
# ==============================================================================
# Environment Variables
# ==============================================================================
CI ?=
GITHUB_WORKSPACE ?=
# ==============================================================================
# Workspace and Directory Paths
# ==============================================================================
WORKSPACE = $(or $(GITHUB_WORKSPACE),$(shell git rev-parse --show-toplevel))
export WORKSPACE
TMP_DIR = $(WORKSPACE)/tmp
CMD_DIR = $(WORKSPACE)/cmd
# Web
WWW_DIRNAME = www
WWW_DIR = $(WORKSPACE)/$(WWW_DIRNAME)
WWW_SRC_DIR = $(WWW_DIR)/src
YARN_WORKSPACE_CMD = yarn workspace $(WWW_DIRNAME)
# WebAssembly
GO_WASM_EXEC_JS = $(shell go env GOROOT)/lib/wasm/wasm_exec.js
WWW_WASM_BIN = $(WWW_SRC_DIR)/workers/playground.wasm
WWW_WASM_EXEC_JS = $(WWW_SRC_DIR)/lib/go/wasm_exec.js
# ==============================================================================
# Build Configuration
# ==============================================================================
GOOS = js
GOARCH = wasm
GOFLAGS ?=
export GOOS GOARCH GOFLAGS
# Flags
LDFLAGS = -ldflags "-s -w"
BUILDFLAGS = -v -trimpath
# ==============================================================================
# Coverage Configuration
# ==============================================================================
COVERPROFILE ?= coverage.out
COVERAGE_DIR ?= $(TMP_DIR)/coverage
COVERAGE_HTML = $(COVERAGE_DIR)/coverage.html
# ==============================================================================
# Vite Configuration
# ==============================================================================
VITE_APP_VERSION ?= $(shell git describe --tags --abbrev=0 --dirty 2>/dev/null || echo "v0.0.0-$(shell git rev-list --count HEAD)")
VITE_APP_DATE = $(shell date -u '+%Y-%m-%d_%H:%M:%S')
VITE_APP_COMMIT = $(shell git rev-parse HEAD)
VITE_APP_BASE_URL ?= $(if $(CI),/go-template-playground/,/)
ROLLUP_VISUALIZER_PATH = $(TMP_DIR)/rollup-visualizer.html
export VITE_APP_VERSION VITE_APP_DATE VITE_APP_COMMIT VITE_APP_BASE_URL ROLLUP_VISUALIZER_PATH
# ==============================================================================
# Functions
# ==============================================================================
define open_browser
@case $$(uname -s) in \
Linux) xdg-open $(1) ;; \
Darwin) open $(1) ;; \
*) echo "Unsupported platform" ;; \
esac
endef
# ==============================================================================
# Targets
# ==============================================================================
## Dependencies:
.PHONY: install/wasm
install/wasm: ## Install Go dependencies
go mod download -x
go mod verify
.PHONY: install/tools
install/tools: export GOOS =
install/tools: export GOARCH =
install/tools: ## Install Go tools
go install tool
.PHONY: install/www
install/www: ## Install GUI dependencies
yarn install
.PHONY: install
install: install/wasm install/www ## Install dependencies
.PHONY: update/wasm
update/wasm: ## Update Go dependencies
go get -u -v ./...
go mod tidy
go mod verify
.PHONY: update/www
update/www: ## Update GUI dependencies
yarn upgrade
.PHONY: update
update: update/wasm update/www ## Update dependencies
## Generators:
.PHONY: generate/wasm
generate/wasm: export GOOS =
generate/wasm: export GOARCH =
generate/wasm: ## Generate code from Go directives
go generate ./...
.PHONY: generate/www
generate/www: ## Generate code from GUI directives
$(YARN_WORKSPACE_CMD) generate
.PHONY: generate
generate: generate/wasm generate/www ## Generate code
## Code Quality:
.PHONY: lint/wasm
lint/wasm: ## Run Go linter
golangci-lint run --verbose --timeout=5m
.PHONY: lint/www
lint/www: ## Run GUI linter
$(YARN_WORKSPACE_CMD) lint
.PHONY: fmt/wasm
fmt/wasm: ## Format Go code
golangci-lint run --fix --verbose --timeout=5m
.PHONY: fmt/www
fmt/www: ## Format GUI code
$(YARN_WORKSPACE_CMD) format
## Testing:
.PHONY: test/wasm
test/wasm: PATH := $(PATH):$(shell dirname $(GO_WASM_EXEC_JS))
test/wasm: ## Run tests for Go code
@mkdir -pv $(COVERAGE_DIR)
go test -v --coverpkg=./... -cover -outputdir=$(COVERAGE_DIR) -coverprofile=$(COVERPROFILE) -run= ./...
@echo
du -h $(COVERAGE_DIR)/$(COVERPROFILE)
@echo "📊 Coverage report: $(COVERAGE_HTML)"
ifeq ($(CI),)
go tool cover -html=$(COVERAGE_DIR)/$(COVERPROFILE) -o $(COVERAGE_HTML)
@echo "🌐 Run 'make browser/cover' to open coverage report in browser"
endif
.PHONY: bench/wasm
bench/wasm: PATH := $(PATH):$(shell dirname $(GO_WASM_EXEC_JS))
bench/wasm: ## Run benchmarks for Go code
go test -v -bench=. -benchmem -benchtime=3s ./... | tee -a $(TMP_DIR)/bench.txt
.PHONY: test/www
test/www: ## Run tests for GUI code
$(YARN_WORKSPACE_CMD) test
.PHONY: browser/cover
browser/cover: ## Open browser with Go coverage report
$(call open_browser,$(COVERAGE_HTML))
## Build:
.PHONY: build/wasm
build/wasm: ## Build WebAssembly code
@mkdir -pv $(dir $(WWW_WASM_BIN)) $(dir $(WWW_WASM_EXEC_JS))
CGO_ENABLED=0 go build $(LDFLAGS) $(BUILDFLAGS) -o $(WWW_WASM_BIN) $(CMD_DIR)/playground
@cp -f $(GO_WASM_EXEC_JS) $(WWW_WASM_EXEC_JS)
@echo "📦 WebAssembly build output:"
@du -h $(WWW_WASM_BIN) $(WWW_WASM_EXEC_JS) | sort -h
.PHONY: build/www
build/www: ## Build GUI code
$(YARN_WORKSPACE_CMD) build
.PHONY: build
build: build/wasm build/www ## Build project
.PHONY: browser/rollup
browser/rollup: ## Open browser with Rollup visualizer
$(call open_browser,$(ROLLUP_VISUALIZER_PATH))
.PHONY: dev
dev: build/wasm ## Run local development server
$(YARN_WORKSPACE_CMD) dev
.PHONY: serve
serve: ## Run local production server
$(YARN_WORKSPACE_CMD) serve
.PHONY: clean
clean: ## Clean project
-rm -rfv $(TMP_DIR) $(WWW_DIR)/dist $(WWW_DIR)/dev-dist $(WWW_WASM_BIN) $(WWW_WASM_EXEC_JS)
go clean -cache -testcache -modcache
yarn cache clean
## Help:
.PHONY: help
help: GREEN := $(shell tput -Txterm setaf 2)
help: YELLOW := $(shell tput -Txterm setaf 3)
help: CYAN := $(shell tput -Txterm setaf 6)
help: RESET := $(shell tput -Txterm sgr0)
help: ## Show this help
@echo ''
@echo 'Usage:'
@echo ' ${YELLOW}make${RESET} ${GREEN}<target>${RESET}'
@echo ''
@echo 'Targets:'
@awk 'BEGIN {FS = ":.*?## "} { \
if (/^[a-zA-Z0-9_\/-]+:.*?##.*$$/) {printf " ${YELLOW}%-20s${GREEN}%s${RESET}\n", $$1, $$2} \
else if (/^## .*$$/) {printf " ${CYAN}%s${RESET}\n", substr($$1,4)} \
}' $(MAKEFILE_LIST)