github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/Makefile (about)

     1  export GOPROXY=https://proxy.golang.org
     2  
     3  GO ?= go
     4  COVERAGE_PATH ?= .coverage
     5  DESTDIR ?=
     6  EPOCH_TEST_COMMIT ?= $(shell git merge-base $${DEST_BRANCH:-master} HEAD)
     7  HEAD ?= HEAD
     8  CHANGELOG_BASE ?= HEAD~
     9  CHANGELOG_TARGET ?= HEAD
    10  PROJECT := github.com/containers/podman
    11  GIT_BASE_BRANCH ?= origin/master
    12  GIT_BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD 2>/dev/null)
    13  GIT_BRANCH_CLEAN ?= $(shell echo $(GIT_BRANCH) | sed -e "s/[^[:alnum:]]/-/g")
    14  LIBPOD_INSTANCE := libpod_dev
    15  PREFIX ?= /usr/local
    16  BINDIR ?= ${PREFIX}/bin
    17  LIBEXECDIR ?= ${PREFIX}/libexec
    18  MANDIR ?= ${PREFIX}/share/man
    19  SHAREDIR_CONTAINERS ?= ${PREFIX}/share/containers
    20  ETCDIR ?= /etc
    21  TMPFILESDIR ?= ${PREFIX}/lib/tmpfiles.d
    22  SYSTEMDDIR ?= ${PREFIX}/lib/systemd/system
    23  USERSYSTEMDDIR ?= ${PREFIX}/lib/systemd/user
    24  REMOTETAGS ?= remote exclude_graphdriver_btrfs btrfs_noversion exclude_graphdriver_devicemapper containers_image_openpgp
    25  BUILDTAGS ?= \
    26  	$(shell hack/apparmor_tag.sh) \
    27  	$(shell hack/btrfs_installed_tag.sh) \
    28  	$(shell hack/btrfs_tag.sh) \
    29  	$(shell hack/selinux_tag.sh) \
    30  	$(shell hack/systemd_tag.sh) \
    31  	exclude_graphdriver_devicemapper \
    32  	seccomp
    33  PYTHON ?= $(shell command -v python3 python|head -n1)
    34  PKG_MANAGER ?= $(shell command -v dnf yum|head -n1)
    35  # ~/.local/bin is not in PATH on all systems
    36  PRE_COMMIT = $(shell command -v bin/venv/bin/pre-commit ~/.local/bin/pre-commit pre-commit | head -n1)
    37  
    38  SOURCES = $(shell find . -path './.*' -prune -o -name "*.go")
    39  
    40  BUILDFLAGS := -mod=vendor $(BUILDFLAGS)
    41  
    42  BUILDTAGS_CROSS ?= containers_image_openpgp exclude_graphdriver_btrfs exclude_graphdriver_devicemapper exclude_graphdriver_overlay
    43  ifneq (,$(findstring varlink,$(BUILDTAGS)))
    44  	PODMAN_VARLINK_DEPENDENCIES = pkg/varlink/iopodman.go
    45  endif
    46  CONTAINER_RUNTIME := $(shell command -v podman 2> /dev/null || echo docker)
    47  OCI_RUNTIME ?= ""
    48  
    49  BASHINSTALLDIR=${PREFIX}/share/bash-completion/completions
    50  ZSHINSTALLDIR=${PREFIX}/share/zsh/site-functions
    51  FISHINSTALLDIR=${PREFIX}/share/fish/vendor_completions.d
    52  
    53  SELINUXOPT ?= $(shell test -x /usr/sbin/selinuxenabled && selinuxenabled && echo -Z)
    54  
    55  COMMIT_NO ?= $(shell git rev-parse HEAD 2> /dev/null || true)
    56  GIT_COMMIT ?= $(if $(shell git status --porcelain --untracked-files=no),${COMMIT_NO}-dirty,${COMMIT_NO})
    57  DATE_FMT = %s
    58  ifdef SOURCE_DATE_EPOCH
    59  	BUILD_INFO ?= $(shell date -u -d "@$(SOURCE_DATE_EPOCH)" "+$(DATE_FMT)" 2>/dev/null || date -u -r "$(SOURCE_DATE_EPOCH)" "+$(DATE_FMT)" 2>/dev/null || date -u "+$(DATE_FMT)")
    60  	ISODATE ?= $(shell date -d "@$(SOURCE_DATE_EPOCH)" --iso-8601)
    61  else
    62  	BUILD_INFO ?= $(shell date "+$(DATE_FMT)")
    63  	ISODATE ?= $(shell date --iso-8601)
    64  endif
    65  LIBPOD := ${PROJECT}/v2/libpod
    66  GCFLAGS ?= all=-trimpath=${PWD}
    67  ASMFLAGS ?= all=-trimpath=${PWD}
    68  LDFLAGS_PODMAN ?= \
    69  	  -X $(LIBPOD)/define.gitCommit=$(GIT_COMMIT) \
    70  	  -X $(LIBPOD)/define.buildInfo=$(BUILD_INFO) \
    71  	  -X $(LIBPOD)/config._installPrefix=$(PREFIX) \
    72  	  -X $(LIBPOD)/config._etcDir=$(ETCDIR) \
    73  	  $(EXTRA_LDFLAGS)
    74  #Update to LIBSECCOMP_COMMIT should reflect in Dockerfile too.
    75  LIBSECCOMP_COMMIT := v2.3.3
    76  # Rarely if ever should integration tests take more than 50min,
    77  # caller may override in special circumstances if needed.
    78  GINKGOTIMEOUT ?= -timeout=90m
    79  
    80  RELEASE_VERSION ?= $(shell hack/get_release_info.sh VERSION)
    81  RELEASE_NUMBER ?= $(shell hack/get_release_info.sh NUMBER|sed -e 's/^v\(.*\)/\1/')
    82  RELEASE_DIST ?= $(shell hack/get_release_info.sh DIST)
    83  RELEASE_DIST_VER ?= $(shell hack/get_release_info.sh DIST_VER)
    84  RELEASE_ARCH ?= $(shell hack/get_release_info.sh ARCH)
    85  RELEASE_BASENAME := $(shell hack/get_release_info.sh BASENAME)
    86  
    87  # If non-empty, logs all output from server during remote system testing
    88  PODMAN_SERVER_LOG ?=
    89  
    90  # If GOPATH not specified, use one in the local directory
    91  ifeq ($(GOPATH),)
    92  export GOPATH := $(CURDIR)/_output
    93  unexport GOBIN
    94  endif
    95  FIRST_GOPATH := $(firstword $(subst :, ,$(GOPATH)))
    96  GOPKGDIR := $(FIRST_GOPATH)/src/$(PROJECT)
    97  GOPKGBASEDIR ?= $(shell dirname "$(GOPKGDIR)")
    98  
    99  GOBIN := $(shell $(GO) env GOBIN)
   100  ifeq ($(GOBIN),)
   101  GOBIN := $(FIRST_GOPATH)/bin
   102  endif
   103  
   104  GOMD2MAN ?= $(shell command -v go-md2man || echo '$(GOBIN)/go-md2man')
   105  
   106  CROSS_BUILD_TARGETS := \
   107  	bin/podman.cross.linux.amd64 \
   108  	bin/podman.cross.linux.ppc64le \
   109  	bin/podman.cross.linux.arm \
   110  	bin/podman.cross.linux.arm64 \
   111  	bin/podman.cross.linux.386 \
   112  	bin/podman.cross.linux.s390x
   113  
   114  .PHONY: all
   115  all: binaries docs
   116  
   117  .PHONY: default
   118  default: help
   119  
   120  define PRINT_HELP_PYSCRIPT
   121  import re, sys
   122  
   123  print("Usage: make <target>")
   124  cmds = {}
   125  for line in sys.stdin:
   126  	match = re.match(r'^([a-zA-Z_-]+):.*?## (.*)$$', line)
   127  	if match:
   128  	  target, help = match.groups()
   129  	  cmds.update({target: help})
   130  for cmd in sorted(cmds):
   131  		print(" * '%s' - %s" % (cmd, cmds[cmd]))
   132  endef
   133  export PRINT_HELP_PYSCRIPT
   134  
   135  # Dereference variable $(1), return value if non-empty, otherwise raise an error.
   136  err_if_empty = $(if $(strip $($(1))),$(strip $($(1))),$(error Required variable $(1) value is undefined, whitespace, or empty))
   137  
   138  .PHONY: help
   139  ifneq (, ${PYTHON})
   140  help:
   141  	@$(PYTHON) -c "$$PRINT_HELP_PYSCRIPT" < $(MAKEFILE_LIST)
   142  else
   143  help:
   144  	$(error python required for 'make help', executable not found)
   145  endif
   146  
   147  .gopathok:
   148  ifeq ("$(wildcard $(GOPKGDIR))","")
   149  	mkdir -p "$(GOPKGBASEDIR)"
   150  	ln -sfn "$(CURDIR)" "$(GOPKGDIR)"
   151  endif
   152  
   153  ifneq (,$(findstring varlink,$(BUILDTAGS)))
   154  	ln -sfn "$(CURDIR)/vendor/github.com/varlink" "$(FIRST_GOPATH)/src/github.com/varlink"
   155  endif
   156  	touch $@
   157  
   158  .PHONY: lint
   159  lint: golangci-lint
   160  	@echo "Linting vs commit '$(call err_if_empty,EPOCH_TEST_COMMIT)'"
   161  ifeq ($(PRE_COMMIT),)
   162  	@echo "FATAL: pre-commit was not found, make .install.pre-commit to installing it." >&2
   163  	@exit 2
   164  endif
   165  	$(PRE_COMMIT) run -a
   166  
   167  .PHONY: golangci-lint
   168  golangci-lint: .gopathok varlink_generate .install.golangci-lint
   169  	hack/golangci-lint.sh run
   170  
   171  .PHONY: gofmt
   172  gofmt: ## Verify the source code gofmt
   173  	find . -name '*.go' -type f \
   174  		-not \( \
   175  			-name '.golangci.yml' -o \
   176  			-name 'Makefile' -o \
   177  			-path './vendor/*' -prune -o \
   178  			-path './contrib/*' -prune \
   179  		\) -exec gofmt -d -e -s -w {} \+
   180  	git diff --exit-code
   181  
   182  .PHONY: test/checkseccomp/checkseccomp
   183  test/checkseccomp/checkseccomp: .gopathok $(wildcard test/checkseccomp/*.go)
   184  	$(GO) build $(BUILDFLAGS) -ldflags '$(LDFLAGS_PODMAN)' -tags "$(BUILDTAGS)" -o $@ ./test/checkseccomp
   185  
   186  .PHONY: test/goecho/goechoe
   187  test/goecho/goecho: .gopathok $(wildcard test/goecho/*.go)
   188  	$(GO) build $(BUILDFLAGS) -ldflags '$(LDFLAGS_PODMAN)' -o $@ ./test/goecho
   189  
   190  
   191  .PHONY: bin/podman
   192  bin/podman: .gopathok $(SOURCES) go.mod go.sum $(PODMAN_VARLINK_DEPENDENCIES) ## Build with podman
   193  # Make sure to warn in case we're building without the systemd buildtag.
   194  ifeq (,$(findstring systemd,$(BUILDTAGS)))
   195  	@echo "Podman is being compiled without the systemd build tag. Install libsystemd on \
   196  		Ubuntu or systemd-devel on rpm based distro for journald support."
   197  endif
   198  	$(GO) build $(BUILDFLAGS) -gcflags '$(GCFLAGS)' -asmflags '$(ASMFLAGS)' -ldflags '$(LDFLAGS_PODMAN)' -tags "$(BUILDTAGS)" -o $@ ./cmd/podman
   199  
   200  .PHONY: podman
   201  podman: bin/podman
   202  
   203  .PHONY: bin/podman-remote
   204  bin/podman-remote: .gopathok $(SOURCES) go.mod go.sum $(PODMAN_VARLINK_DEPENDENCIES) ## Build with podman on remote environment
   205  	$(GO) build $(BUILDFLAGS) -gcflags '$(GCFLAGS)' -asmflags '$(ASMFLAGS)' -ldflags '$(LDFLAGS_PODMAN)' -tags "${REMOTETAGS}" -o $@ ./cmd/podman
   206  
   207  .PHONY: bin/podman-remote-static
   208  podman-remote-static: bin/podman-remote-static
   209  	CGO_ENABLED=0 $(GO) build $(BUILDFLAGS) -gcflags '$(GCFLAGS)' -asmflags '$(ASMFLAGS)' -ldflags '$(LDFLAGS_PODMAN_STATIC)' -tags "${REMOTETAGS}" -o bin/podman-remote-static ./cmd/podman
   210  
   211  .PHONY: podman-remote
   212  podman-remote: bin/podman-remote
   213  
   214  .PHONY: podman.msi
   215  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
   216  	$(eval DOCFILE := docs/build/remote/windows)
   217  	find $(DOCFILE) -print \
   218  	|wixl-heat --var var.ManSourceDir --component-group ManFiles --directory-ref INSTALLDIR --prefix $(DOCFILE)/ >$(DOCFILE)/pages.wsx
   219  	wixl -D VERSION=$(RELEASE_NUMBER) -D ManSourceDir=$(DOCFILE) -o podman-v$(RELEASE_NUMBER).msi contrib/msi/podman.wxs $(DOCFILE)/pages.wsx
   220  
   221  podman-remote-%: .gopathok $(PODMAN_VARLINK_DEPENDENCIES) ## Build podman for a specific GOOS
   222  	$(eval BINSFX := $(shell test "$*" != "windows" || echo ".exe"))
   223  	CGO_ENABLED=0 GOOS=$* $(GO) build $(BUILDFLAGS) -gcflags '$(GCFLAGS)' -asmflags '$(ASMFLAGS)' -ldflags '$(LDFLAGS_PODMAN)' -tags "${REMOTETAGS}" -o bin/$@$(BINSFX) ./cmd/podman
   224  
   225  local-cross: $(CROSS_BUILD_TARGETS) ## Cross local compilation
   226  
   227  bin/podman.cross.%: .gopathok
   228  	TARGET="$*"; \
   229  	GOOS="$${TARGET%%.*}" \
   230  	GOARCH="$${TARGET##*.}" \
   231  	$(GO) build $(BUILDFLAGS) -gcflags '$(GCFLAGS)' -asmflags '$(ASMFLAGS)' -ldflags '$(LDFLAGS_PODMAN)' -tags '$(BUILDTAGS_CROSS)' -o "$@" ./cmd/podman
   232  
   233  # Update nix/nixpkgs.json its latest stable commit
   234  .PHONY: nixpkgs
   235  nixpkgs:
   236  	@nix run -f channel:nixos-20.03 nix-prefetch-git -c nix-prefetch-git \
   237  		--no-deepClone https://github.com/nixos/nixpkgs > nix/nixpkgs.json
   238  
   239  # Build statically linked binary
   240  .PHONY: static
   241  static:
   242  	@nix build -f nix/
   243  	mkdir -p ./bin
   244  	cp -rfp ./result/bin/* ./bin/
   245  
   246  .PHONY: run-docker-py-tests
   247  run-docker-py-tests:
   248  	$(eval testLogs=$(shell mktemp))
   249  	./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) "
   250  
   251  pkg/api/swagger.yaml: .gopathok release.txt
   252  	make -C pkg/api
   253  
   254  .PHONY: swagger
   255  swagger: pkg/api/swagger.yaml
   256  
   257  .PHONY: clean
   258  clean: ## Clean artifacts
   259  	rm -rf \
   260  		.gopathok \
   261  		_output \
   262  		release.txt \
   263  		$(wildcard podman-remote*.zip) \
   264  		$(wildcard podman*.tar.gz) \
   265  		bin \
   266  		build \
   267  		test/checkseccomp/checkseccomp \
   268  		test/goecho/goecho \
   269  		test/testdata/redis-image \
   270  		pkg/varlink/iopodman.go \
   271  		libpod/container_ffjson.go \
   272  		libpod/pod_ffjson.go \
   273  		libpod/container_easyjson.go \
   274  		libpod/pod_easyjson.go \
   275  		docs/build
   276  	make -C docs clean
   277  
   278  .PHONY: localunit
   279  localunit: test/goecho/goecho varlink_generate
   280  	hack/check_root.sh make localunit
   281  	rm -rf ${COVERAGE_PATH} && mkdir -p ${COVERAGE_PATH}
   282  	$(GOBIN)/ginkgo \
   283  		-r \
   284  		$(TESTFLAGS) \
   285  		--skipPackage test/e2e,pkg/apparmor,test/endpoint,pkg/bindings,hack \
   286  		--cover \
   287  		--covermode atomic \
   288  		--coverprofile coverprofile \
   289  		--outputdir ${COVERAGE_PATH} \
   290  		--tags "$(BUILDTAGS)" \
   291  		--succinct
   292  	$(GO) tool cover -html=${COVERAGE_PATH}/coverprofile -o ${COVERAGE_PATH}/coverage.html
   293  	$(GO) tool cover -func=${COVERAGE_PATH}/coverprofile > ${COVERAGE_PATH}/functions
   294  	cat ${COVERAGE_PATH}/functions | sed -n 's/\(total:\).*\([0-9][0-9].[0-9]\)/\1 \2/p'
   295  
   296  .PHONY: test
   297  test: localunit localintegration remoteintegration localsystem remotesystem  ## Run unit, integration, and system tests.
   298  
   299  .PHONY: ginkgo
   300  ginkgo:
   301  	$(GOBIN)/ginkgo -v $(TESTFLAGS) -tags "$(BUILDTAGS)" $(GINKGOTIMEOUT) -cover -flakeAttempts 3 -progress -trace -noColor -nodes 3 -debug test/e2e/. hack/.
   302  
   303  .PHONY: ginkgo-remote
   304  ginkgo-remote:
   305  	$(GOBIN)/ginkgo -v $(TESTFLAGS) -tags "$(REMOTETAGS)" $(GINKGOTIMEOUT) -cover -flakeAttempts 3 -progress -trace -noColor test/e2e/.
   306  
   307  .PHONY: endpoint
   308  ifneq (,$(findstring varlink,$(BUILDTAGS)))
   309  endpoint:
   310  	$(GOBIN)/ginkgo -v $(TESTFLAGS) -tags "$(BUILDTAGS)" $(GINKGOTIMEOUT) -cover -flakeAttempts 3 -progress -trace -noColor -debug test/endpoint/.
   311  endpoint:
   312  endif
   313  
   314  .PHONY: localintegration
   315  localintegration: varlink_generate test-binaries ginkgo
   316  
   317  .PHONY: remoteintegration
   318  remoteintegration: varlink_generate test-binaries ginkgo-remote
   319  
   320  .PHONY: localsystem
   321  localsystem:
   322  	# Wipe existing config, database, and cache: start with clean slate.
   323  	$(RM) -rf ${HOME}/.local/share/containers ${HOME}/.config/containers
   324  	if timeout -v 1 true; then PODMAN=$(shell pwd)/bin/podman bats test/system/; else echo "Skipping $@: 'timeout -v' unavailable'"; fi
   325  
   326  .PHONY: remotesystem
   327  remotesystem:
   328  	# Wipe existing config, database, and cache: start with clean slate.
   329  	$(RM) -rf ${HOME}/.local/share/containers ${HOME}/.config/containers
   330  	# Start podman server using tmp socket; loop-wait for it;
   331  	# test podman-remote; kill server, clean up tmp socket file.
   332  	# podman server spews copious unhelpful output; ignore it.
   333  	rc=0;\
   334  	if timeout -v 1 true; then \
   335  		SOCK_FILE=$(shell mktemp --dry-run --tmpdir podman.XXXXXX);\
   336  		export PODMAN_SOCKET=unix:$$SOCK_FILE; \
   337  		./bin/podman system service --timeout=0 $$PODMAN_SOCKET > $(if $(PODMAN_SERVER_LOG),$(PODMAN_SERVER_LOG),/dev/null) 2>&1 & \
   338  		retry=5;\
   339  		while [ $$retry -ge 0 ]; do\
   340  			echo Waiting for server...;\
   341  			sleep 1;\
   342  			./bin/podman-remote --url $$PODMAN_SOCKET info >/dev/null 2>&1 && break;\
   343  			retry=$$(expr $$retry - 1);\
   344  		done;\
   345  		if [ $$retry -lt 0 ]; then\
   346  			echo "Error: ./bin/podman system service did not come up on $$SOCK_FILE" >&2;\
   347  			exit 1;\
   348  		fi;\
   349  		env PODMAN="$(shell pwd)/bin/podman-remote --url $$PODMAN_SOCKET" bats test/system/ ;\
   350  		rc=$$?;\
   351  		kill %1;\
   352  		rm -f $$SOCK_FILE;\
   353  	else \
   354  		echo "Skipping $@: 'timeout -v' unavailable'";\
   355  	fi;\
   356  	exit $$rc
   357  
   358  .PHONY: localapiv2
   359  localapiv2:
   360  	env PODMAN=./bin/podman ./test/apiv2/test-apiv2
   361  	env PODMAN=./bin/podman ${PYTHON} -m unittest discover -v ./test/apiv2/rest_api/
   362  	env PODMAN=./bin/podman ${PYTHON} -m unittest discover -v ./test/python/docker
   363  
   364  .PHONY: remoteapiv2
   365  remoteapiv2:
   366  	true
   367  
   368  .PHONY: system.test-binary
   369  system.test-binary: .install.ginkgo
   370  	$(GO) test -c ./test/system
   371  
   372  .PHONY: binaries
   373  binaries: varlink_generate podman podman-remote ## Build podman
   374  
   375  .PHONY: install.catatonit
   376  install.catatonit:
   377  	./hack/install_catatonit.sh
   378  
   379  .PHONY: test-binaries
   380  test-binaries: test/checkseccomp/checkseccomp test/goecho/goecho install.catatonit
   381  
   382  MANPAGES_MD ?= $(wildcard docs/source/markdown/*.md pkg/*/docs/*.md)
   383  MANPAGES ?= $(MANPAGES_MD:%.md=%)
   384  MANPAGES_DEST ?= $(subst markdown,man, $(subst source,build,$(MANPAGES)))
   385  
   386  $(MANPAGES): %: %.md .install.md2man docdir
   387  	@sed -e 's/\((podman.*\.md)\)//' -e 's/\[\(podman.*\)\]/\1/' $<  | $(GOMD2MAN) -in /dev/stdin -out $(subst source/markdown,build/man,$@)
   388  
   389  .PHONY: docs
   390  docdir:
   391  	mkdir -p docs/build/man
   392  
   393  .PHONY: docs
   394  docs: $(MANPAGES) ## Generate documentation
   395  
   396  install-podman-remote-%-docs: podman-remote docs $(MANPAGES)
   397  	rm -rf docs/build/remote
   398  	mkdir -p docs/build/remote
   399  	ln -sf $(shell pwd)/docs/source/markdown/links docs/build/man/
   400  	docs/remote-docs.sh $* docs/build/remote/$* $(if $(findstring windows,$*),docs/source/markdown,docs/build/man)
   401  
   402  .PHONY: man-page-check
   403  man-page-check:
   404  	hack/man-page-checker
   405  	hack/xref-helpmsgs-manpages
   406  
   407  .PHONY: swagger-check
   408  swagger-check:
   409  	hack/swagger-check
   410  
   411  .PHONY: codespell
   412  codespell:
   413  	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
   414  
   415  # When publishing releases include critical build-time details
   416  .PHONY: release.txt
   417  release.txt:
   418  	# X-RELEASE-INFO format depended upon by automated tooling
   419  	echo -n "X-RELEASE-INFO:" > "$@"
   420  	for field in "$(RELEASE_BASENAME)" "$(RELEASE_VERSION)" \
   421  		         "$(RELEASE_DIST)" "$(RELEASE_DIST_VER)" "$(RELEASE_ARCH)"; do \
   422  		echo -n " $$field"; done >> "$@"
   423  	echo "" >> "$@"
   424  
   425  podman-release.tar.gz: binaries docs release.txt
   426  	$(eval TMPDIR := $(shell mktemp -d -p '' podman_XXXX))
   427  	$(eval SUBDIR := podman-v$(RELEASE_NUMBER))
   428  	mkdir -p "$(TMPDIR)/$(SUBDIR)"
   429  	$(MAKE) install.bin install.man install.cni install.systemd "DESTDIR=$(TMPDIR)/$(SUBDIR)" "PREFIX=/usr"
   430  	# release.txt location and content depended upon by automated tooling
   431  	cp release.txt "$(TMPDIR)/"
   432  	tar -czvf $@ --xattrs -C "$(TMPDIR)" "./release.txt" "./$(SUBDIR)"
   433  	-rm -rf "$(TMPDIR)"
   434  
   435  # Must call make in-line: Dependency-spec. w/ wild-card.
   436  podman-remote-release-%.zip:
   437  	$(MAKE) podman-remote-$* install-podman-remote-$*-docs release.txt \
   438  		RELEASE_BASENAME=$(shell hack/get_release_info.sh REMOTENAME) \
   439  		RELEASE_DIST=$* RELEASE_DIST_VER="-"
   440  	$(eval TMPDIR := $(shell mktemp -d -p '' $podman_remote_XXXX))
   441  	$(eval SUBDIR := podman-$(RELEASE_VERSION))
   442  	$(eval BINSFX := $(shell test "$*" != "windows" || echo ".exe"))
   443  	mkdir -p "$(TMPDIR)/$(SUBDIR)"
   444  	# release.txt location and content depended upon by automated tooling
   445  	cp release.txt "$(TMPDIR)/"
   446  	cp ./bin/podman-remote-$*$(BINSFX) "$(TMPDIR)/$(SUBDIR)/podman$(BINSFX)"
   447  	cp -r ./docs/build/remote/$* "$(TMPDIR)/$(SUBDIR)/docs/"
   448  	cp ./contrib/remote/containers.conf "$(TMPDIR)/$(SUBDIR)/"
   449  	cd "$(TMPDIR)/$(SUBDIR)" && \
   450  		zip --recurse-paths "$(CURDIR)/$@" "./release.txt" "./"
   451  	-rm -rf "$(TMPDIR)"
   452  
   453  .PHONY: podman-release
   454  podman-release:
   455  	rm -f release.txt
   456  	$(MAKE) podman-release.tar.gz
   457  
   458  .PHONY: podman-remote-%-release
   459  podman-remote-%-release:
   460  	rm -f release.txt
   461  	$(MAKE) podman-remote-release-$*.zip
   462  
   463  .PHONY: docker-docs
   464  docker-docs: docs
   465  	(cd docs; ./dckrman.sh ./build/man/*.1)
   466  
   467  .PHONY: changelog
   468  changelog: ## Generate changelog
   469  	@echo "Creating changelog from $(CHANGELOG_BASE) to $(CHANGELOG_TARGET)"
   470  	$(eval TMPFILE := $(shell mktemp))
   471  	$(shell cat changelog.txt > $(TMPFILE))
   472  	$(shell echo "- Changelog for $(CHANGELOG_TARGET) ($(ISODATE)):" > changelog.txt)
   473  	$(shell git log --no-merges --format="  * %s" $(CHANGELOG_BASE)..$(CHANGELOG_TARGET) >> changelog.txt)
   474  	$(shell echo "" >> changelog.txt)
   475  	$(shell cat $(TMPFILE) >> changelog.txt)
   476  	$(shell rm $(TMPFILE))
   477  
   478  .PHONY: install
   479  install: .gopathok install.bin install.remote install.man install.cni install.systemd  ## Install binaries to system locations
   480  
   481  .PHONY: install.remote-nobuild
   482  install.remote-nobuild:
   483  	install ${SELINUXOPT} -d -m 755 $(DESTDIR)$(BINDIR)
   484  	install ${SELINUXOPT} -m 755 bin/podman-remote $(DESTDIR)$(BINDIR)/podman-remote
   485  	test -z "${SELINUXOPT}" || chcon --verbose --reference=$(DESTDIR)$(BINDIR)/podman-remote bin/podman-remote
   486  
   487  .PHONY: install.remote
   488  install.remote: podman-remote install.remote-nobuild
   489  
   490  .PHONY: install.bin-nobuild
   491  install.bin-nobuild:
   492  	install ${SELINUXOPT} -d -m 755 $(DESTDIR)$(BINDIR)
   493  	install ${SELINUXOPT} -m 755 bin/podman $(DESTDIR)$(BINDIR)/podman
   494  	test -z "${SELINUXOPT}" || chcon --verbose --reference=$(DESTDIR)$(BINDIR)/podman bin/podman
   495  	install ${SELINUXOPT} -m 755 -d ${DESTDIR}${TMPFILESDIR}
   496  	install ${SELINUXOPT} -m 644 contrib/tmpfile/podman.conf ${DESTDIR}${TMPFILESDIR}/podman.conf
   497  
   498  .PHONY: install.bin
   499  install.bin: podman install.bin-nobuild
   500  
   501  .PHONY: install.man-nobuild
   502  install.man-nobuild:
   503  	install ${SELINUXOPT} -d -m 755 $(DESTDIR)$(MANDIR)/man1
   504  	install ${SELINUXOPT} -d -m 755 $(DESTDIR)$(MANDIR)/man5
   505  	install ${SELINUXOPT} -m 644 $(filter %.1,$(MANPAGES_DEST)) -t $(DESTDIR)$(MANDIR)/man1
   506  	install ${SELINUXOPT} -m 644 $(filter %.5,$(MANPAGES_DEST)) -t $(DESTDIR)$(MANDIR)/man5
   507  	install ${SELINUXOPT} -m 644 docs/source/markdown/links/*1 -t $(DESTDIR)$(MANDIR)/man1
   508  
   509  .PHONY: install.man
   510  install.man: docs install.man-nobuild
   511  
   512  .PHONY: install.completions
   513  install.completions:
   514  	install ${SELINUXOPT} -d -m 755 ${DESTDIR}${BASHINSTALLDIR}
   515  	install ${SELINUXOPT} -m 644 completions/bash/podman ${DESTDIR}${BASHINSTALLDIR}
   516  	install ${SELINUXOPT} -m 644 completions/bash/podman-remote ${DESTDIR}${BASHINSTALLDIR}
   517  	install ${SELINUXOPT} -d -m 755 ${DESTDIR}${ZSHINSTALLDIR}
   518  	install ${SELINUXOPT} -m 644 completions/zsh/_podman ${DESTDIR}${ZSHINSTALLDIR}
   519  	install ${SELINUXOPT} -m 644 completions/zsh/_podman-remote ${DESTDIR}${ZSHINSTALLDIR}
   520  	install ${SELINUXOPT} -d -m 755 ${DESTDIR}${FISHINSTALLDIR}
   521  	install ${SELINUXOPT} -m 644 completions/fish/podman.fish ${DESTDIR}${FISHINSTALLDIR}
   522  	install ${SELINUXOPT} -m 644 completions/fish/podman-remote.fish ${DESTDIR}${FISHINSTALLDIR}
   523  
   524  .PHONY: install.cni
   525  install.cni:
   526  	install ${SELINUXOPT} -d -m 755 ${DESTDIR}${ETCDIR}/cni/net.d/
   527  	install ${SELINUXOPT} -m 644 cni/87-podman-bridge.conflist ${DESTDIR}${ETCDIR}/cni/net.d/87-podman-bridge.conflist
   528  
   529  .PHONY: install.docker
   530  install.docker: docker-docs
   531  	install ${SELINUXOPT} -d -m 755 $(DESTDIR)$(BINDIR) $(DESTDIR)$(MANDIR)/man1
   532  	install ${SELINUXOPT} -m 755 docker $(DESTDIR)$(BINDIR)/docker
   533  	install ${SELINUXOPT} -m 644 docs/build/man/docker*.1 -t $(DESTDIR)$(MANDIR)/man1
   534  	install ${SELINUXOPT} -m 755 -d ${DESTDIR}${SYSTEMDDIR}  ${DESTDIR}${USERSYSTEMDDIR} ${DESTDIR}${TMPFILESDIR}
   535  	install ${SELINUXOPT} -m 644 contrib/systemd/system/podman-docker.conf -t ${DESTDIR}${TMPFILESDIR}
   536  
   537  .PHONY: install.varlink
   538  ifneq (,$(findstring varlink,$(BUILDTAGS)))
   539  install.varlink:
   540  	install ${SELINUXOPT} -m 755 -d ${DESTDIR}${SYSTEMDDIR}  ${DESTDIR}${USERSYSTEMDDIR}
   541  	install ${SELINUXOPT} -m 644 contrib/varlink/io.podman.socket ${DESTDIR}${SYSTEMDDIR}/io.podman.socket
   542  	install ${SELINUXOPT} -m 644 contrib/varlink/io.podman.socket ${DESTDIR}${USERSYSTEMDDIR}/io.podman.socket
   543  	install ${SELINUXOPT} -m 644 contrib/varlink/io.podman.service ${DESTDIR}${SYSTEMDDIR}/io.podman.service
   544  	# User units are ordered differently, we can't make the *system* multi-user.target depend on a user unit.
   545  	# For user units the default.target that's the default is fine.
   546  	sed -e 's,^WantedBy=.*,WantedBy=default.target,' < contrib/varlink/io.podman.service > ${DESTDIR}${USERSYSTEMDDIR}/io.podman.service
   547  else
   548  install.varlink:
   549  endif
   550  
   551  
   552  .PHONY: install.systemd
   553  install.systemd: install.varlink
   554  	install ${SELINUXOPT} -m 755 -d ${DESTDIR}${SYSTEMDDIR}  ${DESTDIR}${USERSYSTEMDDIR}
   555  	# User services
   556  	install ${SELINUXOPT} -m 644 contrib/systemd/auto-update/podman-auto-update.service ${DESTDIR}${USERSYSTEMDDIR}/podman-auto-update.service
   557  	install ${SELINUXOPT} -m 644 contrib/systemd/auto-update/podman-auto-update.timer ${DESTDIR}${USERSYSTEMDDIR}/podman-auto-update.timer
   558  	install ${SELINUXOPT} -m 644 contrib/systemd/user/podman.socket ${DESTDIR}${USERSYSTEMDDIR}/podman.socket
   559  	install ${SELINUXOPT} -m 644 contrib/systemd/user/podman.service ${DESTDIR}${USERSYSTEMDDIR}/podman.service
   560  	# System services
   561  	install ${SELINUXOPT} -m 644 contrib/systemd/auto-update/podman-auto-update.service ${DESTDIR}${SYSTEMDDIR}/podman-auto-update.service
   562  	install ${SELINUXOPT} -m 644 contrib/systemd/auto-update/podman-auto-update.timer ${DESTDIR}${SYSTEMDDIR}/podman-auto-update.timer
   563  	install ${SELINUXOPT} -m 644 contrib/systemd/system/podman.socket ${DESTDIR}${SYSTEMDDIR}/podman.socket
   564  	install ${SELINUXOPT} -m 644 contrib/systemd/system/podman.service ${DESTDIR}${SYSTEMDDIR}/podman.service
   565  
   566  .PHONY: uninstall
   567  uninstall:
   568  	for i in $(filter %.1,$(MANPAGES_DEST)); do \
   569  		rm -f $(DESTDIR)$(MANDIR)/man1/$$(basename $${i}); \
   570  	done; \
   571  	for i in $(filter %.5,$(MANPAGES_DEST)); do \
   572  		rm -f $(DESTDIR)$(MANDIR)/man5/$$(basename $${i}); \
   573  	done
   574  	# Remove podman and remote bin
   575  	rm -f $(DESTDIR)$(BINDIR)/podman
   576  	rm -f $(DESTDIR)$(BINDIR)/podman-remote
   577  	# Remove related config files
   578  	rm -f ${DESTDIR}${ETCDIR}/cni/net.d/87-podman-bridge.conflist
   579  	rm -f ${DESTDIR}${TMPFILESDIR}/podman.conf
   580  	rm -f ${DESTDIR}${SYSTEMDDIR}/io.podman.socket
   581  	rm -f ${DESTDIR}${USERSYSTEMDDIR}/io.podman.socket
   582  	rm -f ${DESTDIR}${SYSTEMDDIR}/io.podman.service
   583  	rm -f ${DESTDIR}${SYSTEMDDIR}/podman.service
   584  	rm -f ${DESTDIR}${SYSTEMDDIR}/podman.socket
   585  	rm -f ${DESTDIR}${USERSYSTEMDDIR}/podman.socket
   586  	rm -f ${DESTDIR}${USERSYSTEMDDIR}/podman.service
   587  
   588  .PHONY: .gitvalidation
   589  .gitvalidation: .gopathok
   590  	@echo "Validating vs commit '$(call err_if_empty,EPOCH_TEST_COMMIT)'"
   591  	GIT_CHECK_EXCLUDE="./vendor:docs/make.bat" $(GOBIN)/git-validation -run DCO,short-subject,dangling-whitespace -range $(EPOCH_TEST_COMMIT)..$(HEAD)
   592  
   593  .PHONY: install.tools
   594  install.tools: .install.gitvalidation .install.md2man .install.ginkgo .install.golangci-lint .install.bats ## Install needed tools
   595  
   596  define go-get
   597  	env GO111MODULE=off \
   598  		$(GO) get -u ${1}
   599  endef
   600  
   601  .PHONY: .install.ginkgo
   602  .install.ginkgo: .gopathok
   603  	if [ ! -x "$(GOBIN)/ginkgo" ]; then \
   604  		$(GO) install $(BUILDFLAGS) ./vendor/github.com/onsi/ginkgo/ginkgo ; \
   605  	fi
   606  
   607  .PHONY: .install.gitvalidation
   608  .install.gitvalidation: .gopathok
   609  	if [ ! -x "$(GOBIN)/git-validation" ]; then \
   610  		$(call go-get,github.com/vbatts/git-validation); \
   611  	fi
   612  
   613  .PHONY: .install.golangci-lint
   614  .install.golangci-lint: .gopathok
   615  	VERSION=1.18.0 GOBIN=$(GOBIN) sh ./hack/install_golangci.sh
   616  
   617  .PHONY: .install.bats
   618  .install.bats: .gopathok
   619  	VERSION=v1.1.0 ./hack/install_bats.sh
   620  
   621  .PHONY: .install.pre-commit
   622  .install.pre-commit:
   623  	if [ -z "$(PRE_COMMIT)" ]; then \
   624  		python3 -m pip install --user pre-commit; \
   625  	fi
   626  
   627  .PHONY: .install.md2man
   628  .install.md2man: .gopathok
   629  	if [ ! -x "$(GOMD2MAN)" ]; then \
   630  		$(call go-get,github.com/cpuguy83/go-md2man); \
   631  	fi
   632  
   633  # $BUILD_TAGS variable is used in hack/golangci-lint.sh
   634  .PHONY: varlink_generate
   635  ifneq (or $(findstring varlink,$(BUILDTAGS)),$(findstring varlink,$(BUILD_TAGS)))
   636  varlink_generate: .gopathok pkg/varlink/iopodman.go ## Generate varlink
   637  else
   638  varlink_generate:
   639  endif
   640  
   641  .PHONY: varlink_api_generate
   642  ifneq (,$(findstring varlink,$(BUILDTAGS)))
   643  varlink_api_generate: .gopathok API.md
   644  else
   645  varlink_api_generate:
   646  endif
   647  
   648  .PHONY: install.libseccomp.sudo
   649  install.libseccomp.sudo:
   650  	rm -rf ../../seccomp/libseccomp
   651  	git clone https://github.com/seccomp/libseccomp ../../seccomp/libseccomp
   652  	cd ../../seccomp/libseccomp && git checkout --detach $(LIBSECCOMP_COMMIT) && ./autogen.sh && ./configure --prefix=/usr && make all && make install
   653  
   654  
   655  pkg/varlink/iopodman.go: .gopathok pkg/varlink/io.podman.varlink
   656  ifneq (,$(findstring Linux,$(shell uname -s)))
   657  	# Only generate the varlink code on Linux (see issue #4814).
   658  	$(GO) generate ./pkg/varlink/...
   659  endif
   660  
   661  API.md: pkg/varlink/io.podman.varlink
   662  	$(GO) generate ./docs/...
   663  
   664  .PHONY: validate.completions
   665  validate.completions: SHELL:=/usr/bin/env bash # Set shell to bash for this target
   666  validate.completions:
   667  	# Check if the files can be loaded by the shell
   668  	. completions/bash/podman
   669  	if [ -x /bin/zsh ]; then /bin/zsh completions/zsh/_podman; fi
   670  	if [ -x /bin/fish ]; then /bin/fish completions/fish/podman.fish; fi
   671  
   672  .PHONY: validate
   673  validate: gofmt lint .gitvalidation validate.completions man-page-check swagger-check
   674  
   675  .PHONY: build-all-new-commits
   676  build-all-new-commits:
   677  	# Validate that all the commits build on top of $(GIT_BASE_BRANCH)
   678  	git rebase $(GIT_BASE_BRANCH) -x make
   679  
   680  .PHONY: build-no-cgo
   681  build-no-cgo:
   682  	env BUILDTAGS="containers_image_openpgp exclude_graphdriver_btrfs exclude_graphdriver_devicemapper exclude_disk_quota" CGO_ENABLED=0 $(MAKE)
   683  
   684  .PHONY: vendor
   685  vendor:
   686  	GO111MODULE=on $(GO) mod tidy
   687  	GO111MODULE=on $(GO) mod vendor
   688  	GO111MODULE=on $(GO) mod verify
   689  
   690  .PHONY: vendor-in-container
   691  vendor-in-container:
   692  	podman run --privileged --rm --env HOME=/root -v `pwd`:/src -w /src docker.io/library/golang:1.13 make vendor
   693  
   694  .PHONY: package
   695  package:  ## Build rpm packages
   696  	## TODO(ssbarnea): make version number predictable, it should not change
   697  	## on each execution, producing duplicates.
   698  	rm -rf build/* *.src.rpm ~/rpmbuild/RPMS/*
   699  	./contrib/build_rpm.sh
   700  
   701  # Remember that rpms install exec to /usr/bin/podman while a `make install`
   702  # installs them to /usr/local/bin/podman which is likely before. Always use
   703  # a full path to test installed podman or you risk to call another executable.
   704  .PHONY: package-install
   705  package-install: package  ## Install rpm packages
   706  	sudo ${PKG_MANAGER} -y install ${HOME}/rpmbuild/RPMS/*/*.rpm
   707  	/usr/bin/podman version
   708  	/usr/bin/podman info  # will catch a broken conmon