.PHONY: default install build test quicktest fmt vet lint # List of all release tags "supported" by our current Go version # E.g. ":go1.1:go1.2:go1.3:go1.4:go1.5:go1.6:go1.7:go1.8:go1.9:go1.10:go1.11:go1.12:" GO_RELEASE_TAGS := $(shell go list -f ':{{join (context.ReleaseTags) ":"}}:' runtime) # Only use the `-race` flag on newer versions of Go (version 1.3 and newer) ifeq (,$(findstring :go1.3:,$(GO_RELEASE_TAGS))) RACE_FLAG := else RACE_FLAG := -race -cpu 1,2,4 endif # Run `go vet` on Go 1.12 and newer. For Go 1.5-1.11, use `go tool vet` ifneq (,$(findstring :go1.12:,$(GO_RELEASE_TAGS))) GO_VET := go vet \ -atomic \ -bool \ -copylocks \ -nilfunc \ -printf \ -rangeloops \ -unreachable \ -unsafeptr \ -unusedresult \ . else ifneq (,$(findstring :go1.5:,$(GO_RELEASE_TAGS))) GO_VET := go tool vet \ -atomic \ -bool \ -copylocks \ -nilfunc \ -printf \ -shadow \ -rangeloops \ -unreachable \ -unsafeptr \ -unusedresult \ . else GO_VET := @echo "go vet skipped -- not supported on this version of Go" endif default: fmt vet lint build quicktest install: go get -t -v ./... build: go build -v ./... test: go test -v $(RACE_FLAG) -cover ./... quicktest: go test ./... # Capture output and force failure when there is non-empty output fmt: @echo gofmt -l . @OUTPUT=`gofmt -l . 2>&1`; \ if [ "$$OUTPUT" ]; then \ echo "gofmt must be run on the following files:"; \ echo "$$OUTPUT"; \ exit 1; \ fi vet: $(GO_VET) # https://github.com/golang/lint # go get github.com/golang/lint/golint # Capture output and force failure when there is non-empty output # Only run on go1.5+ lint: @echo golint ./... @OUTPUT=`command -v golint >/dev/null 2>&1 && golint ./... 2>&1`; \ if [ "$$OUTPUT" ]; then \ echo "golint errors:"; \ echo "$$OUTPUT"; \ exit 1; \ fi