#!/bin/bash

# This build script is for running the Jenkins builds using docker.
#

# Debug
if grep -q debug <<< $@; then
	set -x
fi
set -o errexit
set -o pipefail
set -o nounset

# Default variables
WORKSPACE=${WORKSPACE:-${HOME}/${RANDOM}${RANDOM}}
http_proxy=${http_proxy:-}
ENDIANESS=${ENDIANESS:-le}
PROXY=""

usage(){
	cat << EOF_USAGE
Usage: $0 [options]

Options:
--endianess <le|be>	build an LE or BE initramfs

Short Options:
-e			same as --endianess

EOF_USAGE
	exit 1
}

# Arguments
CMD_LINE=$(getopt -o d,e: --longoptions debug,endianess: -n "$0" -- "$@")
eval set -- "${CMD_LINE}"

while true ; do
	case "${1}" in
		-e|--endianess)
			if [[ "${2,,}" == "be" ]]; then
				ENDIANESS=""
			fi
			shift 2
			;;
		-d|--debug)
			set -x
			shift
			;;
		--)
			shift
			break
			;;
		*)
			usage
			;;
	esac
done

# Timestamp for job
echo "Build started, $(date)"

# Configure docker build
if [[ -n "${http_proxy}" ]]; then
	PROXY="RUN echo \"Acquire::http::Proxy \\"\"${http_proxy}/\\"\";\" > /etc/apt/apt.conf.d/000apt-cacher-ng-proxy"
fi

Dockerfile=$(cat << EOF
FROM ubuntu:18.04

${PROXY}

ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get install -yy \
	bc \
	build-essential \
	ccache \
	cpio \
	git \
	python \
	unzip \
	wget \
	rsync \
	iputils-ping \
	locales

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}

RUN locale-gen en_AU.utf8

USER ${USER}
ENV HOME ${HOME}
RUN /bin/bash
EOF
)

# Build the docker container
docker build -t initramfs-build/ubuntu - <<< "${Dockerfile}"
if [[ "$?" -ne 0 ]]; then
	echo "Failed to build docker container."
	exit 1
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

export http_proxy=${http_proxy}
export https_proxy=${http_proxy}
export ftp_proxy=${http_proxy}

cd "${WORKSPACE}"

# Go into the linux directory (the script will put us in a build subdir)
cd buildroot && make clean

# Build PPC64 defconfig
cat >> configs/powerpc64${ENDIANESS}_openpower_defconfig << EOF_BUILDROOT
BR2_powerpc64${ENDIANESS}=y
BR2_CCACHE=y
BR2_SYSTEM_BIN_SH_BASH=y
BR2_TARGET_GENERIC_GETTY_PORT="hvc0"
BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y
BR2_TARGET_ROOTFS_CPIO=y
BR2_TARGET_ROOTFS_CPIO_XZ=y
# BR2_TARGET_ROOTFS_TAR is not set
EOF_BUILDROOT

# Build buildroot
export BR2_DL_DIR="${HOME}/buildroot_downloads"
make powerpc64${ENDIANESS}_openpower_defconfig
make

EOF_SCRIPT

chmod a+x "${WORKSPACE}/build.sh"

# Run the docker container, execute the build script we just built
docker run \
	--cap-add=sys_admin \
	--net=host \
	--rm=true \
	-e WORKSPACE="${WORKSPACE}" \
	--user="${USER}" \
	-w "${HOME}" \
	-v "${HOME}":"${HOME}" \
	-t initramfs-build/ubuntu \
	"${WORKSPACE}/build.sh"

# Timestamp for build
echo "Build completed, $(date)"

