xref: /aosp_15_r20/external/coreboot/util/docker/Makefile (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1##
2## SPDX-License-Identifier: GPL-2.0-only
3
4export top=$(abspath $(CURDIR)/../..)
5export crossgcc_version=$(shell $(top)/util/crossgcc/buildgcc --version | grep 'cross toolchain' | sed 's/^.*\sv//' | sed 's/\s.*$$//')
6export DOCKER:=$(shell $(SHELL) -c "command -v docker")
7
8# Local port to forward to the jenkins image for the test server
9export COREBOOT_JENKINS_PORT?=49151
10
11# Local cache directory - for storing files shared with the docker image
12export COREBOOT_JENKINS_CACHE_DIR?=/srv/docker/coreboot-builder/cache
13
14# Name of the jenkins container
15export COREBOOT_JENKINS_CONTAINER?=coreboot_jenkins
16
17# Version of the jenkins / sdk container
18export COREBOOT_IMAGE_TAG?=$(crossgcc_version)
19
20# Commit id to build from
21export DOCKER_COMMIT?=$(shell git log -n 1 --pretty=%h)
22
23# .ccache dir to use
24export DOCKER_CCACHE?=$(HOME)/.ccache
25
26# SDK architecture
27export COREBOOT_CROSSGCC_PARAM?=all
28
29UID ?= $(shell id -u)
30GID ?= $(shell id -g)
31
32test-docker:
33	$(if $(DOCKER),,\
34		$(warning Error: Docker command not found.  Please install docker) \
35		$(warning Instructions: https://docs.docker.com/engine/install/ ) \
36		$(error halting))
37
38test-docker-login: test-docker
39	$(if $(shell if [ ! -f ~/.docker/config.json ]; then \
40		echo "docker authentication file not found"; fi), \
41		$(error Docker authentication file not found.  Run 'docker login'))
42
43coreboot-sdk: test-docker
44	@echo "Building coreboot SDK $(crossgcc_version) from commit $(DOCKER_COMMIT)"
45	$(DOCKER) build \
46		--tag coreboot/coreboot-sdk:$(COREBOOT_IMAGE_TAG) \
47		--build-arg=SDK_VERSION="$(COREBOOT_IMAGE_TAG)" \
48		--build-arg=DOCKER_COMMIT="$(DOCKER_COMMIT)" \
49		--build-arg=CROSSGCC_PARAM="$(COREBOOT_CROSSGCC_PARAM)" \
50		coreboot-sdk
51
52coreboot-jenkins-test: test-docker
53	@echo "Testing coreboot SDK and jenkins node version $(crossgcc_version), built from commit $(DOCKER_COMMIT)"
54	$(DOCKER) build \
55		--tag coreboot/coreboot-jenkins-test:$(COREBOOT_IMAGE_TAG) \
56		--build-arg=SDK_VERSION="$(COREBOOT_IMAGE_TAG)" \
57		coreboot-jenkins-test
58
59upload-coreboot-sdk: test-docker-login
60	$(DOCKER) push coreboot/coreboot-sdk:$(COREBOOT_IMAGE_TAG)
61
62coreboot-jenkins-node: test-docker
63	cat coreboot-jenkins-node/Dockerfile | \
64		sed "s/{{SDK_VERSION}}/$(COREBOOT_IMAGE_TAG)/g" | \
65		sed "s|{{SSH_KEY}}|$$(cat coreboot-jenkins-node/authorized_keys)|" | \
66		$(DOCKER) build -t coreboot/coreboot-jenkins-node:$(COREBOOT_IMAGE_TAG) -
67
68upload-coreboot-jenkins-node: test-docker-login
69	$(DOCKER) push coreboot/coreboot-jenkins-node:$(COREBOOT_IMAGE_TAG)
70
71doc.coreboot.org: test-docker
72	$(DOCKER) build --force-rm -t doc.coreboot.org \
73	$(top)/util/docker/doc.coreboot.org/
74
75docker-killall: test-docker
76	@if [ -n "$$($(DOCKER) ps | grep 'coreboot')" ]; then \
77		$(DOCKER) kill $$($(DOCKER) ps | grep 'coreboot' | cut -f1 -d ' '); \
78	fi
79
80clean-coreboot-containers: docker-killall
81	@if [ -n "$$($(DOCKER) ps -a | grep 'coreboot')" ]; then \
82		$(DOCKER) rm $$($(DOCKER) ps -a | grep 'coreboot' | sed 's|\s.*$$||'); \
83	fi
84
85clean-coreboot-images: docker-killall
86	@if [ -n "$$($(DOCKER) images | grep 'coreboot')" ]; then \
87		$(DOCKER) rmi $$($(DOCKER) images | grep coreboot | sed 's|^\S\+\s\+\S\+\s\+||' | sed 's|\s.*$$||'); \
88	fi
89
90docker-clean: clean-coreboot-containers
91	@$(MAKE) clean-coreboot-images
92
93docker-cleanall: test-docker
94ifeq ($(Y),1)
95	@if [ -n "$$($(DOCKER) ps -a | grep -v "CONTAINER")" ]; then \
96		$(DOCKER) kill $$($(DOCKER) ps | grep -v "CONTAINER" | sed 's|\s.*$$||') ; \
97		$(DOCKER) rm $$($(DOCKER) ps -a | grep -v "CONTAINER" | sed 's|\s.*$$||'); \
98	fi
99	@if [ -n "$$($(DOCKER) images | grep -v "REPOSITORY")" ]; then \
100		$(DOCKER) rmi $$($(DOCKER) images | grep -v "REPOSITORY" | tr -s ' ' | cut -f3 -d ' '); \
101	fi
102else
103	echo "This will remove *ALL* docker containers from your machine."
104	echo "If this is what you want, run 'make docker-cleanall Y=1'"
105endif
106
107$(DOCKER_CCACHE):
108	@mkdir -p $@
109
110docker-run-local: test-docker $(DOCKER_CCACHE)
111	$(DOCKER) run -it --rm \
112		--volume $(DOCKER_CCACHE):/home/coreboot/.ccache \
113		--volume $(top):/home/coreboot/coreboot \
114		--env HOME=/home/coreboot \
115		--user $(UID):$(GID) \
116		coreboot/coreboot-sdk:$(COREBOOT_IMAGE_TAG) \
117		/bin/bash -c 'cd $${HOME}/coreboot && $(DOCKER_RUN_LOCAL)'
118
119docker-build-coreboot: docker-run-local
120docker-build-coreboot: override DOCKER_RUN_LOCAL := \
121	make clean && make $(BUILD_CMD)
122
123docker-abuild: docker-run-local
124docker-abuild: override DOCKER_RUN_LOCAL := \
125	make clean && util/abuild/abuild $(ABUILD_ARGS)
126
127docker-what-jenkins-does: docker-run-local
128docker-what-jenkins-does: override DOCKER_RUN_LOCAL := \
129	make clean && make what-jenkins-does CPUS=$(CPUS)
130
131test-docker-cache-dir:
132	@if [ ! -d "$(COREBOOT_JENKINS_CACHE_DIR)" ]; then \
133		printf "\nError: %s does not exist.\n" "$(COREBOOT_JENKINS_CACHE_DIR)"; \
134		printf "Please run:\nsudo mkdir -p %s\n\n" "$(COREBOOT_JENKINS_CACHE_DIR)"; \
135		printf "sudo chown -R $$(whoami):$$(whoami) %s\n\n" "$(COREBOOT_JENKINS_CACHE_DIR)"; \
136		false; \
137	fi
138	@if ! touch "$(COREBOOT_JENKINS_CACHE_DIR)/testfile" 2>/dev/null; then \
139		printf "\nError: Cannot create file in %s." "$(COREBOOT_JENKINS_CACHE_DIR)"; \
140		printf "Please run:\nsudo chown -R $$(whoami):$$(whoami) %s\n\n" "$(COREBOOT_JENKINS_CACHE_DIR)"; \
141		false; \
142	else \
143		 rm -f "$(COREBOOT_JENKINS_CACHE_DIR)/testfile"; \
144	fi
145
146docker-jenkins-server: test-docker-cache-dir test-docker
147	$(DOCKER) run -d --privileged --restart=always \
148		-p $(COREBOOT_JENKINS_PORT):49151 \
149		-v $(COREBOOT_JENKINS_CACHE_DIR):/data/cache \
150		--name=$(COREBOOT_JENKINS_CONTAINER) \
151		coreboot/coreboot-jenkins-node:$(COREBOOT_IMAGE_TAG)
152
153docker-jenkins-shell: test-docker-cache-dir test-docker
154	$(DOCKER) run -u root -it --privileged \
155		--entrypoint="/bin/bash" \
156		-p $(COREBOOT_JENKINS_PORT):49151 \
157		-v $(top):/home/coreboot/coreboot \
158		-v $(COREBOOT_JENKINS_CACHE_DIR):/data/cache \
159		--name=$(COREBOOT_JENKINS_CONTAINER) \
160		--rm coreboot/coreboot-jenkins-node:$(COREBOOT_IMAGE_TAG)
161
162docker-shell: USER=coreboot
163docker-shell: test-docker
164	$(DOCKER) run -u $(USER) -it \
165		-e COLUMNS=$(shell tput cols) -e LINES=$(shell tput lines) -e TERM=$(TERM) \
166		-w /home/coreboot/coreboot \
167		-v $(top):/home/coreboot/coreboot \
168		--rm coreboot/coreboot-sdk:$(COREBOOT_IMAGE_TAG) \
169		/bin/bash -l
170
171docker-jenkins-attach: USER=root
172docker-jenkins-attach: test-docker
173	$(DOCKER)  exec --user $(USER) \
174		-e COLUMNS=$(shell tput cols) -e LINES=$(shell tput lines) -e TERM=$(TERM) \
175		-it "$$(docker ps | grep coreboot-jenkins-node | cut -f1 -d' ')" \
176		/bin/bash -l
177
178docker-build-docs: test-docker
179docker-build-docs:
180	mkdir -p $(top)/Documentation/_build
181	$(DOCKER) run -it --rm \
182		--user $(UID):$(GID) \
183		-v "$(top)/:/data-in/:ro" \
184		-v "$(top)/Documentation/_build/:/data-out/" \
185		doc.coreboot.org
186
187docker-livehtml-docs: test-docker
188docker-livehtml-docs:
189	$(DOCKER) run -it --rm \
190		--net=host -v "$(top)/:/data-in/:ro" \
191		doc.coreboot.org livehtml
192
193help:
194	@echo "Commands for working with docker images:"
195	@echo "  coreboot-sdk                 - Build coreboot-sdk container"
196	@echo "  coreboot-jenkins-test        - Test the coreboot-jenkins-node build functionality"
197	@echo "  upload-coreboot-sdk          - Upload coreboot-sdk to hub.docker.com"
198	@echo "  coreboot-jenkins-node        - Build coreboot-jenkins-node container"
199	@echo "  upload-coreboot-jenkins-node - Upload coreboot-jenkins-node to hub.docker.com"
200	@echo "  doc.coreboot.org             - Build doc.coreboot.org container"
201	@echo "  clean-coreboot-containers    - Remove all docker coreboot containers"
202	@echo "  clean-coreboot-images        - Remove all docker coreboot images"
203	@echo "  docker-clean                 - Remove docker coreboot containers & images"
204	@echo
205	@echo "Commands for using docker images"
206	@echo "  docker-build-coreboot        - Build coreboot under coreboot-sdk"
207	@echo "      <BUILD_CMD=target> "
208	@echo "  docker-abuild                - Run abuild under coreboot-sdk"
209	@echo "      <ABUILD_ARGS='-a -B'>"
210	@echo "  docker-what-jenkins-does     - Run 'what-jenkins-does' target"
211	@echo "  docker-jenkins-shell         - Bash prompt in coreboot-jenkins-node"
212	@echo "      <USER=root or USER=coreboot>"
213	@echo "  docker-shell                 - Bash prompt in coreboot-sdk"
214	@echo "      <USER=root or USER=coreboot>"
215	@echo "  docker-jenkins-server        - Run coreboot-jenkins-node image (for server)"
216	@echo "  docker-jenkins-attach        - Open shell in running jenkins server"
217	@echo "  docker-build-docs            - Build the documentation"
218	@echo "  docker-livehtml-docs         - Run sphinx-autobuild"
219	@echo
220	@echo "Variables:"
221	@echo "  COREBOOT_JENKINS_PORT=$(COREBOOT_JENKINS_PORT)"
222	@echo "  COREBOOT_JENKINS_CACHE_DIR=$(COREBOOT_JENKINS_CACHE_DIR)"
223	@echo "  COREBOOT_JENKINS_CONTAINER=$(COREBOOT_JENKINS_CONTAINER)"
224	@echo "  COREBOOT_IMAGE_TAG=$(COREBOOT_IMAGE_TAG)"
225	@echo "  DOCKER_COMMIT=$(DOCKER_COMMIT)"
226
227.PHONY: test-docker test-docker-login test-docker-cache-dir
228.PHONY: coreboot-jenkins-node upload-coreboot-jenkins-node coreboot-jenkins-test
229.PHONY: coreboot-sdk upload-coreboot-sdk
230.PHONY: doc.coreboot.org
231.PHONY: clean-coreboot-containers clean-coreboot-images docker-cleanall
232.PHONY: docker-abuild
233.PHONY: docker-shell docker-jenkins-shell
234.PHONY: docker-what-jenkins-does docker-jenkins-server docker-jenkins-attach
235.PHONY: docker-build-docs docker-livehtml-docs
236.PHONY: help
237