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)))