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