Files
kopia/tools/tools.mk
Jarek Kowalski 8b2b91f9f9 content: fixed repo upgrade version (#1286)
* content: fixed repo upgrade version

Previously upgrade would enable epoch manager and index v2 but would
not set the version of the format itself. Everything worked fine
but it would not protect from old kopia opening the repository.

* ci: added compatibility test that uses real 0.8 and current binaries
2021-09-10 22:51:51 -07:00

277 lines
8.0 KiB
Makefile

# to build on Windows you need the following basic Unix tools in your PATH installed using Chocolatey
#
# make
# unzip
# curl
#
# you will need to have git and golang too in the PATH.
# windows,linux,darwin
GOOS:=$(shell go env GOOS)
# amd64,arm64,arm
GOARCH:=$(shell go env GOARCH)
# uname will be Windows, Darwin, Linux
ifeq ($(GOOS),windows)
exe_suffix := .exe
cmd_suffix := .cmd
uname := Windows
slash=\\
path_separator=;
date_ymd := $(shell powershell -noprofile -executionpolicy bypass -Command "(Get-Date).ToString('yyyyMMdd')")
date_full := $(shell powershell -noprofile -executionpolicy bypass -Command "(Get-Date).datetime")
raw_arch:=$(GOARCH)
hostname:=$(COMPUTERNAME)
ifeq ($(UNIX_SHELL_ON_WINDOWS),true)
mkdir=mkdir -p
move=mv
slash=/
else
mkdir=md
move=move
endif
else
uname := $(shell uname -s)
exe_suffix :=
cmd_suffix :=
slash=/
path_separator=:
mkdir=mkdir -p
date_ymd := $(shell date +%Y%m%d)
date_full := $(shell date)
raw_arch:=$(shell uname -m)
hostname:=$(shell hostname)
endif
ifneq ($(GITHUB_ACTIONS),)
# running on GitHub actions.
ifeq ($(GITHUB_HEAD_REF),)
export IS_PULL_REQUEST=false
else
export IS_PULL_REQUEST=true
endif
# try parsing tag name out of GITHUB_REF
gh_tag_tmp=$(GITHUB_REF:refs/tags/%=%)
ifneq ($(gh_tag_tmp),$(GITHUB_REF))
export CI_TAG=$(gh_tag_tmp)
endif
endif
# detect REPO_OWNER, e.g. 'kopia' for official builds
export REPO_OWNER=unknown-repo-owner
ifneq ($(GITHUB_REPOSITORY),)
export REPO_OWNER=$(GITHUB_REPOSITORY:%/kopia=%)
endif
# e.g. 2021-02-19 06:56:21 -0800
git_commit_date:=$(shell git show -s --format=%ci HEAD)
# compute build date and time from the current commit as yyyyMMdd
commit_date_ymd:=$(subst -,,$(word 1, $(git_commit_date)))
# compute time of day as a decimal number, without leading zeroes
# midnight will be 0
# 00:01:00 becomes 100
# 00:10:00 becomes 1000
# 07:00:00 becomes 70000
# end of day is 235959
# time of day as hhmmss from 000000 to 235969
commit_time_raw:=$(subst :,,$(word 2, $(git_commit_date)))
commit_time_stripped1=$(commit_time_raw:0%=%)
commit_time_stripped2=$(commit_time_stripped1:0%=%)
commit_time_stripped3=$(commit_time_stripped2:0%=%)
commit_time_stripped4=$(commit_time_stripped3:0%=%)
# final time of day number
commit_time_of_day=$(commit_time_stripped4:0%=%)
SELF_DIR := $(subst /,$(slash),$(realpath $(dir $(lastword $(MAKEFILE_LIST)))))
TOOLS_DIR:=$(SELF_DIR)$(slash).tools
retry:=$(SELF_DIR)/retry.sh
# tool versions
GOLANGCI_LINT_VERSION=1.42.0
NODE_VERSION=14.17.6
HUGO_VERSION=0.87.0
GOTESTSUM_VERSION=1.7.0
GORELEASER_VERSION=v0.176.0
RCLONE_VERSION=1.56.0
# nodejs / npm
node_base_dir=$(TOOLS_DIR)$(slash)node-$(NODE_VERSION)
ifeq ($(GOOS),windows)
node_dir=$(node_base_dir)
else
node_dir=$(node_base_dir)$(slash)bin
endif
npm=$(node_dir)$(slash)npm$(cmd_suffix)
npm_flags=--scripts-prepend-node-path=auto
# put NPM in the path
PATH:=$(node_dir)$(path_separator)$(PATH)
ifeq ($(GOOS),$(filter $(GOOS),openbsd freebsd))
npm=/usr/local/bin/npm
endif
$(npm):
ifeq ($(GOOS),openbsd)
@echo Use pkg_add to install node
@exit 1
else ifeq ($(GOOS),freebsd)
@echo Use pkg to install npm
@exit 1
else
go run github.com/kopia/kopia/tools/gettool -tool node:$(NODE_VERSION) --output-dir $(node_base_dir)
endif
# linter
linter_dir=$(TOOLS_DIR)$(slash)golangci-lint-$(GOLANGCI_LINT_VERSION)
linter=$(linter_dir)$(slash)golangci-lint$(exe_suffix)
linter_flags=
ifeq ($(GOOS),windows)
linter_flags=-D gofmt -D goimports
endif
$(linter):
go run github.com/kopia/kopia/tools/gettool --tool linter:$(GOLANGCI_LINT_VERSION) --output-dir $(linter_dir)
# hugo
hugo_dir=$(TOOLS_DIR)$(slash)hugo-$(GOTESTSUM_VERSION)
hugo=$(hugo_dir)/hugo$(exe_suffix)
$(hugo):
go run github.com/kopia/kopia/tools/gettool --tool hugo:$(HUGO_VERSION) --output-dir $(hugo_dir)
# rclone
rclone_dir=$(TOOLS_DIR)$(slash)rclone-$(RCLONE_VERSION)
rclone=$(rclone_dir)$(slash)rclone$(exe_suffix)
$(rclone):
go run github.com/kopia/kopia/tools/gettool --tool rclone:$(RCLONE_VERSION) --output-dir $(rclone_dir)
# gotestsum
gotestsum_dir=$(TOOLS_DIR)$(slash)gotestsum-$(GOTESTSUM_VERSION)
gotestsum=$(gotestsum_dir)$(slash)gotestsum$(exe_suffix)
$(gotestsum):
go run github.com/kopia/kopia/tools/gettool --tool gotestsum:$(GOTESTSUM_VERSION) --output-dir $(gotestsum_dir)
# kopia 0.8 for backwards compat testing
kopia08_version=0.8.4
kopia08_dir=$(TOOLS_DIR)$(slash)kopia-$(kopia08_version)
kopia08=$(kopia08_dir)$(slash)kopia$(exe_suffix)
$(kopia08):
go run github.com/kopia/kopia/tools/gettool --tool kopia:$(kopia08_version) --output-dir $(kopia08_dir)
MINIO_MC_PATH=$(TOOLS_DIR)/bin/mc$(exe_suffix)
$(MINIO_MC_PATH):
GOBIN=$(TOOLS_DIR)/bin go install github.com/minio/mc@latest
export MINIO_MC_PATH
wwhrd=$(TOOLS_DIR)/bin/wwhrd$(exe_suffix)
$(wwhrd):
GOBIN=$(TOOLS_DIR)/bin go install github.com/frapposelli/wwhrd@latest
# goreleaser
goreleaser_dir=$(TOOLS_DIR)$(slash)goreleaser-$(GORELEASER_VERSION)
goreleaser=$(goreleaser_dir)$(slash)goreleaser$(exe_suffix)
$(goreleaser):
go run github.com/kopia/kopia/tools/gettool --tool goreleaser:$(GORELEASER_VERSION) --output-dir $(goreleaser_dir)
ifeq ($(IS_PULL_REQUEST),false)
ifneq ($(CI_TAG),)
# CI, tagged release
KOPIA_VERSION:=$(CI_TAG)
else
# CI, non-tagged release
KOPIA_VERSION:=v$(commit_date_ymd).0.$(commit_time_of_day)
endif
else
# non-CI, or CI in PR mode
KOPIA_VERSION:=v$(date_ymd).0.0-$(shell git rev-parse --short HEAD)
endif
export KOPIA_VERSION_NO_PREFIX=$(KOPIA_VERSION:v%=%)
# embedded in the HTML pages
export REACT_APP_SHORT_VERSION_INFO:=$(KOPIA_VERSION)
export REACT_APP_FULL_VERSION_INFO:=$(KOPIA_VERSION) built on $(date_full) $(hostname)
KOPIA_BUILD_TAGS=embedhtml
KOPIA_BUILD_FLAGS=-ldflags "-s -w -X github.com/kopia/kopia/repo.BuildVersion=$(KOPIA_VERSION_NO_PREFIX) -X github.com/kopia/kopia/repo.BuildInfo=$(shell git rev-parse HEAD) -X github.com/kopia/kopia/repo.BuildGitHubRepo=$(GITHUB_REPOSITORY)"
clean-tools:
rm -rf $(TOOLS_DIR)
windows_signing_dir=$(TOOLS_DIR)$(slash)win_signing
# name of the temporary keychain to import signing keys into (will be deleted and re-created by 'signing-tools' target)
MACOS_KEYCHAIN=kopia-build.keychain
export CSC_KEYCHAIN:=$(MACOS_KEYCHAIN)
export CSC_NAME:=$(MACOS_SIGNING_IDENTITY)
windows-signing-tools:
ifeq ($(GOOS)/$(CI),windows/true)
ifneq ($(WINDOWS_SIGNING_TOOLS_URL),)
echo Installing Windows signing tools to $(windows_signing_dir)...
-$(mkdir) $(windows_signing_dir)
curl -LsS -o $(windows_signing_dir).zip $(WINDOWS_SIGNING_TOOLS_URL)
unzip -a -q $(windows_signing_dir).zip -d $(windows_signing_dir)
pwsh -noprofile -executionpolicy bypass $(windows_signing_dir)\\setup.ps1
else
@echo Not installing Windows signing tools because WINDOWS_SIGNING_TOOLS_URL is not set
endif
endif
# create and unlock a keychain with random strong password and import macOS signing certificate from .p12.
ifeq ($(GOOS)/$(CI),darwin/true)
macos-certificates: KEYCHAIN_PASSWORD:=$(shell uuidgen)
endif
macos-certificates:
ifneq ($(CSC_LINK),)
@rm -fv $(HOME)/Library/Keychains/$(MACOS_KEYCHAIN)-db
@echo "$(CSC_LINK)" | base64 -d > /tmp/certs.p12
@security create-keychain -p $(KEYCHAIN_PASSWORD) $(MACOS_KEYCHAIN)
@security unlock-keychain -p $(KEYCHAIN_PASSWORD) $(MACOS_KEYCHAIN)
@security list-keychain -s $(MACOS_KEYCHAIN) login.keychain
@security import /tmp/certs.p12 -k $(MACOS_KEYCHAIN) -P $(CSC_KEY_PASSWORD) -T /usr/bin/codesign;
@security set-keychain-settings -u $(MACOS_KEYCHAIN)
@rm -f /tmp/certs.p12
@security set-key-partition-list -S apple: -s -k $(KEYCHAIN_PASSWORD) $(MACOS_KEYCHAIN) > /dev/null
else
@echo Not installing macOS certificates because CSC_LINK is not set.
endif
# disable some tools on non-default architectures
ifeq ($(GOARCH),amd64)
maybehugo=$(hugo)
else
maybehugo=
endif
verify-all-tool-checksums:
go run github.com/kopia/kopia/tools/gettool --test-all \
--output-dir /tmp/all-tools \
--tool node:$(NODE_VERSION),linter:$(GOLANGCI_LINT_VERSION),hugo:$(HUGO_VERSION),rclone:$(RCLONE_VERSION),gotestsum:$(GOTESTSUM_VERSION),goreleaser:$(GORELEASER_VERSION),kopia:0.8.4
all-tools: $(gotestsum) $(npm) $(linter) $(maybehugo)