| #!/bin/bash | 
 | ############################################################################### | 
 | # | 
 | # This build script is for running the QEMU build as a container with the | 
 | # option of launching the container with Docker or Kubernetes. | 
 | # | 
 | ############################################################################### | 
 | # | 
 | # Variables used for in the build: | 
 | #  WORKSPACE    = Path of the workspace directory where some intermediate files | 
 | #                 and the images will be saved to. | 
 | #  qemudir      = Path of the directory that holds the QEMU repo, if none | 
 | #                 exists will clone in the OpenBMC/QEMU repo to WORKSPACE. | 
 | #  builddir     = Path of the directory that is created within the docker | 
 | #                 container where the build is actually done. Done this way to | 
 | #                 allow external volumes to be used for the qemudir. | 
 | # | 
 | # Optional Variables: | 
 | #  launch       = job|pod | 
 | #                 Can be left blank to launch via Docker if not using | 
 | #                 Kubernetes to launch the container. | 
 | #                 Job lets you keep a copy of job and container logs on the | 
 | #                 api, can be useful if not using Jenkins as you can run the | 
 | #                 job again via the api without needing this script. | 
 | #                 Pod launches a container which runs to completion without | 
 | #                 saving anything to the api when it completes. | 
 | #  imgname      = Defaults to qemu-build with the arch as its tag, can be | 
 | #                 changed or passed to give a specific name to created image. | 
 | #  http_proxy   = The HTTP address for the proxy server you wish to connect to. | 
 | # | 
 | ############################################################################### | 
 |  | 
 | # Trace bash processing | 
 | set -x | 
 |  | 
 | # Default variables | 
 | WORKSPACE=${WORKSPACE:-${HOME}/${RANDOM}${RANDOM}} | 
 | http_proxy=${http_proxy:-} | 
 | launch=${launch:-} | 
 | qemudir=${qemudir:-${WORKSPACE}/qemu} | 
 | builddir=${builddir:-/tmp/qemu} | 
 | ARCH=$(uname -m) | 
 | imgname=${imgname:-qemu-build:${ARCH}} | 
 |  | 
 | # Timestamp for job | 
 | echo "Build started, $(date)" | 
 |  | 
 | # Setup Proxy | 
 | if [[ -n "${http_proxy}" ]]; then | 
 | PROXY="RUN echo \"Acquire::http::Proxy \\"\"${http_proxy}/\\"\";\" > /etc/apt/apt.conf.d/000apt-cacher-ng-proxy" | 
 | fi | 
 |  | 
 | # Determine the prefix of the Dockerfile's base image | 
 | case ${ARCH} in | 
 |   "ppc64le") | 
 |     DOCKER_BASE="ppc64le/" | 
 |     ;; | 
 |   "x86_64") | 
 |     DOCKER_BASE="" | 
 |     ;; | 
 |   *) | 
 |     echo "Unsupported system architecture(${ARCH}) found for docker image" | 
 |     exit 1 | 
 | esac | 
 |  | 
 | # If there is no qemu directory, git clone in the openbmc mirror | 
 | if [ ! -d ${qemudir} ]; then | 
 |   echo "Clone in openbmc master to ${qemudir}" | 
 |   git clone https://github.com/openbmc/qemu ${qemudir} | 
 | fi | 
 |  | 
 | # Create the docker run script | 
 | export PROXY_HOST=${http_proxy/#http*:\/\/} | 
 | export PROXY_HOST=${PROXY_HOST/%:[0-9]*} | 
 | export PROXY_PORT=${http_proxy/#http*:\/\/*:} | 
 |  | 
 | mkdir -p ${WORKSPACE} | 
 |  | 
 | cat > "${WORKSPACE}"/build.sh << EOF_SCRIPT | 
 | #!/bin/bash | 
 |  | 
 | set -x | 
 |  | 
 | # create a copy of the qemudir in /qemu to use as the build directory | 
 | cp -a ${qemudir}/. ${builddir} | 
 |  | 
 | # Go into the build directory | 
 | cd ${builddir} | 
 |  | 
 | gcc --version | 
 | git submodule update --init dtc | 
 | # disable anything that requires us to pull in X | 
 | ./configure \ | 
 |     --target-list=arm-softmmu \ | 
 |     --disable-spice \ | 
 |     --disable-docs \ | 
 |     --disable-gtk \ | 
 |     --disable-smartcard \ | 
 |     --disable-usb-redir \ | 
 |     --disable-libusb \ | 
 |     --disable-sdl \ | 
 |     --disable-gnutls \ | 
 |     --disable-vte \ | 
 |     --disable-vnc \ | 
 |     --disable-vnc-png | 
 | make -j4 | 
 |  | 
 | cp -a ${builddir}/arm-softmmu/. ${WORKSPACE}/arm-softmmu/ | 
 | EOF_SCRIPT | 
 |  | 
 | chmod a+x ${WORKSPACE}/build.sh | 
 |  | 
 | # Configure docker build | 
 | Dockerfile=$(cat << EOF | 
 | FROM ${DOCKER_BASE}ubuntu:16.04 | 
 |  | 
 | ${PROXY} | 
 |  | 
 | ENV DEBIAN_FRONTEND noninteractive | 
 | RUN apt-get update && apt-get install -yy --no-install-recommends \ | 
 |     bison \ | 
 |     flex \ | 
 |     gcc \ | 
 |     git \ | 
 |     libc6-dev \ | 
 |     libfdt-dev \ | 
 |     libglib2.0-dev \ | 
 |     libpixman-1-dev \ | 
 |     make \ | 
 |     python-yaml \ | 
 |     python3-yaml \ | 
 |     iputils-ping | 
 |  | 
 | RUN grep -q ${GROUPS} /etc/group || groupadd -g ${GROUPS} ${USER} | 
 | RUN grep -q ${UID} /etc/passwd || useradd -d ${HOME} -m -u ${UID} -g ${GROUPS} ${USER} | 
 | USER ${USER} | 
 | RUN mkdir ${builddir} | 
 | ENV HOME ${HOME} | 
 | EOF | 
 | ) | 
 |  | 
 | docker build -t ${imgname} - <<< "${Dockerfile}" | 
 | # If Launch is left empty will create a docker container | 
 | if [[ "${launch}" == "" ]]; then | 
 |  | 
 |   if [[ "$?" -ne 0 ]]; then | 
 |     echo "Failed to build docker container." | 
 |     exit 1 | 
 |   fi | 
 |   mountqemu="-v ""${qemudir}"":""${qemudir}"" " | 
 |   if [[ "${qemudir}" = "${HOME}/"* || "${qemudir}" = "${HOME}" ]]; then | 
 |     mountqemu="" | 
 |   fi | 
 |   docker run \ | 
 |       --rm=true \ | 
 |       -e WORKSPACE=${WORKSPACE} \ | 
 |       -w "${HOME}" \ | 
 |       -v "${HOME}":"${HOME}" \ | 
 |       ${mountqemu} \ | 
 |       -t ${imgname} \ | 
 |       ${WORKSPACE}/build.sh | 
 | elif [[ "${launch}" == "pod" || "${launch}" == "job" ]]; then | 
 |   . ./kubernetes/kubernetes-launch.sh QEMU-build true true | 
 | else | 
 |   echo "Launch Parameter is invalid" | 
 | fi | 
 |  | 
 |  |