Makefile 7.2 KB
Newer Older
martianzhang's avatar
martianzhang 已提交
1 2 3 4 5 6
# This how we want to name the binary output
#
# use checkmake linter https://github.com/mrtazz/checkmake
# $ checkmake Makefile
#
BINARY=soar
martianzhang's avatar
martianzhang 已提交
7 8 9 10 11
GOPATH ?= $(shell go env GOPATH)
# Ensure GOPATH is set before running build process.
ifeq "$(GOPATH)" ""
  $(error Please set the environment variable GOPATH before running `make`)
endif
martianzhang's avatar
martianzhang 已提交
12
PATH := ${GOPATH}/bin:$(PATH)
martianzhang's avatar
martianzhang 已提交
13 14 15
GCFLAGS=-gcflags "all=-trimpath=${GOPATH}"
LDFLAGS=-ldflags="-s -w"

martianzhang's avatar
martianzhang 已提交
16 17 18 19
# These are the values we want to pass for VERSION  and BUILD
BUILD_TIME=`date +%Y%m%d%H%M`
COMMIT_VERSION=`git rev-parse HEAD`

20 21 22
# Add mysql version for testing `MYSQL_RELEASE=percona MYSQL_VERSION=5.7 make docker`
# MYSQL_RELEASE: mysql, percona, mariadb ...
# MYSQL_VERSION: latest, 8.0, 5.7, 5.6, 5.5 ...
martianzhang's avatar
martianzhang 已提交
23
# use mysql:latest as default
24
MYSQL_RELEASE := $(or ${MYSQL_RELEASE}, ${MYSQL_RELEASE}, mysql)
martianzhang's avatar
martianzhang 已提交
25 26 27 28 29
MYSQL_VERSION := $(or ${MYSQL_VERSION}, ${MYSQL_VERSION}, latest)

.PHONY: all
all: | fmt build

martianzhang's avatar
martianzhang 已提交
30 31 32 33 34 35 36 37 38 39 40 41
.PHONY: go_version_check
GO_VERSION_MIN=1.10
# Parse out the x.y or x.y.z version and output a single value x*10000+y*100+z (e.g., 1.9 is 10900)
# that allows the three components to be checked in a single comparison.
VER_TO_INT:=awk '{split(substr($$0, match ($$0, /[0-9\.]+/)), a, "."); print a[1]*10000+a[2]*100+a[3]}'
go_version_check:
	@echo "\033[92mGo version check\033[0m"
	@if test $(shell go version | $(VER_TO_INT) ) -lt \
  	$(shell echo "$(GO_VERSION_MIN)" | $(VER_TO_INT)); \
  	then printf "go version $(GO_VERSION_MIN)+ required, found: "; go version; exit 1; \
		else echo "go version check pass";	fi

martianzhang's avatar
martianzhang 已提交
42 43 44 45 46 47
# Dependency check
.PHONY: deps
deps:
	@echo "\033[92mDependency check\033[0m"
	@bash ./deps.sh
	# The retool tools.json is setup from retool-install.sh
martianzhang's avatar
martianzhang 已提交
48
	# some packages download need more open internet access
martianzhang's avatar
martianzhang 已提交
49
	retool sync
martianzhang's avatar
martianzhang 已提交
50
	#retool do gometalinter.v2 --install
martianzhang's avatar
martianzhang 已提交
51 52 53

# Code format
.PHONY: fmt
martianzhang's avatar
martianzhang 已提交
54
fmt: go_version_check
martianzhang's avatar
martianzhang 已提交
55 56 57 58 59 60 61 62 63 64 65 66 67
	@echo "\033[92mRun gofmt on all source files ...\033[0m"
	@echo "gofmt -l -s -w ..."
	@ret=0 && for d in $$(go list -f '{{.Dir}}' ./... | grep -v /vendor/); do \
		gofmt -l -s -w $$d/*.go || ret=$$? ; \
	done ; exit $$ret

# Run golang test cases
.PHONY: test
test:
	@echo "\033[92mRun all test cases ...\033[0m"
	go test ./...
	@echo "test Success!"

martianzhang's avatar
martianzhang 已提交
68 69 70 71 72 73
# Rule golang test cases with `-update` flag
test-update:
	@echo "\033[92mRun all test cases with -update flag ...\033[0m"
	go test ./... -update
	@echo "test-update Success!"

martianzhang's avatar
martianzhang 已提交
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
# Code Coverage
# colorful coverage numerical >=90% GREEN, <80% RED, Other YELLOW
.PHONY: cover
cover: test
	@echo "\033[92mRun test cover check ...\033[0m"
	go test -coverpkg=./... -coverprofile=coverage.data ./... | column -t
	go tool cover -html=coverage.data -o coverage.html
	go tool cover -func=coverage.data -o coverage.txt
	@tail -n 1 coverage.txt | awk '{sub(/%/, "", $$NF); \
		if($$NF < 80) \
			{print "\033[91m"$$0"%\033[0m"} \
		else if ($$NF >= 90) \
			{print "\033[92m"$$0"%\033[0m"} \
		else \
			{print "\033[93m"$$0"%\033[0m"}}'

# Builds the project
martianzhang's avatar
martianzhang 已提交
91
build: fmt
martianzhang's avatar
martianzhang 已提交
92
	@echo "\033[92mBuilding ...\033[0m"
martianzhang's avatar
martianzhang 已提交
93
	@mkdir -p bin
martianzhang's avatar
martianzhang 已提交
94
	@bash ./genver.sh
martianzhang's avatar
martianzhang 已提交
95
	@ret=0 && for d in $$(go list -f '{{if (eq .Name "main")}}{{.ImportPath}}{{end}}' ./...); do \
martianzhang's avatar
martianzhang 已提交
96
		b=$$(basename $${d}) ; \
martianzhang's avatar
martianzhang 已提交
97
		go build ${GCFLAGS} -o bin/$${b} $$d || ret=$$? ; \
martianzhang's avatar
martianzhang 已提交
98 99 100 101 102 103 104 105 106 107 108
	done ; exit $$ret
	@echo "build Success!"

# Installs our project: copies binaries
install: build
	@echo "\033[92mInstall ...\033[0m"
	go install ./...
	@echo "install Success!"

# Generate doc use -list* command
.PHONY: doc
martianzhang's avatar
martianzhang 已提交
109
doc: build
martianzhang's avatar
martianzhang 已提交
110
	@echo "\033[92mAuto generate doc ...\033[0m"
martianzhang's avatar
martianzhang 已提交
111 112 113
	./bin/soar -list-heuristic-rules > doc/heuristic.md
	./bin/soar -list-rewrite-rules > doc/rewrite.md
	./bin/soar -list-report-types > doc/report_type.md
martianzhang's avatar
martianzhang 已提交
114 115 116

# Add or change a heuristic rule
.PHONY: heuristic
martianzhang's avatar
martianzhang 已提交
117
heuristic: doc
martianzhang's avatar
martianzhang 已提交
118 119 120 121 122 123 124 125 126 127 128 129 130 131
	@echo "\033[92mUpdate Heuristic rule golden files ...\033[0m"
	go test github.com/XiaoMi/soar/advisor -v -update -run TestListHeuristicRules
	go test github.com/XiaoMi/soar/advisor -v -update -run TestMergeConflictHeuristicRules

# Update vitess vendor
.PHONY: vitess
vitess:
	@echo "\033[92mUpdate vitess deps ...\033[0m"
	govendor fetch -v vitess.io/vitess/...

# Update tidb vendor
.PHONY: tidb
tidb:
	@echo "\033[92mUpdate tidb deps ...\033[0m"
martianzhang's avatar
martianzhang 已提交
132 133 134 135 136 137 138
	govendor fetch -v github.com/pingcap/tidb/...

# make pingcap parser
.PHONY: pingcap-parser
pingcap-parser: tidb
	@echo "\033[92mUpdate pingcap parser deps ...\033[0m"
	govendor fetch -v github.com/pingcap/parser/...
martianzhang's avatar
martianzhang 已提交
139 140 141

# Update all vendor
.PHONY: vendor
martianzhang's avatar
martianzhang 已提交
142
vendor: vitess pingcap-parser
martianzhang's avatar
martianzhang 已提交
143 144 145 146
# gometalinter
# 如果有不想改的lint问题可以使用metalinter.sh加黑名单
#@bash doc/example/metalinter.sh
.PHONY: lint
martianzhang's avatar
martianzhang 已提交
147
lint: build
martianzhang's avatar
martianzhang 已提交
148 149 150 151 152 153 154
	@echo "\033[92mRun linter check ...\033[0m"
	CGO_ENABLED=0 retool do gometalinter.v2 -j 1 --config doc/example/metalinter.json ./...
	retool do revive -formatter friendly --exclude vendor/... -config doc/example/revive.toml ./...
	retool do golangci-lint --tests=false run
	@echo "gometalinter check your code is pretty good"

.PHONY: release
martianzhang's avatar
martianzhang 已提交
155
release: build
martianzhang's avatar
martianzhang 已提交
156
	@echo "\033[92mCross platform building for release ...\033[0m"
martianzhang's avatar
martianzhang 已提交
157
	@mkdir -p release
martianzhang's avatar
martianzhang 已提交
158
	@for GOOS in darwin linux windows; do \
159
		for GOARCH in amd64; do \
martianzhang's avatar
martianzhang 已提交
160 161 162
			for d in $$(go list -f '{{if (eq .Name "main")}}{{.ImportPath}}{{end}}' ./...); do \
				b=$$(basename $${d}) ; \
				echo "Building $${b}.$${GOOS}-$${GOARCH} ..."; \
martianzhang's avatar
martianzhang 已提交
163
				GOOS=$${GOOS} GOARCH=$${GOARCH} go build ${GCFLAGS} ${LDFLAGS} -v -o release/$${b}.$${GOOS}-$${GOARCH} $$d 2>/dev/null ; \
martianzhang's avatar
martianzhang 已提交
164 165 166 167 168 169 170 171
			done ; \
		done ;\
	done

.PHONY: docker
docker:
	@echo "\033[92mBuild mysql test enviorment\033[0m"
	@docker stop soar-mysql 2>/dev/null || true
martianzhang's avatar
martianzhang 已提交
172
	@docker wait soar-mysql 2>/dev/null || true
173
	@echo "docker run --name soar-mysql $(MYSQL_RELEASE):$(MYSQL_VERSION)"
martianzhang's avatar
martianzhang 已提交
174 175 176 177 178
	@docker run --name soar-mysql --rm -d \
	-e MYSQL_ROOT_PASSWORD=1tIsB1g3rt \
	-e MYSQL_DATABASE=sakila \
	-p 3306:3306 \
	-v `pwd`/doc/example/sakila.sql.gz:/docker-entrypoint-initdb.d/sakila.sql.gz \
179
	$(MYSQL_RELEASE):$(MYSQL_VERSION)
martianzhang's avatar
martianzhang 已提交
180

martianzhang's avatar
martianzhang 已提交
181
	@echo "waiting for sakila database initializing "
martianzhang's avatar
martianzhang 已提交
182 183 184 185 186 187 188
	@while ! mysql -h 127.0.0.1 -u root sakila -p1tIsB1g3rt -NBe "do 1;" 2>/dev/null; do \
	printf '.' ; \
	sleep 1 ; \
	done ; \
	echo '.'
	@echo "mysql test enviorment is ready!"

189 190
.PHONY: docker-connect
docker-connect:
martianzhang's avatar
martianzhang 已提交
191
	mysql -h 127.0.0.1 -u root -p1tIsB1g3rt -c
martianzhang's avatar
martianzhang 已提交
192

193 194 195 196 197
# attach docker container with bash interactive mode
.PHONY: docker-it
docker-it:
	docker exec -it soar-mysql /bin/bash

martianzhang's avatar
martianzhang 已提交
198 199 200 201 202 203 204 205
.PHONY: main_test
main_test: install
	@echo "\033[92mrunning main_test\033[0m"
	@echo "soar -list-test-sqls | soar"
	@./doc/example/main_test.sh
	@echo "main_test Success!"

.PHONY: daily
martianzhang's avatar
martianzhang 已提交
206
daily: | deps fmt vendor docker cover doc lint release install main_test clean logo
martianzhang's avatar
martianzhang 已提交
207 208
	@echo "\033[92mdaily build finished\033[0m"

martianzhang's avatar
martianzhang 已提交
209
# vendor, docker will cost long time, if all those are ready, daily-quick will much more fast.
martianzhang's avatar
martianzhang 已提交
210
.PHONY: daily-quick
martianzhang's avatar
martianzhang 已提交
211
daily-quick: | deps fmt cover main_test doc lint logo
martianzhang's avatar
martianzhang 已提交
212 213
	@echo "\033[92mdaily-quick build finished\033[0m"

martianzhang's avatar
martianzhang 已提交
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233
.PHONY: logo
logo:
	@echo "\033[93m"
	@cat doc/images/logo.ascii
	@echo "\033[m"

# Cleans our projects: deletes binaries
.PHONY: clean
clean:
	@echo "\033[92mCleanup ...\033[0m"
	go clean
	@for GOOS in darwin linux windows; do \
	    for GOARCH in 386 amd64; do \
			rm -f ${BINARY}.$${GOOS}-$${GOARCH} ;\
		done ;\
	done
	rm -f ${BINARY} coverage.*
	find . -name "*.log" -delete
	git clean -fi
	docker stop soar-mysql 2>/dev/null || true