xref: /openbmc/openbmc-build-scripts/qemu-build.sh (revision 30ec0c46175cc9e03caf9f3d9670fa1c3fd009a3)
1#!/bin/bash
2###############################################################################
3#
4# This build script is for running the QEMU build as a container with the
5# option of launching the container with Docker or Kubernetes.
6#
7###############################################################################
8#
9# Script Variables:
10#  build_scripts_dir  The path of the openbmc-build-scripts directory.
11#                     Default: The directory containing this script
12#  http_proxy         The HTTP address of the proxy server to connect to.
13#                     Default: "", proxy is not setup if this is not set
14#  qemu_dir           Path of the directory that holds the QEMU repo, if none
15#                     exists will clone in the OpenBMC/QEMU repo to WORKSPACE.
16#                     Default: "${WORKSPACE}/qemu"
17#  WORKSPACE          Path of the workspace directory where some intermediate
18#                     files and the images will be saved to.
19#                     Default: "~/{RandomNumber}"
20#
21# Docker Image Build Variables:
22#  build_dir          Path of the directory that is created within the docker
23#                     container where the build is actually done. Done this way
24#                     to allow NFS volumes to be used as the qemu_dir.
25#                     Default: "/tmp/qemu"
26#  img_name           Defaults to qemu-build with the arch as its tag, can be
27#                     changed or passed to give a specific name to created image
28#
29# Deployment Variables:
30#  launch             ""|job|pod
31#                     Leave blank to launch via Docker if not using kubernetes
32#                     to launch the container.
33#                     Job lets you keep a copy of job and container logs on the
34#                     api, can be useful if not using Jenkins as you can run the
35#                     job again via the api without needing this script.
36#                     Pod launches a container which runs to completion without
37#                     saving anything to the api when it completes.
38#
39###############################################################################
40# Trace bash processing
41set -x
42
43# Script Variables:
44build_scripts_dir=${build_scripts_dir:-"$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"}
45http_proxy=${http_proxy:-}
46qemu_dir=${qemu_dir:-${WORKSPACE}/qemu}
47WORKSPACE=${WORKSPACE:-${HOME}/${RANDOM}${RANDOM}}
48
49# Determine the architecture
50ARCH=$(uname -m)
51
52# Docker Image Build Variables:
53build_dir=${build_dir:-/tmp/qemu}
54img_name=${img_name:-qemu-build:${ARCH}}
55
56# Deployment Variables
57launch=${launch:-}
58
59# Timestamp for job
60echo "Build started, $(date)"
61
62# Setup Proxy
63if [[ -n "${http_proxy}" ]]; then
64PROXY="RUN echo \"Acquire::http::Proxy \\"\"${http_proxy}/\\"\";\" > /etc/apt/apt.conf.d/000apt-cacher-ng-proxy"
65fi
66
67# Determine the prefix of the Dockerfile's base image
68case ${ARCH} in
69  "ppc64le")
70    DOCKER_BASE="ppc64le/"
71    ;;
72  "x86_64")
73    DOCKER_BASE=""
74    ;;
75  *)
76    echo "Unsupported system architecture(${ARCH}) found for docker image"
77    exit 1
78esac
79
80# If there is no qemu directory, git clone in the openbmc mirror
81if [ ! -d ${qemu_dir} ]; then
82  echo "Clone in openbmc master to ${qemu_dir}"
83  git clone https://github.com/openbmc/qemu ${qemu_dir}
84fi
85
86# Create the docker run script
87export PROXY_HOST=${http_proxy/#http*:\/\/}
88export PROXY_HOST=${PROXY_HOST/%:[0-9]*}
89export PROXY_PORT=${http_proxy/#http*:\/\/*:}
90
91mkdir -p ${WORKSPACE}
92
93cat > "${WORKSPACE}"/build.sh << EOF_SCRIPT
94#!/bin/bash
95
96set -x
97
98# create a copy of the qemudir in /qemu to use as the build directory
99cp -a ${qemu_dir}/. ${build_dir}
100
101# Go into the build directory
102cd ${build_dir}
103
104gcc --version
105git submodule update --init dtc
106# disable anything that requires us to pull in X
107./configure \
108    --target-list=arm-softmmu \
109    --disable-spice \
110    --disable-docs \
111    --disable-gtk \
112    --disable-smartcard \
113    --disable-usb-redir \
114    --disable-libusb \
115    --disable-sdl \
116    --disable-gnutls \
117    --disable-vte \
118    --disable-vnc \
119    --disable-werror \
120    --disable-vnc-png
121make -j4
122
123cp -a ${build_dir}/arm-softmmu/. ${WORKSPACE}/arm-softmmu/
124EOF_SCRIPT
125
126chmod a+x ${WORKSPACE}/build.sh
127
128# Configure docker build
129Dockerfile=$(cat << EOF
130FROM ${DOCKER_BASE}ubuntu:16.04
131
132${PROXY}
133
134ENV DEBIAN_FRONTEND noninteractive
135RUN apt-get update && apt-get install -yy --no-install-recommends \
136    bison \
137    flex \
138    gcc \
139    git \
140    libc6-dev \
141    libfdt-dev \
142    libglib2.0-dev \
143    libpixman-1-dev \
144    make \
145    python-yaml \
146    python3-yaml \
147    iputils-ping
148
149RUN grep -q ${GROUPS} /etc/group || groupadd -g ${GROUPS} ${USER}
150RUN grep -q ${UID} /etc/passwd || useradd -d ${HOME} -m -u ${UID} -g ${GROUPS} ${USER}
151USER ${USER}
152RUN mkdir ${build_dir}
153ENV HOME ${HOME}
154EOF
155)
156
157docker build -t ${img_name} - <<< "${Dockerfile}"
158# If Launch is left empty will create a docker container
159if [[ "${launch}" == "" ]]; then
160
161  if [[ "$?" -ne 0 ]]; then
162    echo "Failed to build docker container."
163    exit 1
164  fi
165  mount_qemu="-v ""${qemu_dir}"":""${qemu_dir}"" "
166  if [[ "${qemu_dir}" = "${HOME}/"* || "${qemu_dir}" = "${HOME}" ]]; then
167    mount_qemu=""
168  fi
169  docker run \
170      --rm=true \
171      -e WORKSPACE=${WORKSPACE} \
172      -w "${HOME}" \
173      -v "${HOME}":"${HOME}" \
174      ${mount_qemu} \
175      -t ${img_name} \
176      ${WORKSPACE}/build.sh
177elif [[ "${launch}" == "pod" || "${launch}" == "job" ]]; then
178  . ${build_scripts_dir}/kubernetes/kubernetes-launch.sh QEMU-build true true
179else
180  echo "Launch Parameter is invalid"
181fi
182