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#
9e08e8702SAlanny Lopez# Script Variables:
10e08e8702SAlanny Lopez#  build_scripts_dir  The path of the openbmc-build-scripts directory.
11e08e8702SAlanny Lopez#                     Default: The directory containing this script
12e08e8702SAlanny Lopez#  http_proxy         The HTTP address of the proxy server to connect to.
13e08e8702SAlanny Lopez#                     Default: "", proxy is not setup if this is not set
141246b038SAlanny Lopez#  qemu_dir           Path of the directory that holds the QEMU repo, if none
15a61e99abSAlanny Lopez#                     exists will clone in the OpenBMC/QEMU repo to WORKSPACE.
16e08e8702SAlanny Lopez#                     Default: "${WORKSPACE}/qemu"
17e08e8702SAlanny Lopez#  WORKSPACE          Path of the workspace directory where some intermediate
18e08e8702SAlanny Lopez#                     files and the images will be saved to.
19e08e8702SAlanny Lopez#                     Default: "~/{RandomNumber}"
20cce369b6SAlanny Lopez#
21e08e8702SAlanny Lopez# Docker Image Build Variables:
221246b038SAlanny Lopez#  build_dir          Path of the directory that is created within the docker
23e08e8702SAlanny Lopez#                     container where the build is actually done. Done this way
241246b038SAlanny Lopez#                     to allow NFS volumes to be used as the qemu_dir.
25e08e8702SAlanny Lopez#                     Default: "/tmp/qemu"
261246b038SAlanny Lopez#  img_name           Defaults to qemu-build with the arch as its tag, can be
27e08e8702SAlanny Lopez#                     changed or passed to give a specific name to created image
28e08e8702SAlanny Lopez#
29e08e8702SAlanny Lopez# Deployment Variables:
30e08e8702SAlanny Lopez#  launch             ""|job|pod
31e08e8702SAlanny Lopez#                     Leave blank to launch via Docker if not using kubernetes
32e08e8702SAlanny 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###############################################################################
400b851182SJoel Stanley# Trace bash processing
410b851182SJoel Stanleyset -x
420b851182SJoel Stanley
43*4696770cSAlanny Lopez# Script Variables:
44*4696770cSAlanny Lopezbuild_scripts_dir=${build_scripts_dir:-"$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"}
450b851182SJoel Stanleyhttp_proxy=${http_proxy:-}
461246b038SAlanny Lopezqemu_dir=${qemu_dir:-${WORKSPACE}/qemu}
47*4696770cSAlanny LopezWORKSPACE=${WORKSPACE:-${HOME}/${RANDOM}${RANDOM}}
48*4696770cSAlanny Lopez
49*4696770cSAlanny Lopez# Docker Image Build Variables:
501246b038SAlanny Lopezbuild_dir=${build_dir:-/tmp/qemu}
511246b038SAlanny Lopezimg_name=${img_name:-qemu-build:${ARCH}}
520b851182SJoel Stanley
53*4696770cSAlanny Lopez# Deployment Variables
54*4696770cSAlanny Lopezlaunch=${launch:-}
55*4696770cSAlanny Lopez
56*4696770cSAlanny Lopez# Determine the architecture
57*4696770cSAlanny LopezARCH=$(uname -m)
58*4696770cSAlanny Lopez
590b851182SJoel Stanley# Timestamp for job
600b851182SJoel Stanleyecho "Build started, $(date)"
610b851182SJoel Stanley
6241e2ada2SAlanny Lopez# Setup Proxy
630b851182SJoel Stanleyif [[ -n "${http_proxy}" ]]; then
640b851182SJoel StanleyPROXY="RUN echo \"Acquire::http::Proxy \\"\"${http_proxy}/\\"\";\" > /etc/apt/apt.conf.d/000apt-cacher-ng-proxy"
650b851182SJoel Stanleyfi
660b851182SJoel Stanley
6741e2ada2SAlanny Lopez# Determine the prefix of the Dockerfile's base image
6841e2ada2SAlanny Lopezcase ${ARCH} in
6941e2ada2SAlanny Lopez  "ppc64le")
7041e2ada2SAlanny Lopez    DOCKER_BASE="ppc64le/"
7141e2ada2SAlanny Lopez    ;;
7241e2ada2SAlanny Lopez  "x86_64")
7341e2ada2SAlanny Lopez    DOCKER_BASE=""
7441e2ada2SAlanny Lopez    ;;
7541e2ada2SAlanny Lopez  *)
7641e2ada2SAlanny Lopez    echo "Unsupported system architecture(${ARCH}) found for docker image"
770b851182SJoel Stanley    exit 1
7841e2ada2SAlanny Lopezesac
790b851182SJoel Stanley
80cce369b6SAlanny Lopez# If there is no qemu directory, git clone in the openbmc mirror
811246b038SAlanny Lopezif [ ! -d ${qemu_dir} ]; then
821246b038SAlanny Lopez  echo "Clone in openbmc master to ${qemu_dir}"
831246b038SAlanny Lopez  git clone https://github.com/openbmc/qemu ${qemu_dir}
84cce369b6SAlanny Lopezfi
85cce369b6SAlanny Lopez
860b851182SJoel Stanley# Create the docker run script
870b851182SJoel Stanleyexport PROXY_HOST=${http_proxy/#http*:\/\/}
880b851182SJoel Stanleyexport PROXY_HOST=${PROXY_HOST/%:[0-9]*}
890b851182SJoel Stanleyexport PROXY_PORT=${http_proxy/#http*:\/\/*:}
900b851182SJoel Stanley
910b851182SJoel Stanleymkdir -p ${WORKSPACE}
920b851182SJoel Stanley
930b851182SJoel Stanleycat > "${WORKSPACE}"/build.sh << EOF_SCRIPT
940b851182SJoel Stanley#!/bin/bash
950b851182SJoel Stanley
960b851182SJoel Stanleyset -x
970b851182SJoel Stanley
98a61e99abSAlanny Lopez# create a copy of the qemudir in /qemu to use as the build directory
991246b038SAlanny Lopezcp -a ${qemu_dir}/. ${build_dir}
100a61e99abSAlanny Lopez
101a61e99abSAlanny Lopez# Go into the build directory
1021246b038SAlanny Lopezcd ${build_dir}
1030b851182SJoel Stanley
1040b851182SJoel Stanleygcc --version
10541e2ada2SAlanny Lopezgit submodule update --init dtc
1060b851182SJoel Stanley# disable anything that requires us to pull in X
107e30237caSAlanny Lopez./configure \
108e30237caSAlanny Lopez    --target-list=arm-softmmu \
109e30237caSAlanny Lopez    --disable-spice \
110e30237caSAlanny Lopez    --disable-docs \
111e30237caSAlanny Lopez    --disable-gtk \
112e30237caSAlanny Lopez    --disable-smartcard \
113e30237caSAlanny Lopez    --disable-usb-redir \
114e30237caSAlanny Lopez    --disable-libusb \
115e30237caSAlanny Lopez    --disable-sdl \
116e30237caSAlanny Lopez    --disable-gnutls \
117e30237caSAlanny Lopez    --disable-vte \
118e30237caSAlanny Lopez    --disable-vnc \
119e30237caSAlanny Lopez    --disable-vnc-png
1200b851182SJoel Stanleymake -j4
1210b851182SJoel Stanley
1221246b038SAlanny Lopezcp -a ${build_dir}/arm-softmmu/. ${WORKSPACE}/arm-softmmu/
1230b851182SJoel StanleyEOF_SCRIPT
1240b851182SJoel Stanley
1250b851182SJoel Stanleychmod a+x ${WORKSPACE}/build.sh
1260b851182SJoel Stanley
12741e2ada2SAlanny Lopez# Configure docker build
12841e2ada2SAlanny LopezDockerfile=$(cat << EOF
12941e2ada2SAlanny LopezFROM ${DOCKER_BASE}ubuntu:16.04
13041e2ada2SAlanny Lopez
13141e2ada2SAlanny Lopez${PROXY}
13241e2ada2SAlanny Lopez
13341e2ada2SAlanny LopezENV DEBIAN_FRONTEND noninteractive
13441e2ada2SAlanny LopezRUN apt-get update && apt-get install -yy --no-install-recommends \
13541e2ada2SAlanny Lopez    bison \
13641e2ada2SAlanny Lopez    flex \
13741e2ada2SAlanny Lopez    gcc \
13841e2ada2SAlanny Lopez    git \
13941e2ada2SAlanny Lopez    libc6-dev \
14041e2ada2SAlanny Lopez    libfdt-dev \
14141e2ada2SAlanny Lopez    libglib2.0-dev \
14241e2ada2SAlanny Lopez    libpixman-1-dev \
14341e2ada2SAlanny Lopez    make \
14441e2ada2SAlanny Lopez    python-yaml \
1455158a324SSaqib Khan    python3-yaml \
1465158a324SSaqib Khan    iputils-ping
14741e2ada2SAlanny Lopez
14841e2ada2SAlanny LopezRUN grep -q ${GROUPS} /etc/group || groupadd -g ${GROUPS} ${USER}
14941e2ada2SAlanny LopezRUN grep -q ${UID} /etc/passwd || useradd -d ${HOME} -m -u ${UID} -g ${GROUPS} ${USER}
15041e2ada2SAlanny LopezUSER ${USER}
1511246b038SAlanny LopezRUN mkdir ${build_dir}
15241e2ada2SAlanny LopezENV HOME ${HOME}
15341e2ada2SAlanny LopezEOF
15441e2ada2SAlanny Lopez)
15541e2ada2SAlanny Lopez
1561246b038SAlanny Lopezdocker build -t ${img_name} - <<< "${Dockerfile}"
15741e2ada2SAlanny Lopez# If Launch is left empty will create a docker container
15841e2ada2SAlanny Lopezif [[ "${launch}" == "" ]]; then
15941e2ada2SAlanny Lopez
16041e2ada2SAlanny Lopez  if [[ "$?" -ne 0 ]]; then
16141e2ada2SAlanny Lopez    echo "Failed to build docker container."
16241e2ada2SAlanny Lopez    exit 1
16341e2ada2SAlanny Lopez  fi
1641246b038SAlanny Lopez  mount_qemu="-v ""${qemu_dir}"":""${qemu_dir}"" "
1651246b038SAlanny Lopez  if [[ "${qemu_dir}" = "${HOME}/"* || "${qemu_dir}" = "${HOME}" ]]; then
1661246b038SAlanny Lopez    mount_qemu=""
167cce369b6SAlanny Lopez  fi
168e30237caSAlanny Lopez  docker run \
169e30237caSAlanny Lopez      --rm=true \
170e30237caSAlanny Lopez      -e WORKSPACE=${WORKSPACE} \
171e30237caSAlanny Lopez      -w "${HOME}" \
172e30237caSAlanny Lopez      -v "${HOME}":"${HOME}" \
1731246b038SAlanny Lopez      ${mount_qemu} \
1741246b038SAlanny Lopez      -t ${img_name} \
175e30237caSAlanny Lopez      ${WORKSPACE}/build.sh
176634ce36dSAlanny Lopezelif [[ "${launch}" == "pod" || "${launch}" == "job" ]]; then
177e08e8702SAlanny Lopez  . ${build_scripts_dir}/kubernetes/kubernetes-launch.sh QEMU-build true true
17841e2ada2SAlanny Lopezelse
17941e2ada2SAlanny Lopez  echo "Launch Parameter is invalid"
18041e2ada2SAlanny Lopezfi
181