forked from weaveworks/common
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request weaveworks#157 from simonpasquier/go-modules
*: support Go modules
- Loading branch information
Showing
13 changed files
with
461 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
# Copyright 2018 The Prometheus Authors | ||
# Licensed under the Apache License, Version 2.0 (the "License"); | ||
# you may not use this file except in compliance with the License. | ||
# You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
|
||
include Makefile.common | ||
|
||
.PHONY: deps | ||
deps: | ||
@echo ">> getting dependencies" | ||
GO111MODULE=$(GO111MODULE) $(GO) get $(GOOPTS) -t ./... | ||
|
||
.PHONY: test | ||
test:: deps check_license unused common-test | ||
|
||
ifeq (,$(shell echo $(GO_VERSION_NUMBER) | grep -E 'go1\.(7|8|9)\.')) | ||
test:: staticcheck | ||
endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,223 @@ | ||
# Copyright 2018 The Prometheus Authors | ||
# Licensed under the Apache License, Version 2.0 (the "License"); | ||
# you may not use this file except in compliance with the License. | ||
# You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
|
||
|
||
# A common Makefile that includes rules to be reused in different prometheus projects. | ||
# !!! Open PRs only against the prometheus/prometheus/Makefile.common repository! | ||
|
||
# Example usage : | ||
# Create the main Makefile in the root project directory. | ||
# include Makefile.common | ||
# customTarget: | ||
# @echo ">> Running customTarget" | ||
# | ||
|
||
# Ensure GOBIN is not set during build so that promu is installed to the correct path | ||
unexport GOBIN | ||
|
||
GO ?= go | ||
GOFMT ?= $(GO)fmt | ||
FIRST_GOPATH := $(firstword $(subst :, ,$(shell $(GO) env GOPATH))) | ||
GOOPTS ?= | ||
|
||
GO_VERSION ?= $(shell $(GO) version) | ||
GO_VERSION_NUMBER ?= $(word 3, $(GO_VERSION)) | ||
PRE_GO_111 ?= $(shell echo $(GO_VERSION_NUMBER) | grep -E 'go1\.(10|[0-9])\.') | ||
|
||
unexport GOVENDOR | ||
ifeq (, $(PRE_GO_111)) | ||
ifneq (,$(wildcard go.mod)) | ||
# Enforce Go modules support just in case the directory is inside GOPATH (and for Travis CI). | ||
GO111MODULE := on | ||
|
||
ifneq (,$(wildcard vendor)) | ||
# Always use the local vendor/ directory to satisfy the dependencies. | ||
GOOPTS := $(GOOPTS) -mod=vendor | ||
endif | ||
endif | ||
else | ||
ifneq (,$(wildcard go.mod)) | ||
ifneq (,$(wildcard vendor)) | ||
$(warning This repository requires Go >= 1.11 because of Go modules) | ||
$(warning Some recipes may not work as expected as the current Go runtime is '$(GO_VERSION_NUMBER)') | ||
endif | ||
else | ||
# This repository isn't using Go modules (yet). | ||
GOVENDOR := $(FIRST_GOPATH)/bin/govendor | ||
endif | ||
|
||
unexport GO111MODULE | ||
endif | ||
PROMU := $(FIRST_GOPATH)/bin/promu | ||
STATICCHECK := $(FIRST_GOPATH)/bin/staticcheck | ||
pkgs = ./... | ||
|
||
GO_VERSION ?= $(shell $(GO) version) | ||
GO_BUILD_PLATFORM ?= $(subst /,-,$(lastword $(GO_VERSION))) | ||
|
||
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 | ||
|
||
PREFIX ?= $(shell pwd) | ||
BIN_DIR ?= $(shell pwd) | ||
DOCKER_IMAGE_TAG ?= $(subst /,-,$(shell git rev-parse --abbrev-ref HEAD)) | ||
DOCKER_REPO ?= prom | ||
|
||
.PHONY: all | ||
all: precheck style staticcheck unused build test | ||
|
||
# This rule is used to forward a target like "build" to "common-build". This | ||
# allows a new "build" target to be defined in a Makefile which includes this | ||
# one and override "common-build" without override warnings. | ||
%: common-% ; | ||
|
||
.PHONY: common-style | ||
common-style: | ||
@echo ">> checking code style" | ||
@fmtRes=$$($(GOFMT) -d $$(find . -path ./vendor -prune -o -name '*.go' -print)); \ | ||
if [ -n "$${fmtRes}" ]; then \ | ||
echo "gofmt checking failed!"; echo "$${fmtRes}"; echo; \ | ||
echo "Please ensure you are using $$($(GO) version) for formatting code."; \ | ||
exit 1; \ | ||
fi | ||
|
||
.PHONY: common-check_license | ||
common-check_license: | ||
@echo ">> checking license header" | ||
@licRes=$$(for file in $$(find . -type f -iname '*.go' ! -path './vendor/*') ; do \ | ||
awk 'NR<=3' $$file | grep -Eq "(Copyright|generated|GENERATED)" || echo $$file; \ | ||
done); \ | ||
if [ -n "$${licRes}" ]; then \ | ||
echo "license header checking failed:"; echo "$${licRes}"; \ | ||
exit 1; \ | ||
fi | ||
|
||
.PHONY: common-test-short | ||
common-test-short: | ||
@echo ">> running short tests" | ||
GO111MODULE=$(GO111MODULE) $(GO) test -short $(GOOPTS) $(pkgs) | ||
|
||
.PHONY: common-test | ||
common-test: | ||
@echo ">> running all tests" | ||
GO111MODULE=$(GO111MODULE) $(GO) test -race $(GOOPTS) $(pkgs) | ||
|
||
.PHONY: common-format | ||
common-format: | ||
@echo ">> formatting code" | ||
GO111MODULE=$(GO111MODULE) $(GO) fmt $(GOOPTS) $(pkgs) | ||
|
||
.PHONY: common-vet | ||
common-vet: | ||
@echo ">> vetting code" | ||
GO111MODULE=$(GO111MODULE) $(GO) vet $(GOOPTS) $(pkgs) | ||
|
||
.PHONY: common-staticcheck | ||
common-staticcheck: $(STATICCHECK) | ||
@echo ">> running staticcheck" | ||
ifdef GO111MODULE | ||
GO111MODULE=$(GO111MODULE) $(STATICCHECK) -ignore "$(STATICCHECK_IGNORE)" -checks "SA*" $(pkgs) | ||
else | ||
$(STATICCHECK) -ignore "$(STATICCHECK_IGNORE)" $(pkgs) | ||
endif | ||
|
||
.PHONY: common-unused | ||
common-unused: $(GOVENDOR) | ||
ifdef GOVENDOR | ||
@echo ">> running check for unused packages" | ||
@$(GOVENDOR) list +unused | grep . && exit 1 || echo 'No unused packages' | ||
else | ||
ifdef GO111MODULE | ||
@echo ">> running check for unused/missing packages in go.mod" | ||
GO111MODULE=$(GO111MODULE) $(GO) mod tidy | ||
@git diff --exit-code -- go.sum go.mod | ||
ifneq (,$(wildcard vendor)) | ||
@echo ">> running check for unused packages in vendor/" | ||
GO111MODULE=$(GO111MODULE) $(GO) mod vendor | ||
@git diff --exit-code -- go.sum go.mod vendor/ | ||
endif | ||
endif | ||
endif | ||
|
||
.PHONY: common-build | ||
common-build: promu | ||
@echo ">> building binaries" | ||
GO111MODULE=$(GO111MODULE) $(PROMU) build --prefix $(PREFIX) | ||
|
||
.PHONY: common-tarball | ||
common-tarball: promu | ||
@echo ">> building release tarball" | ||
$(PROMU) tarball --prefix $(PREFIX) $(BIN_DIR) | ||
|
||
.PHONY: common-docker | ||
common-docker: | ||
docker build -t "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)" . | ||
|
||
.PHONY: common-docker-publish | ||
common-docker-publish: | ||
docker push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)" | ||
|
||
.PHONY: common-docker-tag-latest | ||
common-docker-tag-latest: | ||
docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):latest" | ||
|
||
.PHONY: promu | ||
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) | ||
|
||
.PHONY: proto | ||
proto: | ||
@echo ">> generating code from proto files" | ||
@./scripts/genproto.sh | ||
|
||
.PHONY: $(STATICCHECK) | ||
$(STATICCHECK): | ||
ifdef GO111MODULE | ||
# 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}; | ||
else | ||
GOOS= GOARCH= GO111MODULE=off $(GO) get -u honnef.co/go/tools/cmd/staticcheck | ||
endif | ||
|
||
ifdef GOVENDOR | ||
.PHONY: $(GOVENDOR) | ||
$(GOVENDOR): | ||
GOOS= GOARCH= $(GO) get -u github.com/kardianos/govendor | ||
endif | ||
|
||
.PHONY: precheck | ||
precheck:: | ||
|
||
define PRECHECK_COMMAND_template = | ||
precheck:: $(1)_precheck | ||
|
||
|
||
PRECHECK_COMMAND_$(1) ?= $(1) $$(strip $$(PRECHECK_OPTIONS_$(1))) | ||
.PHONE: $(1)_precheck | ||
$(1)_precheck: | ||
@if ! $$(PRECHECK_COMMAND_$(1)) 1>/dev/null 2>&1; then \ | ||
echo "Execution of '$$(PRECHECK_COMMAND_$(1))' command failed. Is $(1) installed?"; \ | ||
exit 1; \ | ||
fi | ||
endef |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.