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