diff --git a/Makefile.COMMON b/Makefile.COMMON index d2302dc..f8aa1b3 100644 --- a/Makefile.COMMON +++ b/Makefile.COMMON @@ -41,27 +41,37 @@ VERSION ?= $(error VERSION not set in including Makefile) TARGET ?= $(error TARGET not set in including Makefile) SRC ?= $(shell find . -type f -name "*.go" ! -path "./.build/*") -GOOS := $(shell uname | tr A-Z a-z) -GOARCH := $(subst x86_64,amd64,$(patsubst i%86,386,$(shell uname -m))) +GOOS ?= $(shell uname | tr A-Z a-z) +GOARCH ?= $(subst x86_64,amd64,$(patsubst i%86,386,$(shell uname -m))) -ifeq ($(GOOS),darwin) - RELEASE_SUFFIX ?= -osx$(shell sw_vers -productVersion) -endif +GO_VERSION ?= 1.5.3 -GO_VERSION ?= 1.4.2 - -ifeq ($(shell type go >/dev/null && go version | sed 's/.*go\([0-9.]*\).*/\1/'), $(GO_VERSION)) - GOROOT := $(shell go env GOROOT) +# Check for the correct version of go in the path. If we find it, use it. +# Otherwise, prepare to build go locally. +ifeq ($(shell command -v "go" >/dev/null && go version | sed -e 's/^[^0-9.]*\([0-9.]*\).*/\1/'), $(GO_VERSION)) + GOCC ?= $(shell command -v "go") + GOFMT ?= $(shell command -v "gofmt") + GO ?= $(GOCC) else - GOROOT := $(CURDIR)/.build/go$(GO_VERSION) + GOURL ?= https://golang.org/dl + GOPKG ?= go$(GO_VERSION).$(GOOS)-$(GOARCH).tar.gz + GOROOT ?= $(CURDIR)/.build/go$(GO_VERSION) + GOCC ?= $(GOROOT)/bin/go + GOFMT ?= $(GOROOT)/bin/gofmt + GO ?= GOROOT=$(GOROOT) $(GOCC) endif -GOURL ?= https://golang.org/dl -GOPKG ?= go$(GO_VERSION).$(GOOS)-$(GOARCH)$(RELEASE_SUFFIX).tar.gz -GOPATH := $(CURDIR)/.build/gopath -GOCC ?= $(GOROOT)/bin/go -GO ?= GOROOT=$(GOROOT) GOPATH=$(GOPATH) $(GOCC) -GOFMT ?= $(GOROOT)/bin/gofmt +# Use vendored dependencies if available. Otherwise try to download them. +ifneq (,$(wildcard vendor)) + DEPENDENCIES := $(shell find vendor/ -type f -iname '*.go') + GO := GO15VENDOREXPERIMENT=1 $(GO) +else + GOPATH := $(CURDIR)/.build/gopath + ROOTPKG ?= github.com/prometheus/$(TARGET) + SELFLINK ?= $(GOPATH)/src/$(ROOTPKG) + DEPENDENCIES := dependencies-stamp + GO := GOPATH=$(GOPATH) $(GO) +endif # Never honor GOBIN, should it be set at all. unexport GOBIN @@ -69,29 +79,10 @@ unexport GOBIN SUFFIX ?= $(GOOS)-$(GOARCH) BINARY ?= $(TARGET) ARCHIVE ?= $(TARGET)-$(VERSION).$(SUFFIX).tar.gz -ROOTPKG ?= github.com/prometheus/$(TARGET) -SELFLINK ?= $(GOPATH)/src/$(ROOTPKG) default: $(BINARY) -$(GOCC): - @echo Go version $(GO_VERSION) required but not found in PATH. - @echo About to download and install go$(GO_VERSION) to $(GOROOT) - @echo Abort now if you want to manually install it system-wide instead. - @echo - @sleep 5 - mkdir -p $(GOROOT) - curl -L $(GOURL)/$(GOPKG) | tar -C $(GOROOT) --strip 1 -xz - -$(SELFLINK): - mkdir -p $(dir $@) - ln -s $(CURDIR) $@ - -dependencies-stamp: $(GOCC) $(SRC) | $(SELFLINK) - $(GO) get -d - touch $@ - -$(BINARY): $(GOCC) $(SRC) dependencies-stamp Makefile Makefile.COMMON +$(BINARY): $(GOCC) $(SRC) $(DEPENDENCIES) Makefile Makefile.COMMON $(GO) build $(GOFLAGS) -o $@ .PHONY: archive @@ -106,14 +97,36 @@ tag: git push --tags .PHONY: test -test: $(GOCC) dependencies-stamp - $(GO) test ./... +test: $(GOCC) $(DEPENDENCIES) + $(GO) test $$($(GO) list ./... | grep -v /vendor/) .PHONY: format format: $(GOCC) - find . -iname '*.go' | egrep -v "^\./\.build|./generated|\./Godeps|\.(l|y)\.go" | xargs -n1 $(GOFMT) -w -s=true + find . -iname '*.go' | egrep -v "^\./\.build|./generated|\./vendor|\.(l|y)\.go" | xargs -n1 $(GOFMT) -w -s=true .PHONY: clean clean: rm -rf $(BINARY) $(ARCHIVE) .build *-stamp + + +$(GOCC): + @echo Go version $(GO_VERSION) required but not found in PATH. + @echo About to download and install go$(GO_VERSION) to $(GOROOT) + @echo Abort now if you want to manually install it system-wide instead. + @echo + @sleep 5 + mkdir -p .build + # The archive contains a single directory called 'go/'. + curl -L $(GOURL)/$(GOPKG) | tar -C .build -xzf - + rm -rf $(GOROOT) + mv .build/go $(GOROOT) + +$(SELFLINK): + mkdir -p $(dir $@) + ln -s $(CURDIR) $@ + +# Download dependencies if project doesn't vendor them. +dependencies-stamp: $(GOCC) $(SRC) | $(SELFLINK) + $(GO) get -d + touch $@