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