#!/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:-}
ENDIANNESS=${ENDIANNESS:-le}
PROXY=""

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

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

Short Options:
-e			same as --endianness

EOF_USAGE
    exit 1
}

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

while true ; do
    case "${1}" in
        -e|--endianness)
            if [[ "${2,,}" == "be" ]]; then
                ENDIANNESS=""
            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[0]} /etc/group || groupadd -g ${GROUPS[0]} ${USER}
RUN grep -q ${UID} /etc/passwd || useradd -d ${HOME} -m -u ${UID} -g ${GROUPS[0]} ${USER}

RUN locale-gen en_AU.utf8

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

# Build the docker container
if ! docker build -t initramfs-build/ubuntu - <<< "${Dockerfile}" ; 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${ENDIANNESS}_openpower_defconfig << EOF_BUILDROOT
BR2_powerpc64${ENDIANNESS}=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_PACKAGE_IPMITOOL=y
# BR2_TARGET_ROOTFS_TAR is not set
EOF_BUILDROOT

# Build buildroot
export BR2_DL_DIR="${HOME}/buildroot_downloads"
make powerpc64${ENDIANNESS}_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)"

