diff options
-rw-r--r-- | .cirrus.yml | 3 | ||||
-rw-r--r-- | .gitignore | 6 | ||||
-rw-r--r-- | Makefile | 655 | ||||
-rwxr-xr-x | contrib/cirrus/pr-should-include-tests | 3 | ||||
-rwxr-xr-x | contrib/cirrus/runner.sh | 5 | ||||
-rw-r--r-- | contrib/msi/podman.wxs | 2 | ||||
-rwxr-xr-x | docs/remote-docs.sh | 12 | ||||
-rwxr-xr-x | hack/get_release_info.sh | 18 |
8 files changed, 424 insertions, 280 deletions
diff --git a/.cirrus.yml b/.cirrus.yml index 194bcae52..f044b98ab 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -366,8 +366,7 @@ osx_alt_build_task: script: - brew install go - brew install go-md2man - - make podman-remote-darwin - - make install-podman-remote-darwin-docs + - make podman-remote-release-darwin.zip always: *binary_artifacts diff --git a/.gitignore b/.gitignore index 6a5ae509c..0a3caf8ca 100644 --- a/.gitignore +++ b/.gitignore @@ -17,10 +17,12 @@ coverprofile *.o *.orig /_output/ +/podman_tmp_* /pause/pause.o pkg/api/swagger.yaml -podman-remote*.zip -podman*.tar.gz +/podman-remote*.zip +/podman*.tar.gz +/podman-*.msi __pycache__ release.txt .ropeproject @@ -1,3 +1,25 @@ +### +### Makefile Navigation +### +# +# This file is organized based on approximate end-to-end workflow: +# +# 1. Variables and common definitions are located at the top +# to make finding them quicker. +# 2. Main entry-point targets, like "default", "all", and "help" +# 3. Targets for code formatting and validation +# 4. Primary build targets, like podman and podman-remote +# 5. Secondary build targets, shell completions, static and multi-arch. +# 6. Targets that format and build documentation +# 7. Testing targets +# 8. Release and package-building targets +# 9. Targets that install tools, utilities, binaries and packages +# 10. Uninstall / Cleanup targets +# +### +### Variables & Definitions +### + export GOPROXY=https://proxy.golang.org GO ?= go @@ -47,6 +69,10 @@ BUILDTAGS_CROSS ?= containers_image_openpgp exclude_graphdriver_btrfs exclude_gr CONTAINER_RUNTIME := $(shell command -v podman 2> /dev/null || echo docker) OCI_RUNTIME ?= "" +MANPAGES_MD ?= $(wildcard docs/source/markdown/*.md pkg/*/docs/*.md) +MANPAGES ?= $(MANPAGES_MD:%.md=%) +MANPAGES_DEST ?= $(subst markdown,man, $(subst source,build,$(MANPAGES))) + BASHINSTALLDIR=${PREFIX}/share/bash-completion/completions ZSHINSTALLDIR=${PREFIX}/share/zsh/site-functions FISHINSTALLDIR=${PREFIX}/share/fish/vendor_completions.d @@ -64,8 +90,8 @@ else ISODATE ?= $(shell date --iso-8601) endif LIBPOD := ${PROJECT}/v3/libpod -GCFLAGS ?= all=-trimpath=${PWD} -ASMFLAGS ?= all=-trimpath=${PWD} +GCFLAGS ?= all=-trimpath=$(CURDIR) +ASMFLAGS ?= all=-trimpath=$(CURDIR) LDFLAGS_PODMAN ?= \ -X $(LIBPOD)/define.gitCommit=$(GIT_COMMIT) \ -X $(LIBPOD)/define.buildInfo=$(BUILD_INFO) \ @@ -118,38 +144,62 @@ CROSS_BUILD_TARGETS := \ bin/podman.cross.linux.mips64 \ bin/podman.cross.linux.mips64le -.PHONY: all -all: binaries docs - -.PHONY: default -default: help - -define PRINT_HELP_PYSCRIPT -import re, sys - -print("Usage: make <target>") -cmds = {} -for line in sys.stdin: - match = re.match(r'^([a-zA-Z_-]+):.*?## (.*)$$', line) - if match: - target, help = match.groups() - cmds.update({target: help}) -for cmd in sorted(cmds): - print(" * '%s' - %s" % (cmd, cmds[cmd])) -endef -export PRINT_HELP_PYSCRIPT - # Dereference variable $(1), return value if non-empty, otherwise raise an error. err_if_empty = $(if $(strip $($(1))),$(strip $($(1))),$(error Required variable $(1) value is undefined, whitespace, or empty)) -.PHONY: help -ifneq (, ${PYTHON}) -help: - @$(PYTHON) -c "$$PRINT_HELP_PYSCRIPT" < $(MAKEFILE_LIST) +# Podman does not work w/o CGO_ENABLED, except in some very specific cases +CGO_ENABLED ?= 1 +# Default to the native OS type and archetecture unless otherwise specified +GOOS ?= $(shell $(GO) env GOOS) +ifeq ($(call err_if_empty,GOOS),windows) +BINSFX := .exe +SRCBINDIR := bin/windows +else ifeq ($(GOOS),darwin) +BINSFX := +SRCBINDIR := bin/darwin else -help: - $(error python required for 'make help', executable not found) +BINSFX := -remote +SRCBINDIR := bin endif +# Necessary for nested-$(MAKE) calls and docs/remote-docs.sh +export GOOS CGO_ENABLED BINSFX SRCBINDIR + +define go-get + env GO111MODULE=off \ + $(GO) get -u ${1} +endef + +### +### Primary entry-point targets +### + +.PHONY: default +default: all + +.PHONY: all +all: binaries docs + +.PHONY: binaries +binaries: podman podman-remote ## Build podman and podman-remote binaries + +# Extract text following double-# for targets, as their description for +# the `help` target. Otherwise These simple-substitutions are resolved +# at reference-time (due to `=` and not `=:`). +_HLP_TGTS_RX = '^[[:print:]]+:.*?\#\# .*$$' +_HLP_TGTS_CMD = grep -E $(_HLP_TGTS_RX) $(MAKEFILE_LIST) +_HLP_TGTS_LEN = $(shell $(_HLP_TGTS_CMD) | cut -d : -f 1 | wc -L) +_HLPFMT = "%-$(_HLP_TGTS_LEN)s %s\n" +.PHONY: help +help: ## (Default) Print listing of key targets with their descriptions + @printf $(_HLPFMT) "Target:" "Description:" + @printf $(_HLPFMT) "--------------" "--------------------" + @$(_HLP_TGTS_CMD) | sort | \ + awk 'BEGIN {FS = ":(.*)?## "}; \ + {printf $(_HLPFMT), $$1, $$2}' + +### +### Linting/Formatting/Code Validation targets +### .gopathok: ifeq ("$(wildcard $(GOPKGDIR))","") @@ -158,6 +208,11 @@ ifeq ("$(wildcard $(GOPKGDIR))","") endif touch $@ +.PHONY: .gitvalidation +.gitvalidation: .gopathok + @echo "Validating vs commit '$(call err_if_empty,EPOCH_TEST_COMMIT)'" + GIT_CHECK_EXCLUDE="./vendor:docs/make.bat" $(GOBIN)/git-validation -run DCO,short-subject,dangling-whitespace -range $(EPOCH_TEST_COMMIT)..$(HEAD) + .PHONY: lint lint: golangci-lint @echo "Linting vs commit '$(call err_if_empty,EPOCH_TEST_COMMIT)'" @@ -198,46 +253,134 @@ volume-plugin-test-img: test/goecho/goecho: .gopathok $(wildcard test/goecho/*.go) $(GO) build $(BUILDFLAGS) -ldflags '$(LDFLAGS_PODMAN)' -o $@ ./test/goecho +.PHONY: codespell +codespell: + codespell -S bin,vendor,.git,go.sum,changelog.txt,.cirrus.yml,"RELEASE_NOTES.md,*.xz,*.gz,*.tar,*.tgz,bin2img,*ico,*.png,*.1,*.5,copyimg,*.orig,apidoc.go" -L uint,iff,od,seeked,splitted,marge,ERRO,hist -w + +.PHONY: validate +validate: gofmt lint .gitvalidation validate.completions man-page-check swagger-check tests-included + +.PHONY: build-all-new-commits +build-all-new-commits: + # Validate that all the commits build on top of $(GIT_BASE_BRANCH) + git rebase $(GIT_BASE_BRANCH) -x make + +.PHONY: vendor +vendor: + GO111MODULE=on $(GO) mod tidy + GO111MODULE=on $(GO) mod vendor + GO111MODULE=on $(GO) mod verify + +.PHONY: vendor-in-container +vendor-in-container: + podman run --privileged --rm --env HOME=/root \ + -v $(CURDIR):/src -w /src \ + docker.io/library/golang:1.16 \ + make vendor + +### +### Primary binary-build targets +### -bin/podman: .gopathok $(SOURCES) go.mod go.sum ## Build with podman # Make sure to warn in case we're building without the systemd buildtag. +bin/podman: .gopathok $(SOURCES) go.mod go.sum ifeq (,$(findstring systemd,$(BUILDTAGS))) - @echo "Podman is being compiled without the systemd build tag. Install libsystemd on \ - Ubuntu or systemd-devel on rpm based distro for journald support." + @echo "Podman is being compiled without the systemd build tag. \ + Install libsystemd on Ubuntu or systemd-devel on rpm based \ + distro for journald support." endif - $(GO) build $(BUILDFLAGS) -gcflags '$(GCFLAGS)' -asmflags '$(ASMFLAGS)' -ldflags '$(LDFLAGS_PODMAN)' -tags "$(BUILDTAGS)" -o $@ ./cmd/podman + CGO_ENABLED=$(CGO_ENABLED) \ + $(GO) build \ + $(BUILDFLAGS) \ + -gcflags '$(GCFLAGS)' \ + -asmflags '$(ASMFLAGS)' \ + -ldflags '$(LDFLAGS_PODMAN)' \ + -tags "$(BUILDTAGS)" \ + -o $@ ./cmd/podman + +# Disambiguate Linux vs Darwin/Windows platform binaries under distinct "bin" dirs +$(SRCBINDIR): + mkdir -p $(SRCBINDIR) + +$(SRCBINDIR)/podman$(BINSFX): $(SRCBINDIR) .gopathok $(SOURCES) go.mod go.sum + CGO_ENABLED=$(CGO_ENABLED) \ + GOOS=$(GOOS) \ + $(GO) build \ + $(BUILDFLAGS) \ + -gcflags '$(GCFLAGS)' \ + -asmflags '$(ASMFLAGS)' \ + -ldflags '$(LDFLAGS_PODMAN)' \ + -tags "${REMOTETAGS}" \ + -o $@ ./cmd/podman + +$(SRCBINDIR)/podman-remote-static: $(SRCBINDIR) .gopathok $(SOURCES) go.mod go.sum + CGO_ENABLED=$(CGO_ENABLED) \ + GOOS=$(GOOS) \ + $(GO) build \ + $(BUILDFLAGS) \ + -gcflags '$(GCFLAGS)' \ + -asmflags '$(ASMFLAGS)' \ + -ldflags '$(LDFLAGS_PODMAN_STATIC)' \ + -tags "${REMOTETAGS}" \ + -o $@ ./cmd/podman .PHONY: podman podman: bin/podman -bin/podman-remote: .gopathok $(SOURCES) go.mod go.sum ## Build with podman on remote environment - $(GO) build $(BUILDFLAGS) -gcflags '$(GCFLAGS)' -asmflags '$(ASMFLAGS)' -ldflags '$(LDFLAGS_PODMAN)' -tags "${REMOTETAGS}" -o $@ ./cmd/podman - -.PHONY: bin/podman-remote-static -podman-remote-static: bin/podman-remote-static - CGO_ENABLED=0 $(GO) build $(BUILDFLAGS) -gcflags '$(GCFLAGS)' -asmflags '$(ASMFLAGS)' -ldflags '$(LDFLAGS_PODMAN_STATIC)' -tags "${REMOTETAGS}" -o bin/podman-remote-static ./cmd/podman - .PHONY: podman-remote -podman-remote: bin/podman-remote - -.PHONY: podman.msi -podman.msi: podman-remote podman-remote-windows install-podman-remote-windows-docs ## Will always rebuild exe as there is no podman-remote-windows.exe target to verify timestamp - $(eval DOCFILE := docs/build/remote/windows) - find $(DOCFILE) -print \ - |wixl-heat --var var.ManSourceDir --component-group ManFiles --directory-ref INSTALLDIR --prefix $(DOCFILE)/ >$(DOCFILE)/pages.wsx - wixl -D VERSION=$(RELEASE_NUMBER) -D ManSourceDir=$(DOCFILE) -o podman-v$(RELEASE_NUMBER).msi contrib/msi/podman.wxs $(DOCFILE)/pages.wsx - -podman-remote-%: .gopathok ## Build podman for a specific GOOS - $(eval BINSFX := $(shell test "$*" != "windows" || echo ".exe")) - CGO_ENABLED=0 GOOS=$* $(GO) build $(BUILDFLAGS) -gcflags '$(GCFLAGS)' -asmflags '$(ASMFLAGS)' -ldflags '$(LDFLAGS_PODMAN)' -tags "${REMOTETAGS}" -o bin/$@$(BINSFX) ./cmd/podman +podman-remote: $(SRCBINDIR) $(SRCBINDIR)/podman$(BINSFX) ## Build podman-remote binary + +# A wildcard podman-remote-% target incorrectly sets GOOS for release targets +.PHONY: podman-remote-linux +podman-remote-linux: ## Build podman-remote for Linux + $(MAKE) \ + CGO_ENABLED=0 \ + GOOS=linux \ + bin/podman-remote + +PHONY: podman-remote-static +podman-remote-static: $(SRCBINDIR)/podman-remote-static + +.PHONY: podman-remote-windows +podman-remote-windows: ## Build podman-remote for Windows + $(MAKE) \ + CGO_ENABLED=0 \ + GOOS=windows \ + bin/windows/podman.exe + +.PHONY: podman-remote-darwin +podman-remote-darwin: ## Build podman-remote for MacOS + $(MAKE) \ + CGO_ENABLED=0 \ + GOOS=darwin \ + bin/darwin/podman + +### +### Secondary binary-build targets +### -local-cross: $(CROSS_BUILD_TARGETS) ## Cross local compilation +.PHONY: generate-bindings +generate-bindings: +ifneq ($(GOOS),darwin) + GO111MODULE=off $(GO) generate ./pkg/bindings/... ; +endif +# DO NOT USE: use local-cross instead bin/podman.cross.%: .gopathok TARGET="$*"; \ - GOOS="$${TARGET%%.*}" \ - GOARCH="$${TARGET##*.}" \ - CGO_ENABLED=0 $(GO) build $(BUILDFLAGS) -gcflags '$(GCFLAGS)' -asmflags '$(ASMFLAGS)' -ldflags '$(LDFLAGS_PODMAN)' -tags '$(BUILDTAGS_CROSS)' -o "$@" ./cmd/podman + GOOS="$${TARGET%%.*}"; \ + GOARCH="$${TARGET##*.}"; \ + CGO_ENABLED=0 \ + $(GO) build \ + $(BUILDFLAGS) \ + -gcflags '$(GCFLAGS)' \ + -asmflags '$(ASMFLAGS)' \ + -ldflags '$(LDFLAGS_PODMAN)' \ + -tags '$(BUILDTAGS_CROSS)' \ + -o "$@" ./cmd/podman + +.PHONY: local-cross +local-cross: $(CROSS_BUILD_TARGETS) ## Cross compile podman binary for multiple architectures # Update nix/nixpkgs.json its latest stable commit .PHONY: nixpkgs @@ -255,37 +398,100 @@ static: mkdir -p ./bin cp -rfp ./result/bin/* ./bin/ -.PHONY: run-docker-py-tests -run-docker-py-tests: - $(eval testLogs=$(shell mktemp)) - ./bin/podman run --rm --security-opt label=disable --privileged -v $(testLogs):/testLogs --net=host -e DOCKER_HOST=tcp://localhost:8080 $(DOCKERPY_IMAGE) sh -c "pytest $(DOCKERPY_TEST) " +.PHONY: build-no-cgo +build-no-cgo: + BUILDTAGS="containers_image_openpgp exclude_graphdriver_btrfs \ + exclude_graphdriver_devicemapper exclude_disk_quota" \ + CGO_ENABLED=0 \ + $(MAKE) all -pkg/api/swagger.yaml: .gopathok release.txt +.PHONY: completions +completions: podman podman-remote + # key = shell, value = completion filename + declare -A outfiles=([bash]=%s [zsh]=_%s [fish]=%s.fish [powershell]=%s.ps1);\ + for shell in $${!outfiles[*]}; do \ + for remote in "" "-remote"; do \ + podman="podman$$remote"; \ + outfile=$$(printf "completions/$$shell/$${outfiles[$$shell]}" $$podman); \ + ./bin/$$podman completion $$shell >| $$outfile; \ + done;\ + done + +### +### Documentation targets +### + +pkg/api/swagger.yaml: .gopathok make -C pkg/api +$(MANPAGES): %: %.md .install.md2man docdir + @sed -e 's/\((podman.*\.md)\)//' -e 's/\[\(podman.*\)\]/\1/' \ + -e 's;<\(/\)\?\(a[^>]*\|sup\)>;;g' $< | \ + $(GOMD2MAN) -in /dev/stdin -out $(subst source/markdown,build/man,$@) + +.PHONY: docdir +docdir: + mkdir -p docs/build/man + +.PHONY: docs +docs: $(MANPAGES) ## Generate documentation + +# docs/remote-docs.sh requires a locally executable 'podman-remote' binary +# in addition to the target-archetecture binary (if any). +install-podman-remote-%-docs: podman-remote-$(shell env -i HOME=$$HOME PATH=$$PATH go env GOOS) docs $(MANPAGES) + rm -rf docs/build/remote + mkdir -p docs/build/remote + ln -sf $(CURDIR)/docs/source/markdown/links docs/build/man/ + docs/remote-docs.sh \ + $* \ + docs/build/remote/$* \ + $(if $(findstring windows,$*),docs/source/markdown,docs/build/man) + +.PHONY: man-page-check +man-page-check: bin/podman + hack/man-page-checker + hack/xref-helpmsgs-manpages + +.PHONY: swagger-check +swagger-check: + hack/swagger-check + .PHONY: swagger swagger: pkg/api/swagger.yaml -.PHONY: clean -clean: ## Clean artifacts - rm -rf \ - .gopathok \ - _output \ - release.txt \ - $(wildcard podman-remote*.zip) \ - $(wildcard podman*.tar.gz) \ - bin \ - build \ - test/checkseccomp/checkseccomp \ - test/goecho/goecho \ - test/testdata/redis-image \ - libpod/container_ffjson.go \ - libpod/pod_ffjson.go \ - libpod/container_easyjson.go \ - libpod/pod_easyjson.go \ - .install.goimports \ - docs/build - make -C docs clean +.PHONY: docker-docs +docker-docs: docs + (cd docs; ./dckrman.sh ./build/man/*.1) + +.PHONY: changelog +changelog: ## Generate updated changelog.txt from git logs + @echo "Creating changelog from $(CHANGELOG_BASE) to $(CHANGELOG_TARGET)" + $(eval TMPFILE := $(shell mktemp podman_tmp_XXXX)) + $(shell cat changelog.txt > $(TMPFILE)) + $(shell echo "- Changelog for $(CHANGELOG_TARGET) ($(ISODATE)):" > changelog.txt) + $(shell git log --no-merges --format=" * %s" $(CHANGELOG_BASE)..$(CHANGELOG_TARGET) >> changelog.txt) + $(shell echo "" >> changelog.txt) + $(shell cat $(TMPFILE) >> changelog.txt) + $(shell rm $(TMPFILE)) + +# Workaround vim syntax highlighting bug: " + +### +### Utility and Testing targets +### + +.PHONY: validate.completions +validate.completions: SHELL:=/usr/bin/env bash # Set shell to bash for this target +validate.completions: + # Check if the files can be loaded by the shell + . completions/bash/podman + if [ -x /bin/zsh ]; then /bin/zsh completions/zsh/_podman; fi + if [ -x /bin/fish ]; then /bin/fish completions/fish/podman.fish; fi + +.PHONY: run-docker-py-tests +run-docker-py-tests: + $(eval testLogs=$(shell mktemp podman_tmp_XXXX)) + ./bin/podman run --rm --security-opt label=disable --privileged -v $(testLogs):/testLogs --net=host -e DOCKER_HOST=tcp://localhost:8080 $(DOCKERPY_IMAGE) sh -c "pytest $(DOCKERPY_TEST) " .PHONY: localunit localunit: test/goecho/goecho @@ -330,7 +536,7 @@ remoteintegration: test-binaries ginkgo-remote localsystem: # Wipe existing config, database, and cache: start with clean slate. $(RM) -rf ${HOME}/.local/share/containers ${HOME}/.config/containers - if timeout -v 1 true; then PODMAN=$(shell pwd)/bin/podman bats test/system/; else echo "Skipping $@: 'timeout -v' unavailable'"; fi + if timeout -v 1 true; then PODMAN=$(CURDIR)/bin/podman bats test/system/; else echo "Skipping $@: 'timeout -v' unavailable'"; fi .PHONY: remotesystem remotesystem: @@ -341,7 +547,7 @@ remotesystem: # podman server spews copious unhelpful output; ignore it. rc=0;\ if timeout -v 1 true; then \ - SOCK_FILE=$(shell mktemp --dry-run --tmpdir podman.XXXXXX);\ + SOCK_FILE=$(shell mktemp --dry-run --tmpdir podman_tmp_XXXX);\ export PODMAN_SOCKET=unix:$$SOCK_FILE; \ ./bin/podman system service --timeout=0 $$PODMAN_SOCKET > $(if $(PODMAN_SERVER_LOG),$(PODMAN_SERVER_LOG),/dev/null) 2>&1 & \ retry=5;\ @@ -355,7 +561,7 @@ remotesystem: echo "Error: ./bin/podman system service did not come up on $$SOCK_FILE" >&2;\ exit 1;\ fi;\ - env PODMAN="$(shell pwd)/bin/podman-remote --url $$PODMAN_SOCKET" bats test/system/ ;\ + env PODMAN="$(CURDIR)/bin/podman-remote --url $$PODMAN_SOCKET" bats test/system/ ;\ rc=$$?;\ kill %1;\ rm -f $$SOCK_FILE;\ @@ -378,130 +584,88 @@ remoteapiv2: system.test-binary: .install.ginkgo $(GO) test -c ./test/system -.PHONY: binaries -binaries: podman podman-remote ## Build podman - -.PHONY: install.catatonit -install.catatonit: - ./hack/install_catatonit.sh - .PHONY: test-binaries test-binaries: test/checkseccomp/checkseccomp test/goecho/goecho install.catatonit -MANPAGES_MD ?= $(wildcard docs/source/markdown/*.md pkg/*/docs/*.md) -MANPAGES ?= $(MANPAGES_MD:%.md=%) -MANPAGES_DEST ?= $(subst markdown,man, $(subst source,build,$(MANPAGES))) - -$(MANPAGES): %: %.md .install.md2man docdir - @sed -e 's/\((podman.*\.md)\)//' -e 's/\[\(podman.*\)\]/\1/' -e 's;<\(/\)\?\(a[^>]*\|sup\)>;;g' $< | $(GOMD2MAN) -in /dev/stdin -out $(subst source/markdown,build/man,$@) - -.PHONY: docdir -docdir: - mkdir -p docs/build/man - -.PHONY: docs -docs: $(MANPAGES) ## Generate documentation - -install-podman-remote-%-docs: podman-remote docs $(MANPAGES) - rm -rf docs/build/remote - mkdir -p docs/build/remote - ln -sf $(shell pwd)/docs/source/markdown/links docs/build/man/ - docs/remote-docs.sh $* docs/build/remote/$* $(if $(findstring windows,$*),docs/source/markdown,docs/build/man) - -.PHONY: man-page-check -man-page-check: bin/podman - hack/man-page-checker - hack/xref-helpmsgs-manpages - -.PHONY: swagger-check -swagger-check: - hack/swagger-check - .PHONY: tests-included tests-included: contrib/cirrus/pr-should-include-tests -.PHONY: codespell -codespell: - codespell -S bin,vendor,.git,go.sum,changelog.txt,.cirrus.yml,"RELEASE_NOTES.md,*.xz,*.gz,*.tar,*.tgz,bin2img,*ico,*.png,*.1,*.5,copyimg,*.orig,apidoc.go" -L uint,iff,od,seeked,splitted,marge,ERRO,hist -w +### +### Release/Packaging targets +### -# When publishing releases include critical build-time details -.PHONY: release.txt -release.txt: - # X-RELEASE-INFO format depended upon by automated tooling - echo -n "X-RELEASE-INFO:" > "$@" - for field in "$(RELEASE_BASENAME)" "$(RELEASE_VERSION)" \ - "$(RELEASE_DIST)" "$(RELEASE_DIST_VER)" "$(RELEASE_ARCH)"; do \ - echo -n " $$field"; done >> "$@" - echo "" >> "$@" - -podman-release.tar.gz: binaries docs release.txt - $(eval TMPDIR := $(shell mktemp -d -p '' podman_XXXX)) +podman-release.tar.gz: binaries docs ## Build all binaries, docs., and installation tree, into a tarball. + $(eval TMPDIR := $(shell mktemp -d podman_tmp_XXXX)) $(eval SUBDIR := podman-v$(RELEASE_NUMBER)) mkdir -p "$(TMPDIR)/$(SUBDIR)" - $(MAKE) install.bin install.man install.cni install.systemd "DESTDIR=$(TMPDIR)/$(SUBDIR)" "PREFIX=/usr" - # release.txt location and content depended upon by automated tooling - cp release.txt "$(TMPDIR)/" - tar -czvf $@ --xattrs -C "$(TMPDIR)" "./release.txt" "./$(SUBDIR)" + $(MAKE) install.bin install.man install.cni \ + install.systemd "DESTDIR=$(TMPDIR)/$(SUBDIR)" "PREFIX=/usr" + tar -czvf $@ --xattrs -C "$(TMPDIR)" "./$(SUBDIR)" -rm -rf "$(TMPDIR)" -# Must call make in-line: Dependency-spec. w/ wild-card. -podman-remote-release-%.zip: - $(MAKE) podman-remote-$* install-podman-remote-$*-docs release.txt \ - RELEASE_BASENAME=$(shell hack/get_release_info.sh REMOTENAME) \ - RELEASE_DIST=$* RELEASE_DIST_VER="-" - $(eval TMPDIR := $(shell mktemp -d -p '' $podman_remote_XXXX)) - $(eval SUBDIR := podman-$(RELEASE_VERSION)) - $(eval BINSFX := $(shell test "$*" != "windows" || echo ".exe")) +podman-remote-release-%.zip: podman-remote-% install-podman-remote-%-docs ## Build podman-remote for GOOS=%, docs., and installation zip. + $(eval TMPDIR := $(shell mktemp -d podman_tmp_XXXX)) + $(eval SUBDIR := podman-$(RELEASE_NUMBER)) mkdir -p "$(TMPDIR)/$(SUBDIR)" - # release.txt location and content depended upon by automated tooling - cp release.txt "$(TMPDIR)/" - cp ./bin/podman-remote-$*$(BINSFX) "$(TMPDIR)/$(SUBDIR)/podman$(BINSFX)" + $(MAKE) \ + GOOS=$* \ + DESTDIR=$(TMPDIR)/ \ + BINDIR=$(SUBDIR) \ + SELINUXOPT="" \ + install.remote-nobuild cp -r ./docs/build/remote/$* "$(TMPDIR)/$(SUBDIR)/docs/" cp ./contrib/remote/containers.conf "$(TMPDIR)/$(SUBDIR)/" - cd "$(TMPDIR)/$(SUBDIR)" && \ - zip --recurse-paths "$(CURDIR)/$@" "./release.txt" "./" + cd "$(TMPDIR)" && \ + zip --recurse-paths "$(CURDIR)/$@" "./" -rm -rf "$(TMPDIR)" -.PHONY: podman-release -podman-release: - rm -f release.txt - $(MAKE) podman-release.tar.gz - -.PHONY: podman-remote-%-release -podman-remote-%-release: - rm -f release.txt - $(MAKE) podman-remote-release-$*.zip +.PHONY: podman.msi +podman.msi: podman-v$(RELEASE_NUMBER).msi ## Build podman-remote, package for installation on Windows +podman-v$(RELEASE_NUMBER).msi: podman-remote-windows install-podman-remote-windows-docs + $(eval DOCFILE := docs/build/remote/windows) + find $(DOCFILE) -print | \ + wixl-heat --var var.ManSourceDir --component-group ManFiles \ + --directory-ref INSTALLDIR --prefix $(DOCFILE)/ > \ + $(DOCFILE)/pages.wsx + wixl -D VERSION=$(RELEASE_VERSION) -D ManSourceDir=$(DOCFILE) \ + -o $@ contrib/msi/podman.wxs $(DOCFILE)/pages.wsx -.PHONY: generate-bindings -generate-bindings: -ifneq ($(shell uname -s), Darwin) - GO111MODULE=off $(GO) generate ./pkg/bindings/... ; -endif +.PHONY: package +package: ## Build rpm packages + ## TODO(ssbarnea): make version number predictable, it should not change + ## on each execution, producing duplicates. + rm -rf build/* *.src.rpm ~/rpmbuild/RPMS/* + ./contrib/build_rpm.sh -.PHONY: docker-docs -docker-docs: docs - (cd docs; ./dckrman.sh ./build/man/*.1) +### +### Installation targets +### -.PHONY: changelog -changelog: ## Generate changelog - @echo "Creating changelog from $(CHANGELOG_BASE) to $(CHANGELOG_TARGET)" - $(eval TMPFILE := $(shell mktemp)) - $(shell cat changelog.txt > $(TMPFILE)) - $(shell echo "- Changelog for $(CHANGELOG_TARGET) ($(ISODATE)):" > changelog.txt) - $(shell git log --no-merges --format=" * %s" $(CHANGELOG_BASE)..$(CHANGELOG_TARGET) >> changelog.txt) - $(shell echo "" >> changelog.txt) - $(shell cat $(TMPFILE) >> changelog.txt) - $(shell rm $(TMPFILE)) +# Remember that rpms install exec to /usr/bin/podman while a `make install` +# installs them to /usr/local/bin/podman which is likely before. Always use +# a full path to test installed podman or you risk to call another executable. +.PHONY: package-install +package-install: package ## Install rpm packages + sudo ${PKG_MANAGER} -y install ${HOME}/rpmbuild/RPMS/*/*.rpm + /usr/bin/podman version + /usr/bin/podman info # will catch a broken conmon .PHONY: install install: .gopathok install.bin install.remote install.man install.cni install.systemd ## Install binaries to system locations +.PHONY: install.catatonit +install.catatonit: + ./hack/install_catatonit.sh + .PHONY: install.remote-nobuild install.remote-nobuild: install ${SELINUXOPT} -d -m 755 $(DESTDIR)$(BINDIR) - install ${SELINUXOPT} -m 755 bin/podman-remote $(DESTDIR)$(BINDIR)/podman-remote - test -z "${SELINUXOPT}" || chcon --verbose --reference=$(DESTDIR)$(BINDIR)/podman-remote bin/podman-remote + install ${SELINUXOPT} -m 755 $(SRCBINDIR)/podman$(BINSFX) \ + $(DESTDIR)$(BINDIR)/podman$(BINSFX) + test -z "${SELINUXOPT}" || \ + chcon --verbose --reference=$(DESTDIR)$(BINDIR)/podman-remote \ + bin/podman-remote .PHONY: install.remote install.remote: podman-remote install.remote-nobuild @@ -582,41 +746,9 @@ else install.systemd: endif -.PHONY: uninstall -uninstall: - for i in $(filter %.1,$(MANPAGES_DEST)); do \ - rm -f $(DESTDIR)$(MANDIR)/man1/$$(basename $${i}); \ - done; \ - for i in $(filter %.5,$(MANPAGES_DEST)); do \ - rm -f $(DESTDIR)$(MANDIR)/man5/$$(basename $${i}); \ - done - # Remove podman and remote bin - rm -f $(DESTDIR)$(BINDIR)/podman - rm -f $(DESTDIR)$(BINDIR)/podman-remote - # Remove related config files - rm -f ${DESTDIR}${ETCDIR}/cni/net.d/87-podman-bridge.conflist - rm -f ${DESTDIR}${TMPFILESDIR}/podman.conf - rm -f ${DESTDIR}${SYSTEMDDIR}/io.podman.socket - rm -f ${DESTDIR}${USERSYSTEMDDIR}/io.podman.socket - rm -f ${DESTDIR}${SYSTEMDDIR}/io.podman.service - rm -f ${DESTDIR}${SYSTEMDDIR}/podman.service - rm -f ${DESTDIR}${SYSTEMDDIR}/podman.socket - rm -f ${DESTDIR}${USERSYSTEMDDIR}/podman.socket - rm -f ${DESTDIR}${USERSYSTEMDDIR}/podman.service - -.PHONY: .gitvalidation -.gitvalidation: .gopathok - @echo "Validating vs commit '$(call err_if_empty,EPOCH_TEST_COMMIT)'" - GIT_CHECK_EXCLUDE="./vendor:docs/make.bat" $(GOBIN)/git-validation -run DCO,short-subject,dangling-whitespace -range $(EPOCH_TEST_COMMIT)..$(HEAD) - .PHONY: install.tools install.tools: .install.goimports .install.gitvalidation .install.md2man .install.ginkgo .install.golangci-lint .install.bats ## Install needed tools -define go-get - env GO111MODULE=off \ - $(GO) get -u ${1} -endef - .install.goimports: .gopathok if [ ! -x "$(GOBIN)/goimports" ]; then \ $(call go-get,golang.org/x/tools/cmd/goimports); \ @@ -662,61 +794,46 @@ install.libseccomp.sudo: git clone https://github.com/seccomp/libseccomp ../../seccomp/libseccomp cd ../../seccomp/libseccomp && git checkout --detach $(LIBSECCOMP_COMMIT) && ./autogen.sh && ./configure --prefix=/usr && make all && make install - -.PHONY: completions -completions: podman podman-remote - # key = shell, value = completion filename - declare -A outfiles=([bash]=%s [zsh]=_%s [fish]=%s.fish [powershell]=%s.ps1);\ - for shell in $${!outfiles[*]}; do \ - for remote in "" "-remote"; do \ - podman="podman$$remote"; \ - outfile=$$(printf "completions/$$shell/$${outfiles[$$shell]}" $$podman); \ - ./bin/$$podman completion $$shell >| $$outfile; \ - done;\ +.PHONY: uninstall +uninstall: + for i in $(filter %.1,$(MANPAGES_DEST)); do \ + rm -f $(DESTDIR)$(MANDIR)/man1/$$(basename $${i}); \ + done; \ + for i in $(filter %.5,$(MANPAGES_DEST)); do \ + rm -f $(DESTDIR)$(MANDIR)/man5/$$(basename $${i}); \ done + # Remove podman and remote bin + rm -f $(DESTDIR)$(BINDIR)/podman + rm -f $(DESTDIR)$(BINDIR)/podman-remote + # Remove related config files + rm -f ${DESTDIR}${ETCDIR}/cni/net.d/87-podman-bridge.conflist + rm -f ${DESTDIR}${TMPFILESDIR}/podman.conf + rm -f ${DESTDIR}${SYSTEMDDIR}/io.podman.socket + rm -f ${DESTDIR}${USERSYSTEMDDIR}/io.podman.socket + rm -f ${DESTDIR}${SYSTEMDDIR}/io.podman.service + rm -f ${DESTDIR}${SYSTEMDDIR}/podman.service + rm -f ${DESTDIR}${SYSTEMDDIR}/podman.socket + rm -f ${DESTDIR}${USERSYSTEMDDIR}/podman.socket + rm -f ${DESTDIR}${USERSYSTEMDDIR}/podman.service -.PHONY: validate.completions -validate.completions: SHELL:=/usr/bin/env bash # Set shell to bash for this target -validate.completions: - # Check if the files can be loaded by the shell - . completions/bash/podman - if [ -x /bin/zsh ]; then /bin/zsh completions/zsh/_podman; fi - if [ -x /bin/fish ]; then /bin/fish completions/fish/podman.fish; fi - -.PHONY: validate -validate: gofmt lint .gitvalidation validate.completions man-page-check swagger-check tests-included - -.PHONY: build-all-new-commits -build-all-new-commits: - # Validate that all the commits build on top of $(GIT_BASE_BRANCH) - git rebase $(GIT_BASE_BRANCH) -x make - -.PHONY: build-no-cgo -build-no-cgo: - env BUILDTAGS="containers_image_openpgp exclude_graphdriver_btrfs exclude_graphdriver_devicemapper exclude_disk_quota" CGO_ENABLED=0 $(MAKE) - -.PHONY: vendor -vendor: - GO111MODULE=on $(GO) mod tidy - GO111MODULE=on $(GO) mod vendor - GO111MODULE=on $(GO) mod verify - -.PHONY: vendor-in-container -vendor-in-container: - podman run --privileged --rm --env HOME=/root -v `pwd`:/src -w /src docker.io/library/golang:1.16 make vendor - -.PHONY: package -package: ## Build rpm packages - ## TODO(ssbarnea): make version number predictable, it should not change - ## on each execution, producing duplicates. - rm -rf build/* *.src.rpm ~/rpmbuild/RPMS/* - ./contrib/build_rpm.sh - -# Remember that rpms install exec to /usr/bin/podman while a `make install` -# installs them to /usr/local/bin/podman which is likely before. Always use -# a full path to test installed podman or you risk to call another executable. -.PHONY: package-install -package-install: package ## Install rpm packages - sudo ${PKG_MANAGER} -y install ${HOME}/rpmbuild/RPMS/*/*.rpm - /usr/bin/podman version - /usr/bin/podman info # will catch a broken conmon +.PHONY: clean +clean: ## Clean all make artifacts + rm -rf \ + .gopathok \ + _output \ + $(wildcard podman-*.msi) \ + $(wildcard podman-remote*.zip) \ + $(wildcard podman_tmp_*) \ + $(wildcard podman*.tar.gz) \ + bin \ + build \ + test/checkseccomp/checkseccomp \ + test/goecho/goecho \ + test/testdata/redis-image \ + libpod/container_ffjson.go \ + libpod/pod_ffjson.go \ + libpod/container_easyjson.go \ + libpod/pod_easyjson.go \ + .install.goimports \ + docs/build + make -C docs clean diff --git a/contrib/cirrus/pr-should-include-tests b/contrib/cirrus/pr-should-include-tests index 2bc06df50..9ccac17a3 100755 --- a/contrib/cirrus/pr-should-include-tests +++ b/contrib/cirrus/pr-should-include-tests @@ -32,8 +32,9 @@ fi # This is OK if the only files being touched are "safe" ones. filtered_changes=$(git diff --name-status $base $head | awk '{print $2}' | - fgrep -vx Makefile | fgrep -vx .cirrus.yml | + fgrep -vx .gitignore | + fgrep -vx Makefile | fgrep -vx changelog.txt | fgrep -vx go.mod | fgrep -vx go.sum | diff --git a/contrib/cirrus/runner.sh b/contrib/cirrus/runner.sh index 8d3a6b987..b463745d1 100755 --- a/contrib/cirrus/runner.sh +++ b/contrib/cirrus/runner.sh @@ -202,8 +202,7 @@ function _run_build() { # Ensure always start from clean-slate with all vendor modules downloaded make clean make vendor - make podman-release - make podman-remote-linux-release + make podman-release.tar.gz # includes podman, podman-remote, and docs } function _run_altbuild() { @@ -219,7 +218,7 @@ function _run_altbuild() { make build-all-new-commits GIT_BASE_BRANCH=origin/$DEST_BRANCH ;; *Windows*) - make podman-remote-windows-release + make podman-remote-release-windows.zip make podman.msi ;; *Without*) diff --git a/contrib/msi/podman.wxs b/contrib/msi/podman.wxs index ff8160a53..451dd565d 100644 --- a/contrib/msi/podman.wxs +++ b/contrib/msi/podman.wxs @@ -24,7 +24,7 @@ <CreateFolder/> </Component> <Component Id="MainExecutable" Guid="73752F94-6589-4C7B-ABED-39D655A19714"> - <File Id="520C6E17-77A2-4F41-9611-30FA763A0702" Name="podman.exe" Source="bin/podman-remote-windows.exe" KeyPath="yes"/> + <File Id="520C6E17-77A2-4F41-9611-30FA763A0702" Name="podman.exe" Source="bin/windows/podman.exe" KeyPath="yes"/> </Component> </Directory> </Directory> diff --git a/docs/remote-docs.sh b/docs/remote-docs.sh index 67c731e75..2b7d73cd3 100755 --- a/docs/remote-docs.sh +++ b/docs/remote-docs.sh @@ -6,7 +6,17 @@ PLATFORM=$1 ## linux, windows or darwin TARGET=${2} ## where to output files SOURCES=${@:3} ## directories to find markdown files -PODMAN=${PODMAN:-bin/podman-remote} ## location overridden for testing +# Overriden for testing. Native podman-remote binary expected filepaths +if [[ -z "$PODMAN" ]]; then + case $(env -i HOME=$HOME PATH=$PATH go env GOOS) in + windows) + PODMAN=bin/windows/podman.exe ;; + darwin) + PODMAN=bin/darwin/podman ;; + *) # Assume "linux" + PODMAN=bin/podman-remote ;; + esac +fi function usage() { echo >&2 "$0 PLATFORM TARGET SOURCES..." diff --git a/hack/get_release_info.sh b/hack/get_release_info.sh index 69cf8cd57..b3e208ac9 100755 --- a/hack/get_release_info.sh +++ b/hack/get_release_info.sh @@ -14,11 +14,27 @@ valid_args() { cut -d '*' -f 1 } +# `git describe` will never produce a useful version number under all +# branches. This is because the podman release process (see `RELEASE_PROCESS.md`) +# tags release versions only on release-branches (i.e. never on master). +# Scraping the version number directly from the source, is the only way +# to reliably obtain the number from all the various contexts supported by +# the `Makefile`. +scrape_version() { + local v + # extract the value of 'var Version' + v=$(sed -ne 's/^var\s\+Version\s\+=\s.*("\(.*\)").*/\1/p' <version/version.go) + # If it's empty, something has changed in version.go, that would be bad! + test -n "$v" + # Value consumed literally, must not have any embedded newlines + echo -n "$v" +} + unset OUTPUT case "$1" in # Wild-card suffix needed by valid_args() e.g. possible bad grep of "$(echo $FOO)" VERSION*) - OUTPUT="${CIRRUS_TAG:-$(git fetch --tags && git describe HEAD 2> /dev/null)}" + OUTPUT="${CIRRUS_TAG:-$(scrape_version)}" ;; NUMBER*) OUTPUT="$($0 VERSION | sed 's/-.*//')" |