|  | IMPORT_PATH := github.com/FiloSottile/gvt | 
|  | V := 1 # When V is 1, print commands and build progress. | 
|  | IGNORED_PACKAGES := /vendor/ | 
|  |  | 
|  | .PHONY: gvt | 
|  | gvt: .GOPATH/.ok | 
|  | $Q go install $(if $V,-v) $(VERSION_FLAGS) github.com/FiloSottile/gvt | 
|  |  | 
|  | ##### =====> Utility targets <===== ##### | 
|  |  | 
|  | .PHONY: clean test list cover format | 
|  |  | 
|  | clean: | 
|  | $Q rm -rf bin .GOPATH | 
|  |  | 
|  | test: .GOPATH/.ok | 
|  | $Q go test $(if $V,-v) -i -race $(allpackages) # install -race libs to speed up next run | 
|  | ifndef CI | 
|  | $Q go vet $(allpackages) | 
|  | $Q GODEBUG=cgocheck=2 go test -race $(allpackages) | 
|  | else | 
|  | $Q ( go vet $(allpackages); echo $$? ) | \ | 
|  | tee .GOPATH/test/vet.txt | sed '$$ d'; exit $$(tail -1 .GOPATH/test/vet.txt) | 
|  | $Q ( GODEBUG=cgocheck=2 go test -v -race $(allpackages); echo $$? ) | \ | 
|  | tee .GOPATH/test/output.txt | sed '$$ d'; exit $$(tail -1 .GOPATH/test/output.txt) | 
|  | endif | 
|  |  | 
|  | list: .GOPATH/.ok | 
|  | @echo $(allpackages) | 
|  |  | 
|  | cover: bin/gocovmerge .GOPATH/.ok | 
|  | $Q rm -f .GOPATH/cover/*.out .GOPATH/cover/all.merged | 
|  | $(if $V,@echo "-- go test -coverpkg=./... -coverprofile=.GOPATH/cover/... ./...") | 
|  | $Q for MOD in $(allpackages); do \ | 
|  | go test -coverpkg=`echo $(allpackages)|tr " " ","` \ | 
|  | -coverprofile=.GOPATH/cover/unit-`echo $$MOD|tr "/" "_"`.out \ | 
|  | $$MOD 2>&1 | grep -v "no packages being tested depend on" || exit 1; \ | 
|  | done | 
|  | $Q ./bin/gocovmerge .GOPATH/cover/*.out > .GOPATH/cover/all.merged | 
|  | ifndef CI | 
|  | $Q go tool cover -html .GOPATH/cover/all.merged | 
|  | else | 
|  | $Q go tool cover -html .GOPATH/cover/all.merged -o .GOPATH/cover/all.html | 
|  | endif | 
|  | @echo "" | 
|  | @echo "=====> Total test coverage: <=====" | 
|  | @echo "" | 
|  | $Q go tool cover -func .GOPATH/cover/all.merged | 
|  |  | 
|  | format: bin/goimports .GOPATH/.ok | 
|  | $Q find .GOPATH/src/$(IMPORT_PATH)/ -iname \*.go | grep -v -e "^$$" $(addprefix -e ,$(IGNORED_PACKAGES)) | xargs ./bin/goimports -w | 
|  |  | 
|  | ##### =====> Internals <===== ##### | 
|  |  | 
|  | .PHONY: setup | 
|  | setup: | 
|  | @if grep "/.GOPATH" .gitignore > /dev/null 2>&1; then \ | 
|  | echo "This project seems already set up."; exit 1; fi | 
|  | @if ! which gvt > /dev/null; then echo "You need gvt to run the automated setup."; \ | 
|  | echo "Install it with: go get -u github.com/FiloSottile/gvt"; exit 1; fi | 
|  | gvt fetch golang.org/x/tools/cmd/goimports | 
|  | gvt fetch github.com/wadey/gocovmerge | 
|  | echo "/.GOPATH" >> .gitignore | 
|  | echo "/bin" >> .gitignore | 
|  |  | 
|  | VERSION          := $(shell git describe --tags --always --dirty="-dev") | 
|  | DATE             := $(shell date -u '+%Y-%m-%d-%H%M UTC') | 
|  | VERSION_FLAGS    := -ldflags='-X "main.Version=$(VERSION)" -X "main.BuildTime=$(DATE)"' | 
|  |  | 
|  | # cd into the GOPATH to workaround ./... not following symlinks | 
|  | _allpackages = $(shell ( cd $(CURDIR)/.GOPATH/src/$(IMPORT_PATH) && \ | 
|  | GOPATH=$(CURDIR)/.GOPATH go list ./... 2>&1 1>&3 | \ | 
|  | grep -v -e "^$$" $(addprefix -e ,$(IGNORED_PACKAGES)) 1>&2 ) 3>&1 | \ | 
|  | grep -v -e "^$$" $(addprefix -e ,$(IGNORED_PACKAGES))) | 
|  |  | 
|  | # memoize allpackages, so that it's executed only once and only if used | 
|  | allpackages = $(if $(__allpackages),,$(eval __allpackages := $$(_allpackages)))$(__allpackages) | 
|  |  | 
|  | export GOPATH := $(CURDIR)/.GOPATH | 
|  |  | 
|  | Q := $(if $V,,@) | 
|  |  | 
|  | .GOPATH/.ok: | 
|  | $Q mkdir -p "$(dir .GOPATH/src/$(IMPORT_PATH))" | 
|  | $Q ln -s ../../../.. ".GOPATH/src/$(IMPORT_PATH)" | 
|  | $Q mkdir -p .GOPATH/test .GOPATH/cover | 
|  | $Q mkdir -p bin | 
|  | $Q ln -s ../bin .GOPATH/bin | 
|  | $Q touch $@ | 
|  |  | 
|  | .PHONY: bin/gocovmerge bin/goimports | 
|  | bin/gocovmerge: .GOPATH/.ok | 
|  | $Q go install $(IMPORT_PATH)/vendor/github.com/wadey/gocovmerge | 
|  | bin/goimports: .GOPATH/.ok | 
|  | $Q go install $(IMPORT_PATH)/vendor/golang.org/x/tools/cmd/goimports |