go.uber.org/yarpc@v1.72.1/etc/make/local.mk (about) 1 # Paths besides auto-detected generated files that should be excluded from 2 # lint results. 3 LINT_EXCLUDES_EXTRAS = 4 5 # Regexes for 'go vet' rules to ignore 6 FILTER_GOVET := grep -v \ 7 -e '^\#' \ 8 -e 'possible formatting directive in Error call' \ 9 -e 'Example.*refers to unknown identifier' 10 11 # Regexes for 'staticcheck' rules to ignore 12 FILTER_STATICCHECK := grep -v \ 13 -e 'grpc.CallCustomCodec is deprecated: use ForceCodec instead' 14 15 ERRCHECK_FLAGS := -ignoretests 16 ERRCHECK_EXCLUDES := \.Close\(\) \.Stop\(\) fmt\.Fprint 17 FILTER_ERRCHECK := grep -v $(patsubst %,-e %, $(ERRCHECK_EXCLUDES)) 18 19 STATICCHECK_FLAGS := 20 21 # The number of jobs allocated to run examples tests in parallel 22 # The goal is to have all examples tests run in parallel, and 23 # this is currently greater than the number of examples tests 24 EXAMPLES_JOBS ?= 16 25 26 GEN_BINS_INTERNAL = $(BIN)/thriftrw-plugin-yarpc $(BIN)/protoc-gen-yarpc-go $(BIN)/protoc-gen-yarpc-go-v2 27 28 $(BIN)/thriftrw-plugin-yarpc: ./encoding/thrift/thriftrw-plugin-yarpc/*.go 29 @mkdir -p $(BIN) 30 go build -o $(BIN)/thriftrw-plugin-yarpc ./encoding/thrift/thriftrw-plugin-yarpc 31 32 $(BIN)/protoc-gen-yarpc-go: ./encoding/protobuf/protoc-gen-yarpc-go/*.go 33 @mkdir -p $(BIN) 34 go build -o $(BIN)/protoc-gen-yarpc-go ./encoding/protobuf/protoc-gen-yarpc-go 35 36 $(BIN)/protoc-gen-yarpc-go-v2: ./encoding/protobuf/protoc-gen-yarpc-go-v2/*.go 37 @mkdir -p $(BIN) 38 go build -o $(BIN)/protoc-gen-yarpc-go-v2 ./encoding/protobuf/protoc-gen-yarpc-go-v2 39 40 .PHONY: build 41 build: __eval_packages ## go build all packages 42 go build $(PACKAGES) 43 44 .PHONY: generate 45 generate: $(GEN_BINS) $(GEN_BINS_INTERNAL) ## call generation script 46 @GOBIN=$(BIN) go install github.com/golang/mock/mockgen 47 @PATH=$(BIN):$$PATH ./etc/bin/generate.sh 48 ifdef WITHIN_DOCKER 49 @chown -R --reference . . 50 endif 51 52 .PHONY: nogogenerate 53 nogogenerate: __eval_go_files ## check to make sure go:generate is not used 54 $(eval NOGOGENERATE_LOG := $(shell mktemp -t nogogenerate.XXXXX)) 55 @grep -n \/\/go:generate $(GO_FILES) 2>&1 > $(NOGOGENERATE_LOG) || true 56 @[ ! -s "$(NOGOGENERATE_LOG)" ] || (echo "do not use //go:generate, add to etc/bin/generate.sh instead:" | cat - $(NOGOGENERATE_LOG) && false) 57 58 .PHONY: generatenodiff 59 generatenodiff: ## make sure no diff is generated by make generate 60 $(eval GENERATENODIFF_PRE := $(shell mktemp -t generatenodiff_pre.XXXXX)) 61 $(eval GENERATENODIFF_POST := $(shell mktemp -t generatenodiff_post.XXXXX)) 62 $(eval GENERATENODIFF_DIFF := $(shell mktemp -t generatenodiff_diff.XXXXX)) 63 @git status --short > $(GENERATENODIFF_PRE) 64 @$(MAKE) generate 65 @git status --short > $(GENERATENODIFF_POST) 66 @diff $(GENERATENODIFF_PRE) $(GENERATENODIFF_POST) > $(GENERATENODIFF_DIFF) || true 67 @[ ! -s "$(GENERATENODIFF_DIFF)" ] || (echo "make generate produced a diff, make sure to check these in:" | cat - $(GENERATENODIFF_DIFF) && false) 68 69 70 .PHONY: gofmt 71 gofmt: __eval_go_files ## check gofmt 72 $(eval FMT_LOG := $(shell mktemp -t gofmt.XXXXX)) 73 @PATH=$(BIN):$$PATH gofmt -e -s -l $(GO_FILES) | $(FILTER_LINT) > $(FMT_LOG) || true 74 @[ ! -s "$(FMT_LOG)" ] || (echo "gofmt failed:" | cat - $(FMT_LOG) && false) 75 76 .PHONY: govet 77 govet: __eval_packages __eval_go_files ## check go vet 78 $(eval VET_LOG := $(shell mktemp -t govet.XXXXX)) 79 @go vet $(PACKAGES) 2>&1 \ 80 | grep -v '^exit status' \ 81 | $(FILTER_GOVET) \ 82 | $(FILTER_LINT) > $(VET_LOG) || true 83 @[ ! -s "$(VET_LOG)" ] || (echo "govet failed:" | cat - $(VET_LOG) && false) 84 85 .PHONY: golint 86 golint: $(GOLINT) __eval_packages __eval_go_files ## check golint 87 $(eval LINT_LOG := $(shell mktemp -t golint.XXXXX)) 88 @for pkg in $(PACKAGES); do \ 89 PATH=$(BIN):$$PATH golint $$pkg | $(FILTER_LINT) >> $(LINT_LOG) || true; \ 90 done 91 @[ ! -s "$(LINT_LOG)" ] || (echo "golint failed:" | cat - $(LINT_LOG) && false) 92 93 .PHONY: staticcheck 94 staticcheck: $(STATICCHECK) __eval_packages __eval_go_files ## check staticcheck 95 $(eval STATICCHECK_LOG := $(shell mktemp -t staticcheck.XXXXX)) 96 @PATH=$(BIN):$$PATH staticcheck $(STATICCHECK_FLAGS) $(PACKAGES) 2>&1 \ 97 | $(FILTER_STATICCHECK) \ 98 | $(FILTER_LINT) > $(STATICCHECK_LOG) || true 99 @[ ! -s "$(STATICCHECK_LOG)" ] || (echo "staticcheck failed:" | cat - $(STATICCHECK_LOG) && false) 100 101 .PHONY: errcheck 102 errcheck: $(ERRCHECK) __eval_packages __eval_go_files ## check errcheck 103 $(eval ERRCHECK_LOG := $(shell mktemp -t errcheck.XXXXX)) 104 @PATH=$(BIN):$$PATH errcheck $(ERRCHECK_FLAGS) $(PACKAGES) 2>&1 | $(FILTER_LINT) | $(FILTER_ERRCHECK) > $(ERRCHECK_LOG) || true 105 @[ ! -s "$(ERRCHECK_LOG)" ] || (echo "errcheck failed:" | cat - $(ERRCHECK_LOG) && false) 106 107 .PHONY: verifyversion 108 verifyversion: ## verify the version in the changelog is the same as in version.go 109 $(eval CHANGELOG_VERSION := $(shell perl -ne '/^## \[(\S+?)\]/ && print "v$$1\n"' CHANGELOG.md | head -n1)) 110 $(eval INTHECODE_VERSION := $(shell perl -ne '/^const Version.*"([^"]+)".*$$/ && print "v$$1\n"' version.go)) 111 @if [ "$(INTHECODE_VERSION)" = "$(CHANGELOG_VERSION)" ]; then \ 112 echo "yarpc-go: $(CHANGELOG_VERSION)"; \ 113 elif [ "$(CHANGELOG_VERSION)" = "vUnreleased" ]; then \ 114 echo "yarpc-go (development): $(INTHECODE_VERSION)"; \ 115 else \ 116 echo "Version number in version.go does not match CHANGELOG.md"; \ 117 echo "version.go: $(INTHECODE_VERSION)"; \ 118 echo "CHANGELOG : $(CHANGELOG_VERSION)"; \ 119 exit 1; \ 120 fi 121 122 .PHONY: verifycodecovignores 123 verifycodecovignores: ## verify that .codecov.yml contains all .nocover packages 124 @find . -name vendor -prune -o -name .nocover -exec dirname '{}' ';' \ 125 | cut -b2- \ 126 | while read f; do \ 127 if ! grep "$$f" .codecov.yml >/dev/null; then \ 128 echo ".codecov.yml is out of date: add $$f to it"; \ 129 exit 1; \ 130 fi \ 131 done 132 133 .PHONY: basiclint 134 basiclint: gofmt govet golint staticcheck errcheck # run gofmt govet golint staticcheck errcheck 135 136 .PHONY: lint 137 lint: basiclint generatenodiff nogogenerate verifyversion verifycodecovignores ## run all linters 138 139 .PHONY: test 140 test: $(THRIFTRW) __eval_chunked_packages ## run chunked tests 141 go mod vendor 142 PATH=$(BIN):$$PATH go test -race $(CHUNKED_PACKAGES) 143 144 .PHONY: cover 145 cover: $(THRIFTRW) __eval_chunked_packages ## run chunked tests and output code coverage 146 PATH=$(BIN):$$PATH go run ./internal/cover/main.go $(CHUNKED_PACKAGES) 147 go tool cover -html=coverage.txt -o cover.html 148 149 .PHONY: crossdock-cover 150 crossdock-cover: 151 cd internal/crossdock && \ 152 PATH=$(BIN):$$PATH go run ../cover/main.go $$(go list ./...) && \ 153 go tool cover -html=coverage.txt -o cover.html 154 mv internal/crossdock/coverage.txt crossdock.coverage.txt 155 mv internal/crossdock/cover.html crossdock.cover.html 156 157 .PHONY: crossdock-codecov 158 crossdock-codecov: SHELL := /bin/bash 159 crossdock-codecov: crossdock-cover 160 bash <(curl -s https://codecov.io/bash) -c -f crossdock.coverage.txt 161 162 .PHONY: codecov 163 codecov: SHELL := /bin/bash 164 codecov: cover ## run code coverage and upload to codecov.io 165 bash <(curl -s https://codecov.io/bash) -c -f coverage.txt 166 167 .PHONY: examples 168 examples: ## run all examples tests 169 RUN=$(RUN) V=$(V) $(MAKE) -j $(EXAMPLES_JOBS) -C internal/examples 170 171 .PHONY: __eval_packages 172 __eval_packages: 173 ifndef PACKAGES 174 $(eval PACKAGES := $(shell go list ./...)) 175 else 176 $(eval PACKAGES := $(shell go list $(PACKAGES))) 177 endif 178 179 .PHONY: __eval_chunked_packages 180 __eval_chunked_packages: __eval_packages 181 ifndef CHUNKED_PACKAGES 182 $(eval CHUNK := $(or $(THIS_CHUNK),0)) 183 $(eval CHUNKS := $(or $(TOTAL_CHUNKS),1)) 184 185 # Adjust start index 186 # Our chunk script starts from 1, while CI providers start at 0. 187 $(eval CHUNK := $(shell expr $(CHUNK) + 1)) 188 189 $(eval CHUNKED_PACKAGES := $(shell go run internal/shard/main.go $(CHUNK) $(CHUNKS) $(PACKAGES))) 190 else 191 $(eval CHUNKED_PACKAGES := $(shell go list ./...) 192 endif 193 194 .PHONY: __eval_go_files 195 __eval_go_files: 196 $(eval GO_FILES := $(shell find . -name '*.go' | sed 's/^\.\///' | grep -v -e ^vendor\/)) 197 $(eval GENERATED_GO_FILES := $(shell \ 198 find $(GO_FILES) \ 199 -exec sh -c 'head -n30 {} | grep "Code generated by\|Autogenerated by\|Automatically generated by\|@generated" >/dev/null' \; \ 200 -print)) 201 $(eval FILTER_LINT := grep -v $(patsubst %,-e %, $(GENERATED_GO_FILES) $(LINT_EXCLUDES_EXTRAS)))