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