#!/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, img-ddk) for a list of boards.
# It uploads the binaries to Google storage and makes them available in the
# public repository.

. "$(dirname "$0")/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

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

# List of supported drivers
DRIVERS="mali-drivers img-ddk"

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

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

PARAMS_img_ddk=(
  "oak oak oak chipset-mt8173"
)

# Script must run inside the chroot
restart_in_chroot_if_needed "$@"

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 board name
# $4 overlay path

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

  if [[ "$oboard" != "X11" ]]; then
    ./setup_board --board="${oboard}"
  fi
  ./setup_board --board="${board}"
  if [[ $? != 0 ]]; then
    die_notrace "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}

  if [[ "$oboard" == "X11" ]]; then
    echo "Building special X11 package"
    USE=X emerge-${board} ${pn}
  else
    emerge-${board} ${pn}
  fi

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

  local pv=$("equery-${board}" -q list -p -o --format="\$fullversion" ${pn} | sort | head -n 1)
  local category=$("equery-${board}" -q list -p -o --format="\$category" ${pn} | sort | head -n 1)
  local inputtarball="/build/${board}/packages/${category}/${pn}-${pv}.tbz2"
  local outputtarball="${pn}-${suffix}-${pv}.tbz2"
  local script="${pn}-${suffix}-${pv}.run"
  local gspath="gs://chromeos-localmirror/distfiles"

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

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

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

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

  tar -C work --exclude=usr/lib/debug -cpjvf "${outputtarball}" ./
  if [[ $? != 0 ]]; then
    die_notrace "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_notrace "Couldn't upload ${script} to ${gspath}/${script}."
    fi
    rm -rf "${temp}"
  fi

  if [[ "${oboard}" != "X11" ]]; then
    local pvbin=$("equery-${board}" -q list -p -o --format="\$fullversion" ${pnbin} | sort | head -n 1)
    echo "Current version is ${pv} current binary version is ${pvbin}"
    # Uprev ebuild in git if it exists.
    if [[ -d "${SRC_ROOT}/overlays/${opath}/${category}/${pnbin}" ]]; then
      cd "${SRC_ROOT}/overlays/${opath}/${category}/${pnbin}"

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

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

  popd >& /dev/null
}

main() {
  if [[ -z ${FLAGS_package} ]]; then
    die_notrace "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_notrace "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 "$@"
