10b851182SJoel Stanley#!/bin/bash
2cce369b6SAlanny Lopez###############################################################################
3cce369b6SAlanny Lopez#
4cce369b6SAlanny Lopez# This build script is for running the QEMU build as a container with the
5cce369b6SAlanny Lopez# option of launching the container with Docker or Kubernetes.
6cce369b6SAlanny Lopez#
7cce369b6SAlanny Lopez###############################################################################
8cce369b6SAlanny Lopez#
9*e08e8702SAlanny Lopez# Script Variables:
10*e08e8702SAlanny Lopez#  build_scripts_dir  The path of the openbmc-build-scripts directory.
11*e08e8702SAlanny Lopez#                     Default: The directory containing this script
12*e08e8702SAlanny Lopez#  http_proxy         The HTTP address of the proxy server to connect to.
13*e08e8702SAlanny Lopez#                     Default: "", proxy is not setup if this is not set
14*e08e8702SAlanny Lopez#  qemudir            Path of the directory that holds the QEMU repo, if none
15a61e99abSAlanny Lopez#                     exists will clone in the OpenBMC/QEMU repo to WORKSPACE.
16*e08e8702SAlanny Lopez#                     Default: "${WORKSPACE}/qemu"
17*e08e8702SAlanny Lopez#  WORKSPACE          Path of the workspace directory where some intermediate
18*e08e8702SAlanny Lopez#                     files and the images will be saved to.
19*e08e8702SAlanny Lopez#                     Default: "~/{RandomNumber}"
20cce369b6SAlanny Lopez#
21*e08e8702SAlanny Lopez# Docker Image Build Variables:
22*e08e8702SAlanny Lopez#  builddir           Path of the directory that is created within the docker
23*e08e8702SAlanny Lopez#                     container where the build is actually done. Done this way
24*e08e8702SAlanny Lopez#                     to allow NFS volumes to be used as the qemudir.
25*e08e8702SAlanny Lopez#                     Default: "/tmp/qemu"
26*e08e8702SAlanny Lopez#  imgname            Defaults to qemu-build with the arch as its tag, can be
27*e08e8702SAlanny Lopez#                     changed or passed to give a specific name to created image
28*e08e8702SAlanny Lopez#
29*e08e8702SAlanny Lopez# Deployment Variables:
30*e08e8702SAlanny Lopez#  launch             ""|job|pod
31*e08e8702SAlanny Lopez#                     Leave blank to launch via Docker if not using kubernetes
32*e08e8702SAlanny Lopez#                     to launch the container.
33cce369b6SAlanny Lopez#                     Job lets you keep a copy of job and container logs on the
34cce369b6SAlanny Lopez#                     api, can be useful if not using Jenkins as you can run the
35cce369b6SAlanny Lopez#                     job again via the api without needing this script.
36cce369b6SAlanny Lopez#                     Pod launches a container which runs to completion without
37cce369b6SAlanny Lopez#                     saving anything to the api when it completes.
38cce369b6SAlanny Lopez#
39cce369b6SAlanny Lopez###############################################################################
40*e08e8702SAlanny Lopezbuild_scripts_dir=${build_scripts_dir:-"$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"}
410b851182SJoel Stanley
420b851182SJoel Stanley# Trace bash processing
430b851182SJoel Stanleyset -x
440b851182SJoel Stanley
450b851182SJoel Stanley# Default variables
460b851182SJoel StanleyWORKSPACE=${WORKSPACE:-${HOME}/${RANDOM}${RANDOM}}
470b851182SJoel Stanleyhttp_proxy=${http_proxy:-}
4841e2ada2SAlanny Lopezlaunch=${launch:-}
49cce369b6SAlanny Lopezqemudir=${qemudir:-${WORKSPACE}/qemu}
50a61e99abSAlanny Lopezbuilddir=${builddir:-/tmp/qemu}
51cce369b6SAlanny LopezARCH=$(uname -m)
52cce369b6SAlanny Lopezimgname=${imgname:-qemu-build:${ARCH}}
530b851182SJoel Stanley
540b851182SJoel Stanley# Timestamp for job
550b851182SJoel Stanleyecho "Build started, $(date)"
560b851182SJoel Stanley
5741e2ada2SAlanny Lopez# Setup Proxy
580b851182SJoel Stanleyif [[ -n "${http_proxy}" ]]; then
590b851182SJoel StanleyPROXY="RUN echo \"Acquire::http::Proxy \\"\"${http_proxy}/\\"\";\" > /etc/apt/apt.conf.d/000apt-cacher-ng-proxy"
600b851182SJoel Stanleyfi
610b851182SJoel Stanley
6241e2ada2SAlanny Lopez# Determine the prefix of the Dockerfile's base image
6341e2ada2SAlanny Lopezcase ${ARCH} in
6441e2ada2SAlanny Lopez  "ppc64le")
6541e2ada2SAlanny Lopez    DOCKER_BASE="ppc64le/"
6641e2ada2SAlanny Lopez    ;;
6741e2ada2SAlanny Lopez  "x86_64")
6841e2ada2SAlanny Lopez    DOCKER_BASE=""
6941e2ada2SAlanny Lopez    ;;
7041e2ada2SAlanny Lopez  *)
7141e2ada2SAlanny Lopez    echo "Unsupported system architecture(${ARCH}) found for docker image"
720b851182SJoel Stanley    exit 1
7341e2ada2SAlanny Lopezesac
740b851182SJoel Stanley
75cce369b6SAlanny Lopez# If there is no qemu directory, git clone in the openbmc mirror
76cce369b6SAlanny Lopezif [ ! -d ${qemudir} ]; then
77cce369b6SAlanny Lopez  echo "Clone in openbmc master to ${qemudir}"
78cce369b6SAlanny Lopez  git clone https://github.com/openbmc/qemu ${qemudir}
79cce369b6SAlanny Lopezfi
80cce369b6SAlanny Lopez
810b851182SJoel Stanley# Create the docker run script
820b851182SJoel Stanleyexport PROXY_HOST=${http_proxy/#http*:\/\/}
830b851182SJoel Stanleyexport PROXY_HOST=${PROXY_HOST/%:[0-9]*}
840b851182SJoel Stanleyexport PROXY_PORT=${http_proxy/#http*:\/\/*:}
850b851182SJoel Stanley
860b851182SJoel Stanleymkdir -p ${WORKSPACE}
870b851182SJoel Stanley
880b851182SJoel Stanleycat > "${WORKSPACE}"/build.sh << EOF_SCRIPT
890b851182SJoel Stanley#!/bin/bash
900b851182SJoel Stanley
910b851182SJoel Stanleyset -x
920b851182SJoel Stanley
93a61e99abSAlanny Lopez# create a copy of the qemudir in /qemu to use as the build directory
94a61e99abSAlanny Lopezcp -a ${qemudir}/. ${builddir}
95a61e99abSAlanny Lopez
96a61e99abSAlanny Lopez# Go into the build directory
97a61e99abSAlanny Lopezcd ${builddir}
980b851182SJoel Stanley
990b851182SJoel Stanleygcc --version
10041e2ada2SAlanny Lopezgit submodule update --init dtc
1010b851182SJoel Stanley# disable anything that requires us to pull in X
102e30237caSAlanny Lopez./configure \
103e30237caSAlanny Lopez    --target-list=arm-softmmu \
104e30237caSAlanny Lopez    --disable-spice \
105e30237caSAlanny Lopez    --disable-docs \
106e30237caSAlanny Lopez    --disable-gtk \
107e30237caSAlanny Lopez    --disable-smartcard \
108e30237caSAlanny Lopez    --disable-usb-redir \
109e30237caSAlanny Lopez    --disable-libusb \
110e30237caSAlanny Lopez    --disable-sdl \
111e30237caSAlanny Lopez    --disable-gnutls \
112e30237caSAlanny Lopez    --disable-vte \
113e30237caSAlanny Lopez    --disable-vnc \
114e30237caSAlanny Lopez    --disable-vnc-png
1150b851182SJoel Stanleymake -j4
1160b851182SJoel Stanley
117a61e99abSAlanny Lopezcp -a ${builddir}/arm-softmmu/. ${WORKSPACE}/arm-softmmu/
1180b851182SJoel StanleyEOF_SCRIPT
1190b851182SJoel Stanley
1200b851182SJoel Stanleychmod a+x ${WORKSPACE}/build.sh
1210b851182SJoel Stanley
12241e2ada2SAlanny Lopez# Configure docker build
12341e2ada2SAlanny LopezDockerfile=$(cat << EOF
12441e2ada2SAlanny LopezFROM ${DOCKER_BASE}ubuntu:16.04
12541e2ada2SAlanny Lopez
12641e2ada2SAlanny Lopez${PROXY}
12741e2ada2SAlanny Lopez
12841e2ada2SAlanny LopezENV DEBIAN_FRONTEND noninteractive
12941e2ada2SAlanny LopezRUN apt-get update && apt-get install -yy --no-install-recommends \
13041e2ada2SAlanny Lopez    bison \
13141e2ada2SAlanny Lopez    flex \
13241e2ada2SAlanny Lopez    gcc \
13341e2ada2SAlanny Lopez    git \
13441e2ada2SAlanny Lopez    libc6-dev \
13541e2ada2SAlanny Lopez    libfdt-dev \
13641e2ada2SAlanny Lopez    libglib2.0-dev \
13741e2ada2SAlanny Lopez    libpixman-1-dev \
13841e2ada2SAlanny Lopez    make \
13941e2ada2SAlanny Lopez    python-yaml \
1405158a324SSaqib Khan    python3-yaml \
1415158a324SSaqib Khan    iputils-ping
14241e2ada2SAlanny Lopez
14341e2ada2SAlanny LopezRUN grep -q ${GROUPS} /etc/group || groupadd -g ${GROUPS} ${USER}
14441e2ada2SAlanny LopezRUN grep -q ${UID} /etc/passwd || useradd -d ${HOME} -m -u ${UID} -g ${GROUPS} ${USER}
14541e2ada2SAlanny LopezUSER ${USER}
146a61e99abSAlanny LopezRUN mkdir ${builddir}
14741e2ada2SAlanny LopezENV HOME ${HOME}
14841e2ada2SAlanny LopezEOF
14941e2ada2SAlanny Lopez)
15041e2ada2SAlanny Lopez
15151186883SAlanny Lopezdocker build -t ${imgname} - <<< "${Dockerfile}"
15241e2ada2SAlanny Lopez# If Launch is left empty will create a docker container
15341e2ada2SAlanny Lopezif [[ "${launch}" == "" ]]; then
15441e2ada2SAlanny Lopez
15541e2ada2SAlanny Lopez  if [[ "$?" -ne 0 ]]; then
15641e2ada2SAlanny Lopez    echo "Failed to build docker container."
15741e2ada2SAlanny Lopez    exit 1
15841e2ada2SAlanny Lopez  fi
159cce369b6SAlanny Lopez  mountqemu="-v ""${qemudir}"":""${qemudir}"" "
160cce369b6SAlanny Lopez  if [[ "${qemudir}" = "${HOME}/"* || "${qemudir}" = "${HOME}" ]]; then
161cce369b6SAlanny Lopez    mountqemu=""
162cce369b6SAlanny Lopez  fi
163e30237caSAlanny Lopez  docker run \
164e30237caSAlanny Lopez      --rm=true \
165e30237caSAlanny Lopez      -e WORKSPACE=${WORKSPACE} \
166e30237caSAlanny Lopez      -w "${HOME}" \
167e30237caSAlanny Lopez      -v "${HOME}":"${HOME}" \
168cce369b6SAlanny Lopez      ${mountqemu} \
16941e2ada2SAlanny Lopez      -t ${imgname} \
170e30237caSAlanny Lopez      ${WORKSPACE}/build.sh
171634ce36dSAlanny Lopezelif [[ "${launch}" == "pod" || "${launch}" == "job" ]]; then
172*e08e8702SAlanny Lopez  . ${build_scripts_dir}/kubernetes/kubernetes-launch.sh QEMU-build true true
17341e2ada2SAlanny Lopezelse
17441e2ada2SAlanny Lopez  echo "Launch Parameter is invalid"
17541e2ada2SAlanny Lopezfi
176