#!/bin/bash
# Copyright 2015 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# This script builds gpu drivers (mali-drivers[-bifrost], img-ddk) for a list
# of boards. It uploads the binaries to Google storage and makes them available
# in the public repository.

# Loads script libraries.
CONTRIB_DIR=$(dirname "$(readlink -f "$0")")
. "${CONTRIB_DIR}/common.sh" || exit 1

DEFINE_string package "" \
  "selects which gpu drivers package to build"
DEFINE_boolean dryrun ${FLAGS_FALSE} \
  "dry run, don't upload anything and don't delete temporary dirs" n
DEFINE_boolean usebinpkg ${FLAGS_TRUE} \
  "use prebuilt binaries, instead of building driver locally" b

# Parse command line.
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"

# Script must run inside the chroot.
assert_inside_chroot

# All drivers are in media-libs/ portage category.
CATEGORY="media-libs"
# List of supported drivers
DRIVERS="mali-drivers mali-drivers-bifrost img-ddk"

# List of parameters to pass to build_board, for a given package $pn:
#  - Build board names.
#  - Suffixes for tarball name.
#  - Overlay paths for each board.
#
# Variable name: "PARAMS_${pn//-/_}"

PARAMS_mali_drivers=(
  "daisy daisy overlay-daisy"
  "kevin gru baseboard-gru"
  "peach_pit peach overlay-peach"
  "veyron_jerry veyron overlay-veyron"
)

PARAMS_mali_drivers_bifrost=(
  "kukui kukui chipset-mt8183"
)

PARAMS_img_ddk=(
  "elm oak chipset-mt8173"
)

create_run_script() {
  local script="$1"
  local outputtarball="$2"

  cat > "${script}" <<\__HDREOF__
#!/bin/sh
#
# Copyright 2015 The Chromium OS Authors. All rights reserved.
#
# Usage is subject to the enclosed license agreement.
# To be generated by Makeself 1.5.3
skip=@HDRSZ@
echo
echo The license for this software will now be displayed.
echo You must agree to this license before using this software.
echo

more << __EOF__
__HDREOF__

  cat "${SRC_ROOT}/third_party/chromiumos-overlay/licenses/Google-TOS" >> "${script}"
  echo __EOF__ >> "${script}"
  cat >> "${script}" <<\__BODYEOF__
if [ $? != 0 ]; then
  echo "ERROR: Couldn't display license file" 1>&2
  exit 1
fi

echo

printf 'Type "y" if you agree to the terms of the license: '
read typed

if [ "${typed}" != y ]; then
  echo
  echo "You didn't accept the license. Extraction aborted."
  exit 2
fi

echo

tail -n +${skip} "$0" | tar xjv 2>/dev/null

if [ $? -ne 0 ]; then
  echo
  echo "ERROR: Couldn't extract files." 1>&2
  exit 3
else
  echo
  echo "Files extracted successfully."
fi
exit 0
__BODYEOF__

  local hdrsize=$(wc -l < "${script}")

  sed -i "s/@HDRSZ@/$(( hdrsize + 1 ))/g" "${script}"

  cat "${outputtarball}" >> "${script}"

  chmod +x "${script}"
  du -b "${script}"
}

# arguments:
# $1 board name (Chrome OS board name to build)
# $2 binary package suffix (suffix added to tar package name)
# $3 overlay path

build_board() {
  local board=$1
  local suffix=$2
  local opath=$3
  echo "Board is ${board}"

  # Source PVR (e.g. 13.0-r6)
  local pvr
  local inputtarball

  local temp=$(mktemp -d)
  echo "Temp dir is ${temp}"
  pushd "${temp}" > /dev/null

  if [[ ${FLAGS_usebinpkg} -eq ${FLAGS_TRUE} ]]; then
    # Fetch binary package from Google Storage.
    local partner_overlay="${SRC_ROOT}/private-overlays/chromeos-partner-overlay"

    # Fetch latest preflight prebuilt version.
    git --git-dir "${partner_overlay}/.git" fetch --all
    local binhost_gs="$(git --git-dir "${partner_overlay}/.git" show \
        "m/master:chromeos/binhost/target/${board}-PREFLIGHT_BINHOST.conf" | \
      sed -nE 's/PREFLIGHT_BINHOST=\"(.*)\"/\1/p')"

    # Parse Packages file to find GS path of the latest ${pn} prebuilt.
    local prebuilt_path="$(gsutil cat "${binhost_gs}Packages" | \
      awk '
        $1 == "CPV:" && $2 ~ /'"${CATEGORY}"'\/'"${pn}"'-[0-9]/ { m = 1 }
        m && $1 == "PATH:" { print $2 }
        m && $1 == "" { exit }
      ')"
    local package_gs="gs://chromeos-prebuilt/${prebuilt_path}"

    gsutil cp "${package_gs}" .

    inputtarball="${temp}/${package_gs##*/}"
    pvr="${package_gs%.*}"
    pvr="${pvr##*${pn}-}"
  else
    # Build from source.
    "${SRC_ROOT}/scripts/setup_board" --board="${board}"
    if [[ $? != 0 ]]; then
      die "Setting up board ${board} failed."
    fi

    # Make sure we are not building -9999 ebuild.
    # This could fail if cros_workon is already stopped so ignore return code.
    cros_workon --board="${board}" stop "${pn}"

    "emerge-${board}" "${pn}"

    if [[ $? != 0 ]]; then
      die "Emerging ${pn} for ${board} failed."
    fi

    pvr="$("equery-${board}" -q list -p -o --format="\$fullversion" "${pn}" | \
           sort -V | head -n 1)"
    inputtarball="/build/${board}/packages/${CATEGORY}/${pn}-${pvr}.tbz2"
  fi

  # Binary PV (e.g. 13.0_p6)
  local pv="${pvr/-r/_p}"
  local outputtarball="${pn}-${suffix}-${pv}.tbz2"
  local script="${pn}-${suffix}-${pv}.run"
  local gspath="gs://chromeos-localmirror/distfiles"

  echo "Current version is ${pvr}"
  echo "Input tarball is ${inputtarball}"
  echo "Output tarball is ${outputtarball}"
  echo "Script is ${script}"

  mkdir work
  if [[ $? != 0 ]]; then
    die "Couldn't create work directory."
  fi

  tar -C work -xpjvf "${inputtarball}"
  if [[ $? != 0 ]]; then
    die "Couldn't decompress package tarball ${inputtarball}."
  fi

  tar -C work --exclude=usr/lib/debug -cpjvf "${outputtarball}" ./
  if [[ $? != 0 ]]; then
    die "Couldn't create ${outputtarball}."
  fi

  create_run_script "${script}" "${outputtarball}"

  echo "Uploading tarball to ${gspath}/${script}"
  if [[ ${FLAGS_dryrun} -eq ${FLAGS_TRUE} ]]; then
    echo "Would run: gsutil cp -a public-read \"${script}\" \"${gspath}/${script}\""
  else
    gsutil cp -a public-read "${script}" "${gspath}/${script}"
    if [[ $? != 0 ]]; then
      die "Couldn't upload ${script} to ${gspath}/${script}."
    fi
    rm -rf "${temp}"
  fi

  # Uprev ebuild in git if it exists.
  if [[ -d "${SRC_ROOT}/overlays/${opath}/${CATEGORY}/${pnbin}" ]]; then
    cd "${SRC_ROOT}/overlays/${opath}/${CATEGORY}/${pnbin}"

    # Grab the version of the current release of the binary package.
    local pvbin="$(printf '%s\n' *.ebuild | \
                   sed -nE "s/^${pnbin}-(.*)\.ebuild\$/\1/p" | \
                   sort -V | tail -n 1)"
    echo "New binary version: ${pv} (current binary version: ${pvbin})"

    # following git commands may fail if they have been issued previously
    git checkout -b "gpudriverbinupdate-${pnbin}-${pv}"
    git mv "${pnbin}-${pvbin}.ebuild" "${pnbin}-${pv}.ebuild"

    ebuild "${pnbin}-${pv}.ebuild" manifest
  fi

  popd > /dev/null
}

main() {
  if [[ -z ${FLAGS_package} ]]; then
    die "Please select a package using --package [${DRIVERS// /|}]"
  fi

  local params
  local typed
  echo 'This script builds gpu drivers for a list of boards. It uploads the'
  echo 'binaries to Google storage and makes them available in the public'
  echo 'repository. It expects you have configured gsutil.'
  echo

  printf 'Type "y" if you know what you are doing and want to go ahead: '
  read typed

  if [[ "${typed}" != y ]]; then
    echo
    echo "Good choice."
    exit 2
  fi

  if [[ ! -f "${HOME}/.boto" ]]; then
    die "You did not configure gsutil after all."
  fi

  local pn="${FLAGS_package}"
  local pnbin="${pn}-bin"

  local array="PARAMS_${pn//-/_}[@]"

  if [[ -z "${!array}" ]]; then
    echo
    echo "Nothing to do for ${pn}, you probably chose an incorrect package name."
    echo "Supported packages: ${DRIVERS}"
    exit 1
  fi

  for params in "${!array}"; do
    build_board ${params}
  done
}

main "$@"
