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