...

Text file src/github.com/prometheus/client_golang/Makefile.common

Documentation: github.com/prometheus/client_golang

     1# Copyright 2018 The Prometheus Authors
     2# Licensed under the Apache License, Version 2.0 (the "License");
     3# you may not use this file except in compliance with the License.
     4# You may obtain a copy of the License at
     5#
     6# http://www.apache.org/licenses/LICENSE-2.0
     7#
     8# Unless required by applicable law or agreed to in writing, software
     9# distributed under the License is distributed on an "AS IS" BASIS,
    10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    11# See the License for the specific language governing permissions and
    12# limitations under the License.
    13
    14
    15# A common Makefile that includes rules to be reused in different prometheus projects.
    16# !!! Open PRs only against the prometheus/prometheus/Makefile.common repository!
    17
    18# Example usage :
    19# Create the main Makefile in the root project directory.
    20# include Makefile.common
    21# customTarget:
    22# 	@echo ">> Running customTarget"
    23#
    24
    25# Ensure GOBIN is not set during build so that promu is installed to the correct path
    26unexport GOBIN
    27
    28GO           ?= go
    29GOFMT        ?= $(GO)fmt
    30FIRST_GOPATH := $(firstword $(subst :, ,$(shell $(GO) env GOPATH)))
    31GOOPTS       ?=
    32GOHOSTOS     ?= $(shell $(GO) env GOHOSTOS)
    33GOHOSTARCH   ?= $(shell $(GO) env GOHOSTARCH)
    34
    35GO_VERSION        ?= $(shell $(GO) version)
    36GO_VERSION_NUMBER ?= $(word 3, $(GO_VERSION))
    37PRE_GO_111        ?= $(shell echo $(GO_VERSION_NUMBER) | grep -E 'go1\.(10|[0-9])\.')
    38
    39PROMU        := $(FIRST_GOPATH)/bin/promu
    40pkgs          = ./...
    41
    42ifeq (arm, $(GOHOSTARCH))
    43	GOHOSTARM ?= $(shell GOARM= $(GO) env GOARM)
    44	GO_BUILD_PLATFORM ?= $(GOHOSTOS)-$(GOHOSTARCH)v$(GOHOSTARM)
    45else
    46	GO_BUILD_PLATFORM ?= $(GOHOSTOS)-$(GOHOSTARCH)
    47endif
    48
    49GOTEST := $(GO) test
    50GOTEST_DIR :=
    51ifneq ($(CIRCLE_JOB),)
    52ifneq ($(shell command -v gotestsum > /dev/null),)
    53	GOTEST_DIR := test-results
    54	GOTEST := gotestsum --junitfile $(GOTEST_DIR)/unit-tests.xml --
    55endif
    56endif
    57
    58PROMU_VERSION ?= 0.15.0
    59PROMU_URL     := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz
    60
    61SKIP_GOLANGCI_LINT :=
    62GOLANGCI_LINT :=
    63GOLANGCI_LINT_OPTS ?=
    64GOLANGCI_LINT_VERSION ?= v1.54.2
    65# golangci-lint only supports linux, darwin and windows platforms on i386/amd64.
    66# windows isn't included here because of the path separator being different.
    67ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin))
    68	ifeq ($(GOHOSTARCH),$(filter $(GOHOSTARCH),amd64 i386))
    69		# If we're in CI and there is an Actions file, that means the linter
    70		# is being run in Actions, so we don't need to run it here.
    71		ifneq (,$(SKIP_GOLANGCI_LINT))
    72			GOLANGCI_LINT :=
    73		else ifeq (,$(CIRCLE_JOB))
    74			GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint
    75		else ifeq (,$(wildcard .github/workflows/golangci-lint.yml))
    76			GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint
    77		endif
    78	endif
    79endif
    80
    81PREFIX                  ?= $(shell pwd)
    82BIN_DIR                 ?= $(shell pwd)
    83DOCKER_IMAGE_TAG        ?= $(subst /,-,$(shell git rev-parse --abbrev-ref HEAD))
    84DOCKERFILE_PATH         ?= ./Dockerfile
    85DOCKERBUILD_CONTEXT     ?= ./
    86DOCKER_REPO             ?= prom
    87
    88DOCKER_ARCHS            ?= amd64
    89
    90BUILD_DOCKER_ARCHS = $(addprefix common-docker-,$(DOCKER_ARCHS))
    91PUBLISH_DOCKER_ARCHS = $(addprefix common-docker-publish-,$(DOCKER_ARCHS))
    92TAG_DOCKER_ARCHS = $(addprefix common-docker-tag-latest-,$(DOCKER_ARCHS))
    93
    94SANITIZED_DOCKER_IMAGE_TAG := $(subst +,-,$(DOCKER_IMAGE_TAG))
    95
    96ifeq ($(GOHOSTARCH),amd64)
    97        ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux freebsd darwin windows))
    98                # Only supported on amd64
    99                test-flags := -race
   100        endif
   101endif
   102
   103# This rule is used to forward a target like "build" to "common-build".  This
   104# allows a new "build" target to be defined in a Makefile which includes this
   105# one and override "common-build" without override warnings.
   106%: common-% ;
   107
   108.PHONY: common-all
   109common-all: precheck style check_license lint yamllint unused build test
   110
   111.PHONY: common-style
   112common-style:
   113	@echo ">> checking code style"
   114	@fmtRes=$$($(GOFMT) -d $$(find . -path ./vendor -prune -o -name '*.go' -print)); \
   115	if [ -n "$${fmtRes}" ]; then \
   116		echo "gofmt checking failed!"; echo "$${fmtRes}"; echo; \
   117		echo "Please ensure you are using $$($(GO) version) for formatting code."; \
   118		exit 1; \
   119	fi
   120
   121.PHONY: common-check_license
   122common-check_license:
   123	@echo ">> checking license header"
   124	@licRes=$$(for file in $$(find . -type f -iname '*.go' ! -path './vendor/*') ; do \
   125               awk 'NR<=3' $$file | grep -Eq "(Copyright|generated|GENERATED)" || echo $$file; \
   126       done); \
   127       if [ -n "$${licRes}" ]; then \
   128               echo "license header checking failed:"; echo "$${licRes}"; \
   129               exit 1; \
   130       fi
   131
   132.PHONY: common-deps
   133common-deps:
   134	@echo ">> getting dependencies"
   135	$(GO) mod download
   136
   137.PHONY: update-go-deps
   138update-go-deps:
   139	@echo ">> updating Go dependencies"
   140	@for m in $$($(GO) list -mod=readonly -m -f '{{ if and (not .Indirect) (not .Main)}}{{.Path}}{{end}}' all); do \
   141		$(GO) get -d $$m; \
   142	done
   143	$(GO) mod tidy
   144
   145.PHONY: common-test-short
   146common-test-short: $(GOTEST_DIR)
   147	@echo ">> running short tests"
   148	$(GOTEST) -short $(GOOPTS) $(pkgs)
   149
   150.PHONY: common-test
   151common-test: $(GOTEST_DIR)
   152	@echo ">> running all tests"
   153	$(GOTEST) $(test-flags) $(GOOPTS) $(pkgs)
   154
   155$(GOTEST_DIR):
   156	@mkdir -p $@
   157
   158.PHONY: common-format
   159common-format:
   160	@echo ">> formatting code"
   161	$(GO) fmt $(pkgs)
   162
   163.PHONY: common-vet
   164common-vet:
   165	@echo ">> vetting code"
   166	$(GO) vet $(GOOPTS) $(pkgs)
   167
   168.PHONY: common-lint
   169common-lint: $(GOLANGCI_LINT)
   170ifdef GOLANGCI_LINT
   171	@echo ">> running golangci-lint"
   172# 'go list' needs to be executed before staticcheck to prepopulate the modules cache.
   173# Otherwise staticcheck might fail randomly for some reason not yet explained.
   174	$(GO) list -e -compiled -test=true -export=false -deps=true -find=false -tags= -- ./... > /dev/null
   175	$(GOLANGCI_LINT) run $(GOLANGCI_LINT_OPTS) $(pkgs)
   176endif
   177
   178.PHONY: common-yamllint
   179common-yamllint:
   180	@echo ">> running yamllint on all YAML files in the repository"
   181ifeq (, $(shell command -v yamllint > /dev/null))
   182	@echo "yamllint not installed so skipping"
   183else
   184	yamllint .
   185endif
   186
   187# For backward-compatibility.
   188.PHONY: common-staticcheck
   189common-staticcheck: lint
   190
   191.PHONY: common-unused
   192common-unused:
   193	@echo ">> running check for unused/missing packages in go.mod"
   194	$(GO) mod tidy
   195	@git diff --exit-code -- go.sum go.mod
   196
   197.PHONY: common-build
   198common-build: promu
   199	@echo ">> building binaries"
   200	$(PROMU) build --prefix $(PREFIX) $(PROMU_BINARIES)
   201
   202.PHONY: common-tarball
   203common-tarball: promu
   204	@echo ">> building release tarball"
   205	$(PROMU) tarball --prefix $(PREFIX) $(BIN_DIR)
   206
   207.PHONY: common-docker $(BUILD_DOCKER_ARCHS)
   208common-docker: $(BUILD_DOCKER_ARCHS)
   209$(BUILD_DOCKER_ARCHS): common-docker-%:
   210	docker build -t "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)" \
   211		-f $(DOCKERFILE_PATH) \
   212		--build-arg ARCH="$*" \
   213		--build-arg OS="linux" \
   214		$(DOCKERBUILD_CONTEXT)
   215
   216.PHONY: common-docker-publish $(PUBLISH_DOCKER_ARCHS)
   217common-docker-publish: $(PUBLISH_DOCKER_ARCHS)
   218$(PUBLISH_DOCKER_ARCHS): common-docker-publish-%:
   219	docker push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)"
   220
   221DOCKER_MAJOR_VERSION_TAG = $(firstword $(subst ., ,$(shell cat VERSION)))
   222.PHONY: common-docker-tag-latest $(TAG_DOCKER_ARCHS)
   223common-docker-tag-latest: $(TAG_DOCKER_ARCHS)
   224$(TAG_DOCKER_ARCHS): common-docker-tag-latest-%:
   225	docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:latest"
   226	docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:v$(DOCKER_MAJOR_VERSION_TAG)"
   227
   228.PHONY: common-docker-manifest
   229common-docker-manifest:
   230	DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)" $(foreach ARCH,$(DOCKER_ARCHS),$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$(ARCH):$(SANITIZED_DOCKER_IMAGE_TAG))
   231	DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)"
   232
   233.PHONY: promu
   234promu: $(PROMU)
   235
   236$(PROMU):
   237	$(eval PROMU_TMP := $(shell mktemp -d))
   238	curl -s -L $(PROMU_URL) | tar -xvzf - -C $(PROMU_TMP)
   239	mkdir -p $(FIRST_GOPATH)/bin
   240	cp $(PROMU_TMP)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM)/promu $(FIRST_GOPATH)/bin/promu
   241	rm -r $(PROMU_TMP)
   242
   243.PHONY: proto
   244proto:
   245	@echo ">> generating code from proto files"
   246	@./scripts/genproto.sh
   247
   248ifdef GOLANGCI_LINT
   249$(GOLANGCI_LINT):
   250	mkdir -p $(FIRST_GOPATH)/bin
   251	curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/$(GOLANGCI_LINT_VERSION)/install.sh \
   252		| sed -e '/install -d/d' \
   253		| sh -s -- -b $(FIRST_GOPATH)/bin $(GOLANGCI_LINT_VERSION)
   254endif
   255
   256.PHONY: precheck
   257precheck::
   258
   259define PRECHECK_COMMAND_template =
   260precheck:: $(1)_precheck
   261
   262PRECHECK_COMMAND_$(1) ?= $(1) $$(strip $$(PRECHECK_OPTIONS_$(1)))
   263.PHONY: $(1)_precheck
   264$(1)_precheck:
   265	@if ! $$(PRECHECK_COMMAND_$(1)) 1>/dev/null 2>&1; then \
   266		echo "Execution of '$$(PRECHECK_COMMAND_$(1))' command failed. Is $(1) installed?"; \
   267		exit 1; \
   268	fi
   269endef

View as plain text