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