github.com/containers/libpod@v1.9.4-0.20220419124438-4284fd425507/Makefile (about)

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