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