@ -29,6 +29,8 @@ GO ?= go
GOFMT ?= $( GO) fmt
FIRST_GOPATH := $( firstword $( subst :, ,$( shell $( GO) env GOPATH) ) )
GOOPTS ?=
GOHOSTOS ?= $( shell $( GO) env GOHOSTOS)
GOHOSTARCH ?= $( shell $( GO) env GOHOSTARCH)
GO_VERSION ?= $( shell $( GO) version)
GO_VERSION_NUMBER ?= $( word 3, $( GO_VERSION) )
@ -62,17 +64,30 @@ PROMU := $(FIRST_GOPATH)/bin/promu
STATICCHECK := $( FIRST_GOPATH) /bin/staticcheck
pkgs = ./...
GO_VERSION ?= $( shell $( GO) version)
GO_BUILD_PLATFORM ?= $( subst /,-,$( lastword $( GO_VERSION) ) )
i f e q ( a r m , $( GOHOSTARCH ) )
GOHOSTARM ?= $( shell GOARM = $( GO) env GOARM)
GO_BUILD_PLATFORM ?= $( GOHOSTOS) -$( GOHOSTARCH) v$( GOHOSTARM)
e l s e
GO_BUILD_PLATFORM ?= $( GOHOSTOS) -$( GOHOSTARCH)
e n d i f
PROMU_VERSION ?= 0.2.0
PROMU_URL := https://github.com/prometheus/promu/releases/download/v$( PROMU_VERSION) /promu-$( PROMU_VERSION) .$( GO_BUILD_PLATFORM) .tar.gz
STATICCHECK_VERSION ?= 2019.1
STATICCHECK_URL := https://github.com/dominikh/go-tools/releases/download/$( STATICCHECK_VERSION) /staticcheck_$( GOHOSTOS) _$( GOHOSTARCH)
PREFIX ?= $( shell pwd )
BIN_DIR ?= $( shell pwd )
DOCKER_IMAGE_TAG ?= $( subst /,-,$( shell git rev-parse --abbrev-ref HEAD) )
DOCKER_REPO ?= prom
i f e q ( $( GOHOSTARCH ) , a m d 6 4 )
ifeq ( $( GOHOSTOS) ,$( filter $( GOHOSTOS) ,linux freebsd darwin windows) )
# Only supported on amd64
test-flags := -race
endif
e n d i f
.PHONY : all
all : precheck style staticcheck unused build test
@ -110,12 +125,12 @@ common-test-short:
.PHONY : common -test
common-test :
@echo ">> running all tests"
GO111MODULE = $( GO111MODULE) $( GO) test -race $( GOOPTS) $( pkgs)
GO111MODULE = $( GO111MODULE) $( GO) test $( test-flags) $( GOOPTS) $( pkgs)
.PHONY : common -format
common-format :
@echo ">> formatting code"
GO111MODULE = $( GO111MODULE) $( GO) fmt $( GOOPTS) $( pkgs)
GO111MODULE = $( GO111MODULE) $( GO) fmt $( pkgs)
.PHONY : common -vet
common-vet :
@ -125,8 +140,12 @@ common-vet:
.PHONY : common -staticcheck
common-staticcheck : $( STATICCHECK )
@echo ">> running staticcheck"
chmod +x $( STATICCHECK)
i f d e f G O 1 1 1 M O D U L E
GO111MODULE = $( GO111MODULE) $( STATICCHECK) -ignore " $( STATICCHECK_IGNORE) " -checks "SA*" $( pkgs)
# 'go list' needs to be executed before staticcheck to prepopulate the modules cache.
# Otherwise staticcheck might fail randomly for some reason not yet explained.
GO111MODULE = $( GO111MODULE) $( GO) list -e -compiled -test= true -export= false -deps= true -find= false -tags= -- ./... > /dev/null
GO111MODULE = $( GO111MODULE) $( STATICCHECK) -ignore " $( STATICCHECK_IGNORE) " $( pkgs)
e l s e
$( STATICCHECK) -ignore " $( STATICCHECK_IGNORE) " $( pkgs)
e n d i f
@ -140,8 +159,9 @@ else
i f d e f G O 1 1 1 M O D U L E
@echo ">> running check for unused/missing packages in go.mod"
GO111MODULE = $( GO111MODULE) $( GO) mod tidy
i f e q ( , $( wildcard vendor ) )
@git diff --exit-code -- go.sum go.mod
if n e q ( , $( wildcard vendor ) )
el s e
@echo ">> running check for unused packages in vendor/"
GO111MODULE = $( GO111MODULE) $( GO) mod vendor
@git diff --exit-code -- go.sum go.mod vendor/
@ -175,30 +195,20 @@ common-docker-tag-latest:
promu : $( PROMU )
$(PROMU) :
curl -s -L $( PROMU_URL) | tar -xvz -C /tmp
mkdir -v -p $( FIRST_GOPATH) /bin
cp -v /tmp/promu-$( PROMU_VERSION) .$( GO_BUILD_PLATFORM) /promu $( PROMU)
$( eval PROMU_TMP := $( shell mktemp -d) )
curl -s -L $( PROMU_URL) | tar -xvzf - -C $( PROMU_TMP)
mkdir -p $( FIRST_GOPATH) /bin
cp $( PROMU_TMP) /promu-$( PROMU_VERSION) .$( GO_BUILD_PLATFORM) /promu $( FIRST_GOPATH) /bin/promu
rm -r $( PROMU_TMP)
.PHONY : proto
proto :
@echo ">> generating code from proto files"
@./scripts/genproto.sh
.PHONY : $( STATICCHECK )
$(STATICCHECK) :
i f d e f G O 1 1 1 M O D U L E
# Get staticcheck from a temporary directory to avoid modifying the local go.{mod,sum}.
# See https://github.com/golang/go/issues/27643.
# For now, we are using the next branch of staticcheck because master isn't compatible yet with Go modules.
tmpModule = $$ ( mktemp -d 2>& 1) && \
mkdir -p $$ { tmpModule} /staticcheck && \
cd " $$ {tmpModule} " /staticcheck && \
GO111MODULE = on $( GO) mod init example.com/staticcheck && \
GO111MODULE = on GOOS = GOARCH = $( GO) get -u honnef.co/go/tools/cmd/staticcheck@next && \
rm -rf $$ { tmpModule} ;
e l s e
GOOS = GOARCH = GO111MODULE = off $( GO) get -u honnef.co/go/tools/cmd/staticcheck
e n d i f
mkdir -p $( FIRST_GOPATH) /bin
curl -s -L $( STATICCHECK_URL) > $( STATICCHECK)
i f d e f G O V E N D O R
.PHONY : $( GOVENDOR )