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-vnc-png 120make -j4 121 122cp -a ${build_dir}/arm-softmmu/. ${WORKSPACE}/arm-softmmu/ 123EOF_SCRIPT 124 125chmod a+x ${WORKSPACE}/build.sh 126 127# Configure docker build 128Dockerfile=$(cat << EOF 129FROM ${DOCKER_BASE}ubuntu:16.04 130 131${PROXY} 132 133ENV DEBIAN_FRONTEND noninteractive 134RUN apt-get update && apt-get install -yy --no-install-recommends \ 135 bison \ 136 flex \ 137 gcc \ 138 git \ 139 libc6-dev \ 140 libfdt-dev \ 141 libglib2.0-dev \ 142 libpixman-1-dev \ 143 make \ 144 python-yaml \ 145 python3-yaml \ 146 iputils-ping 147 148RUN grep -q ${GROUPS} /etc/group || groupadd -g ${GROUPS} ${USER} 149RUN grep -q ${UID} /etc/passwd || useradd -d ${HOME} -m -u ${UID} -g ${GROUPS} ${USER} 150USER ${USER} 151RUN mkdir ${build_dir} 152ENV HOME ${HOME} 153EOF 154) 155 156docker build -t ${img_name} - <<< "${Dockerfile}" 157# If Launch is left empty will create a docker container 158if [[ "${launch}" == "" ]]; then 159 160 if [[ "$?" -ne 0 ]]; then 161 echo "Failed to build docker container." 162 exit 1 163 fi 164 mount_qemu="-v ""${qemu_dir}"":""${qemu_dir}"" " 165 if [[ "${qemu_dir}" = "${HOME}/"* || "${qemu_dir}" = "${HOME}" ]]; then 166 mount_qemu="" 167 fi 168 docker run \ 169 --rm=true \ 170 -e WORKSPACE=${WORKSPACE} \ 171 -w "${HOME}" \ 172 -v "${HOME}":"${HOME}" \ 173 ${mount_qemu} \ 174 -t ${img_name} \ 175 ${WORKSPACE}/build.sh 176elif [[ "${launch}" == "pod" || "${launch}" == "job" ]]; then 177 . ${build_scripts_dir}/kubernetes/kubernetes-launch.sh QEMU-build true true 178else 179 echo "Launch Parameter is invalid" 180fi 181