From 080f2c0616d536cc1887a1ab3120c760e86a2e07 Mon Sep 17 00:00:00 2001 From: Christian Schwarz Date: Mon, 28 Oct 2019 16:16:16 +0100 Subject: [PATCH] build: Makefile: refactor cross-builds + release, add i386 targets --- .circleci/config.yml | 2 +- Makefile | 188 ++++++++++++++++++++++++++----------------- 2 files changed, 113 insertions(+), 77 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 5a469a9..49ca031 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -55,7 +55,7 @@ jobs: - run: sudo apt update && sudo apt install python3 python3-pip libgirepository1.0-dev - run: ./lazy.sh devsetup - - run: make + - run: make zrepl-bin - run: make vet - run: make test - run: make lint diff --git a/Makefile b/Makefile index ce570e7..8077f7a 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ .PHONY: generate build test vet cover release docs docs-clean clean format lint platformtest -.DEFAULT_GOAL := build +.PHONY: release bins-all release-noarch +.DEFAULT_GOAL := zrepl-bin ARTIFACTDIR := artifacts @@ -12,102 +13,62 @@ ifndef _ZREPL_VERSION $(error cannot infer variable ZREPL_VERSION using git and variable is not overriden by make invocation) endif endif + GO := go +GOOS ?= $(shell bash -c 'source <($(GO) env) && echo "$$GOOS"') +GOARCH ?= $(shell bash -c 'source <($(GO) env) && echo "$$GOARCH"') +GOHOSTOS ?= $(shell bash -c 'source <($(GO) env) && echo "$$GOHOSTOS"') +GOHOSTARCH ?= $(shell bash -c 'source <($(GO) env) && echo "$$GOHOSTARCH"') GO_ENV_VARS := GO111MODULE=on GO_LDFLAGS := "-X github.com/zrepl/zrepl/version.zreplVersion=$(_ZREPL_VERSION)" GO_MOD_READONLY := -mod=readonly GO_BUILDFLAGS := $(GO_MOD_READONLY) -GO_BUILD := $(GO_ENV_VARS) $(GO) build $(GO_BUILDFLAGS) -v -ldflags $(GO_LDFLAGS) +GO_BUILD := $(GO_ENV_VARS) $(GO) build $(GO_BUILDFLAGS) -ldflags $(GO_LDFLAGS) +GOLANGCI_LINT := golangci-lint -# keep in sync with vet target -RELEASE_BINS := $(ARTIFACTDIR)/zrepl-freebsd-amd64 -RELEASE_BINS += $(ARTIFACTDIR)/zrepl-linux-amd64 -RELEASE_BINS += $(ARTIFACTDIR)/zrepl-linux-arm64 -RELEASE_BINS += $(ARTIFACTDIR)/zrepl-darwin-amd64 +.PHONY: printvars +printvars: + @echo GOOS=$(GOOS) + @echo GOARCH=$(GOARCH) -RELEASE_NOARCH := $(ARTIFACTDIR)/zrepl-noarch.tar -THIS_PLATFORM_RELEASE_BIN := $(shell bash -c 'source <($(GO) env) && echo "zrepl-$${GOOS}-$${GOARCH}"' ) -generate: #not part of the build, must do that manually - protoc -I=replication/logic/pdu --go_out=plugins=grpc:replication/logic/pdu replication/logic/pdu/pdu.proto - $(GO_ENV_VARS) $(GO) generate $(GO_BUILDFLAGS) -x ./... +##################### PRODUCING A RELEASE ############# +.PHONY: release wrapup-and-checksum check-git-clean sign clean -format: - goimports -srcdir . -local 'github.com/zrepl/zrepl' -w $(shell find . -type f -name '*.go' -not -path "./vendor/*" -not -name '*.pb.go' -not -name '*_enumer.go') +release: clean + # no cross-platform support for target test + $(MAKE) test + $(MAKE) bins-all + $(MAKE) noarch + $(MAKE) wrapup-and-checksum + $(MAKE) check-git-clean +ifeq (SIGN, 1) + $(make) sign +endif + @echo "ZREPL RELEASE ARTIFACTS AVAILABLE IN artifacts/release" -lint: - golangci-lint run ./... - -build: - $(GO_BUILD) -o "$(ARTIFACTDIR)/zrepl" - -test: - $(GO_ENV_VARS) $(GO) test $(GO_BUILDFLAGS) ./... - # TODO compile the tests for each supported platform - # but `go test -c ./...` is not supported - -vet: - $(GO_ENV_VARS) $(GO) vet $(GO_BUILDFLAGS) ./... - # for each supported platform to cover conditional compilation - # (keep in sync with RELEASE_BINS) - GOOS=freebsd GOARCH=amd64 $(GO_ENV_VARS) $(GO) vet $(GO_BUILDFLAGS) ./... - GOOS=linux GOARCH=amd64 $(GO_ENV_VARS) $(GO) vet $(GO_BUILDFLAGS) ./... - GOOS=linux GOARCH=arm64 $(GO_ENV_VARS) $(GO) vet $(GO_BUILDFLAGS) ./... - GOOS=darwin GOARCH=amd64 $(GO_ENV_VARS) $(GO) vet $(GO_BUILDFLAGS) ./... - -ZREPL_PLATFORMTEST_POOLNAME := zreplplatformtest -ZREPL_PLATFORMTEST_IMAGEPATH := /tmp/zreplplatformtest.pool.img -$(ARTIFACTDIR)/zrepl_platformtest: - $(GO_BUILD) -o "$(ARTIFACTDIR)/zrepl_platformtest" ./platformtest/harness -platformtest: $(ARTIFACTDIR)/zrepl_platformtest - "$(ARTIFACTDIR)/zrepl_platformtest" -poolname "$(ZREPL_PLATFORMTEST_POOLNAME)" -imagepath "$(ZREPL_PLATFORMTEST_IMAGEPATH)" - -$(ARTIFACTDIR): - mkdir -p "$@" - -$(ARTIFACTDIR)/docs: $(ARTIFACTDIR) - mkdir -p "$@" - -$(ARTIFACTDIR)/bash_completion: $(RELEASE_BINS) - artifacts/$(THIS_PLATFORM_RELEASE_BIN) bashcomp "$@" - -.PHONY: $(ARTIFACTDIR)/go_version.txt -$(ARTIFACTDIR)/go_version.txt: - $(GO_ENV_VARS) $(GO) version > $@ - -docs: $(ARTIFACTDIR)/docs - make -C docs \ - html \ - BUILDDIR=../artifacts/docs \ - -docs-clean: - make -C docs \ - clean \ - BUILDDIR=../artifacts/docs - -.PHONY: $(RELEASE_BINS) -# TODO: two wildcards possible -$(RELEASE_BINS): $(ARTIFACTDIR)/zrepl-%: generate $(ARTIFACTDIR) vet test lint - STEM=$*; GOOS="$${STEM%%-*}"; GOARCH="$${STEM##*-}"; export GOOS GOARCH; \ - $(GO_BUILD) -o "$(ARTIFACTDIR)/zrepl-$$GOOS-$$GOARCH" - -$(RELEASE_NOARCH): docs $(ARTIFACTDIR)/bash_completion $(ARTIFACTDIR)/go_version.txt +# expects `release` target to have run before +NOARCH_TARBALL := $(ARTIFACTDIR)/zrepl-noarch.tar +wrapup-and-checksum: + rm -f $(NOARCH_TARBALL) tar --mtime='1970-01-01' --sort=name \ --transform 's/$(ARTIFACTDIR)/zrepl-$(_ZREPL_VERSION)-noarch/' \ --transform 's#dist#zrepl-$(_ZREPL_VERSION)-noarch/dist#' \ --transform 's#config/samples#zrepl-$(_ZREPL_VERSION)-noarch/config#' \ - -acf $@ \ + -acf $(NOARCH_TARBALL) \ $(ARTIFACTDIR)/docs/html \ $(ARTIFACTDIR)/bash_completion \ - $(ARTIFACTDIR)/go_version.txt \ + $(ARTIFACTDIR)/go_env.txt \ dist \ config/samples - -release: $(RELEASE_BINS) $(RELEASE_NOARCH) rm -rf "$(ARTIFACTDIR)/release" mkdir -p "$(ARTIFACTDIR)/release" - cp $^ "$(ARTIFACTDIR)/release" + cp -l $(ARTIFACTDIR)/zrepl-* \ + $(ARTIFACTDIR)/platformtest-* \ + "$(ARTIFACTDIR)/release" cd "$(ARTIFACTDIR)/release" && sha512sum $$(ls | sort) > sha512sum.txt + +check-git-clean: @# note that we use ZREPL_VERSION and not _ZREPL_VERSION because we want to detect the override @if git describe --always --dirty 2>/dev/null | grep dirty >/dev/null; then \ echo '[INFO] either git reports checkout is dirty or git is not installed or this is not a git checkout'; \ @@ -120,5 +81,80 @@ release: $(RELEASE_BINS) $(RELEASE_NOARCH) fi; \ fi; +sign: + gpg -u "89BC 5D89 C845 568B F578 B306 CDBD 8EC8 E27C A5FC" \ + --armor \ + --detach-sign $(ARTIFACTDIR)/release/sha512sum.txt + clean: docs-clean rm -rf "$(ARTIFACTDIR)" + +##################### BINARIES ##################### +.PHONY: bins-all lint test vet zrepl-bin platformtest-bin + +BINS_ALL_TARGETS := zrepl-bin platformtest-bin vet lint +bins-all: + $(MAKE) $(BINS_ALL_TARGETS) GOOS=freebsd GOARCH=amd64 + $(MAKE) $(BINS_ALL_TARGETS) GOOS=freebsd GOARCH=386 + $(MAKE) $(BINS_ALL_TARGETS) GOOS=linux GOARCH=amd64 + $(MAKE) $(BINS_ALL_TARGETS) GOOS=linux GOARCH=arm64 + $(MAKE) $(BINS_ALL_TARGETS) GOOS=linux GOARCH=386 + $(MAKE) $(BINS_ALL_TARGETS) GOOS=darwin GOARCH=amd64 + +lint: + $(GO_ENV_VARS) $(GOLANGCI_LINT) run ./... +test: + $(GO_ENV_VARS) $(GO) test $(GO_BUILDFLAGS) ./... +vet: + $(GO_ENV_VARS) $(GO) vet $(GO_BUILDFLAGS) ./... + +zrepl-bin: + $(GO_BUILD) -o "$(ARTIFACTDIR)/zrepl-$(GOOS)-$(GOARCH)" + +platformtest-bin: + $(GO_BUILD) -o "$(ARTIFACTDIR)/platformtest-$(GOOS)-$(GOARCH)" ./platformtest/harness + +##################### DEV TARGETS ##################### +# not part of the build, must do that manually +.PHONY: generate format platformtest + +generate: + protoc -I=replication/logic/pdu --go_out=plugins=grpc:replication/logic/pdu replication/logic/pdu/pdu.proto + $(GO_ENV_VARS) $(GO) generate $(GO_BUILDFLAGS) -x ./... + +format: + goimports -srcdir . -local 'github.com/zrepl/zrepl' -w $(shell find . -type f -name '*.go' -not -path "./vendor/*" -not -name '*.pb.go' -not -name '*_enumer.go') + +ZREPL_PLATFORMTEST_POOLNAME := zreplplatformtest +ZREPL_PLATFORMTEST_IMAGEPATH := /tmp/zreplplatformtest.pool.img +platformtest: # do not track dependency on platformtest-bin to allow build of platformtest outside of test VM + "$(ARTIFACTDIR)/platformtest-$(GOOS)-$(GOARCH)" -poolname "$(ZREPL_PLATFORMTEST_POOLNAME)" -imagepath "$(ZREPL_PLATFORMTEST_IMAGEPATH)" + +##################### NOARCH ##################### +.PHONY: noarch $(ARTIFACTDIR)/bash_completion $(ARTIFACTDIR)/go_env.txt docs docs-clean + + +$(ARTIFACTDIR): + mkdir -p "$@" +$(ARTIFACTDIR)/docs: $(ARTIFACTDIR) + mkdir -p "$@" + +noarch: $(ARTIFACTDIR)/bash_completion $(ARTIFACTDIR)/go_env.txt docs + # pass + +$(ARTIFACTDIR)/bash_completion: + $(MAKE) zrepl-bin GOOS=$(GOHOSTOS) GOARCH=$(GOHOSTARCH) + artifacts/zrepl-$(GOHOSTOS)-$(GOHOSTARCH) bashcomp "$@" + +$(ARTIFACTDIR)/go_env.txt: + $(GO_ENV_VARS) $(GO) env > $@ + +docs: $(ARTIFACTDIR)/docs + make -C docs \ + html \ + BUILDDIR=../artifacts/docs \ + +docs-clean: + make -C docs \ + clean \ + BUILDDIR=../artifacts/docs