Add cross-compilation Makefile targets and tar-based releases.
Revamp the build system to be more inline with other Prometheus exporters. Notably add Darwin and Windows build targets, and add support for releases using tar files.
This commit is contained in:
112
Makefile
112
Makefile
@@ -1,36 +1,78 @@
|
||||
|
||||
COVERDIR = .coverage
|
||||
TOOLDIR = tools
|
||||
BINDIR = bin
|
||||
RELEASEDIR = release
|
||||
|
||||
GO_SRC := $(shell find . -name '*.go' ! -path '*/vendor/*' ! -path 'tools/*' )
|
||||
GO_DIRS := $(shell find . -type d -name '*.go' ! -path '*/vendor/*' ! -path 'tools/*' )
|
||||
DIRS = $(BINDIR) $(RELEASEDIR)
|
||||
|
||||
GO_SRC := $(shell find . -name '*.go' ! -path '*/vendor/*' ! -path 'tools/*' ! -path 'bin/*' ! -path 'release/*' )
|
||||
GO_DIRS := $(shell find . -type d -name '*.go' ! -path '*/vendor/*' ! -path 'tools/*' ! -path 'bin/*' ! -path 'release/*' )
|
||||
GO_PKGS := $(shell go list ./... | grep -v '/vendor/')
|
||||
|
||||
CONTAINER_NAME ?= wrouesnel/postgres_exporter:latest
|
||||
VERSION ?= $(shell git describe --dirty)
|
||||
BINARY := $(shell basename $(shell pwd))
|
||||
VERSION ?= $(shell git describe --dirty 2>/dev/null)
|
||||
VERSION_SHORT ?= $(shell git describe --abbrev=0 2>/dev/null)
|
||||
|
||||
ifeq ($(VERSION),)
|
||||
VERSION := v0.0.0
|
||||
endif
|
||||
|
||||
ifeq ($(VERSION_SHORT),)
|
||||
VERSION_SHORT := v0.0.0
|
||||
endif
|
||||
|
||||
# By default this list is filtered down to some common platforms.
|
||||
platforms := $(subst /,-,$(shell go tool dist list | grep -e linux -e windows -e darwin | grep -e 386 -e amd64))
|
||||
PLATFORM_BINS := $(patsubst %,$(BINDIR)/$(BINARY)_$(VERSION_SHORT)_%/$(BINARY),$(platforms))
|
||||
PLATFORM_DIRS := $(patsubst %,$(BINDIR)/$(BINARY)_$(VERSION_SHORT)_%,$(platforms))
|
||||
PLATFORM_TARS := $(patsubst %,$(RELEASEDIR)/$(BINARY)_$(VERSION_SHORT)_%.tar.gz,$(platforms))
|
||||
|
||||
# These are evaluated on use, and so will have the correct values in the build
|
||||
# rule (https://vic.demuzere.be/articles/golang-makefile-crosscompile/)
|
||||
PLATFORMS_TEMP = $(subst -, ,$(patsubst $(BINDIR)/$(BINARY)_$(VERSION_SHORT)_%/$(BINARY),%,$@))
|
||||
GOOS = $(word 1, $(PLATFORMS_TEMP))
|
||||
GOARCH = $(word 2, $(PLATFORMS_TEMP))
|
||||
|
||||
CURRENT_PLATFORM := $(BINDIR)/$(BINARY)_$(VERSION_SHORT)_$(shell go env GOOS)-$(shell go env GOARCH)/$(BINARY)
|
||||
|
||||
CONCURRENT_LINTERS ?=
|
||||
ifeq ($(CONCURRENT_LINTERS),)
|
||||
CONCURRENT_LINTERS = $(shell gometalinter --help | grep -o 'concurrency=\w*' | cut -d= -f2 | cut -d' ' -f1)
|
||||
endif
|
||||
|
||||
CONCURRENT_LINTERS ?= $(shell cat /proc/cpuinfo | grep processor | wc -l)
|
||||
LINTER_DEADLINE ?= 30s
|
||||
|
||||
$(shell mkdir -p $(DIRS))
|
||||
|
||||
export PATH := $(TOOLDIR)/bin:$(PATH)
|
||||
SHELL := env PATH=$(PATH) /bin/bash
|
||||
|
||||
all: style lint test postgres_exporter
|
||||
all: style lint test binary
|
||||
|
||||
# Cross compilation (e.g. if you are on a Mac)
|
||||
cross: docker-build docker
|
||||
binary: $(BINARY)
|
||||
|
||||
# Simple go build
|
||||
postgres_exporter: $(GO_SRC)
|
||||
CGO_ENABLED=0 go build -a -ldflags "-extldflags '-static' -X main.Version=$(VERSION)" -o postgres_exporter .
|
||||
$(BINARY): $(CURRENT_PLATFORM)
|
||||
ln -sf $< $@
|
||||
|
||||
postgres_exporter_integration_test: $(GO_SRC)
|
||||
CGO_ENABLED=0 go test -c -tags integration \
|
||||
-a -ldflags "-extldflags '-static' -X main.Version=$(VERSION)" -o postgres_exporter_integration_test -cover -covermode count .
|
||||
$(PLATFORM_BINS): $(GO_SRC)
|
||||
CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) go build -a \
|
||||
-ldflags "-extldflags '-static' -X main.Version=$(VERSION)" \
|
||||
-o $@ .
|
||||
|
||||
$(PLATFORM_DIRS): $(PLATFORM_BINS)
|
||||
|
||||
$(PLATFORM_TARS): $(RELEASEDIR)/%.tar.gz : $(BINDIR)/%
|
||||
tar -czf $@ -C $(BINDIR) $$(basename $<)
|
||||
|
||||
release-bin: $(PLATFORM_BINS)
|
||||
|
||||
release: $(PLATFORM_TARS)
|
||||
|
||||
# Take a go build and turn it into a minimal container
|
||||
docker: postgres_exporter
|
||||
docker build -t $(CONTAINER_NAME) .
|
||||
docker: $(CURRENT_PLATFORM)
|
||||
docker build --build-arg=binary=$(CURRENT_PLATFORM) -t $(CONTAINER_NAME) .
|
||||
|
||||
style: tools
|
||||
gometalinter --disable-all --enable=gofmt --vendor
|
||||
@@ -42,14 +84,17 @@ lint: tools
|
||||
fmt: tools
|
||||
gofmt -s -w $(GO_SRC)
|
||||
|
||||
run-tests: tools
|
||||
mkdir -p $(COVERDIR)
|
||||
rm -f $(COVERDIR)/*
|
||||
postgres_exporter_integration_test: $(GO_SRC)
|
||||
CGO_ENABLED=0 go test -c -tags integration \
|
||||
-a -ldflags "-extldflags '-static' -X main.Version=$(VERSION)" \
|
||||
-o postgres_exporter_integration_test -cover -covermode count .
|
||||
|
||||
test: tools
|
||||
@mkdir -p $(COVERDIR)
|
||||
@rm -f $(COVERDIR)/*
|
||||
for pkg in $(GO_PKGS) ; do \
|
||||
go test -v -covermode count -coverprofile=$(COVERDIR)/$$(echo $$pkg | tr '/' '-').out $$pkg || exit 1 ; \
|
||||
done
|
||||
|
||||
test: run-tests
|
||||
gocovmerge $(shell find $(COVERDIR) -name '*.out') > cover.test.out
|
||||
|
||||
test-integration: postgres_exporter postgres_exporter_integration_test
|
||||
@@ -58,24 +103,13 @@ test-integration: postgres_exporter postgres_exporter_integration_test
|
||||
cover.out: tools
|
||||
gocovmerge cover.*.out > cover.out
|
||||
|
||||
# Do a self-contained docker build - we pull the official upstream container
|
||||
# and do a self-contained build.
|
||||
docker-build:
|
||||
docker run -v $(shell pwd):/go/src/github.com/wrouesnel/postgres_exporter \
|
||||
-v $(shell pwd):/real_src \
|
||||
-e SHELL_UID=$(shell id -u) -e SHELL_GID=$(shell id -g) \
|
||||
-w /go/src/github.com/wrouesnel/postgres_exporter \
|
||||
golang:1.9-wheezy \
|
||||
/bin/bash -c "make >&2 && chown $$SHELL_UID:$$SHELL_GID ./postgres_exporter"
|
||||
docker build -t $(CONTAINER_NAME) .
|
||||
|
||||
push:
|
||||
docker push $(CONTAINER_NAME)
|
||||
|
||||
clean:
|
||||
[ ! -z $(BINDIR) ] && [ -e $(BINDIR) ] && find $(BINDIR) -print -delete || /bin/true
|
||||
[ ! -z $(COVERDIR) ] && [ -e $(COVERDIR) ] && find $(COVERDIR) -print -delete || /bin/true
|
||||
[ ! -z $(RELEASEDIR) ] && [ -e $(RELEASEDIR) ] && find $(RELEASEDIR) -print -delete || /bin/true
|
||||
rm -f postgres_exporter postgres_exporter_integration_test
|
||||
|
||||
tools:
|
||||
$(MAKE) -C $(TOOLDIR)
|
||||
|
||||
clean:
|
||||
rm -rf postgres_exporter postgres_exporter_integration_test $(COVERDIR)
|
||||
|
||||
.PHONY: tools docker-build docker lint fmt test vet push cross clean
|
||||
|
||||
.PHONY: tools style fmt test all release binary clean
|
||||
|
||||
Reference in New Issue
Block a user