#!/bin/bash

# Invoke this from the root of an internal Android tree. It will create
# links to build swiftshader as vendor code in vendor/swiftshader

set -o errexit

pushd $(dirname "$0") > /dev/null 2>&1
SOURCE_DIR="$(pwd)"
popd > /dev/null 2>&1

# The Android build configurations to use. There should be one representative
# configuration per TARGET_ARCH, ideally the primary user of SwiftShader

CONFIGS=gce_x86_tablet-userdebug

SOURCE_DIR_LINKED="$(pwd)/vendor/transgaming/swiftshader-src"
OBJECT_DIR="$(pwd)/vendor/transgaming/swiftshader"

JOBS=$(grep '^processor' /proc/cpuinfo | wc -l)

# Doing this first verifies that we're at the top of the tree

. build/envsetup.sh

# It's ok to reference gce_x86 here. The java version is controlled by
# the branch, not the device. The config file lives in gce_x86 because
# it's a repository that we control

. device/google/gce_x86/configure_java.sh

# Ensure that our source links are correct by throwing away anthing that is
# already linked and linking again

rm -rf "${SOURCE_DIR_LINKED}"
mkdir -p "${SOURCE_DIR_LINKED}"
ln -s "${SOURCE_DIR}/.dir-locals.el" "${SOURCE_DIR_LINKED}"

# Android JB needs some encouragement to find the makefiles
echo 'include $(call all-subdir-makefiles)' > "${SOURCE_DIR_LINKED}/Android.mk"

IFS=$'\n'
for i in $(find "${SOURCE_DIR}/src" -name Android.mk -print); do
  ln -s "$(dirname "${i}" )" "${SOURCE_DIR_LINKED}"
done
unset IFS

# Build for each configuration in the list

for config in ${CONFIGS}; do
  lunch ${config}

  # Get the actual architecture from the build configuration

  TARGET_ARCH=$(get_build_var TARGET_ARCH)

  rm -rf ${OBJECT_DIR}/${TARGET_ARCH}
  make -j ${JOBS} \
     showcommands \
     libEGL_swiftshader_vendor_debug \
     libEGL_swiftshader_vendor_release \
     libGLESv1_CM_swiftshader_vendor_debug \
     libGLESv1_CM_swiftshader_vendor_release \
     libGLESv2_swiftshader_vendor_debug \
     libGLESv2_swiftshader_vendor_release 2>&1 | tee vendor_build.out

  # We don't need the obj files since they can be generated from the syms

  mkdir -p ${OBJECT_DIR}/${TARGET_ARCH}
  rm -rf ${OBJECT_DIR}/${TARGET_ARCH}/*/obj

  # JBMR2 (and earlier?) doesn't allow the library name to differ from the
  # module name. Rename the generated libraries.

  IFS=$'\n'
  for i in $(find ${OBJECT_DIR}/${TARGET_ARCH} -name '*_vendor_*'); do
    j="${i/_vendor_debug/}"
    j="${j/_vendor_release/}"
    if [[ "$i" != "$j" ]]; then
      mv "$i" "$j"
    fi
  done
  unset IFS

  pushd "${OBJECT_DIR}"
  git add ${TARGET_ARCH}
  popd
done

# Decide if we need any warning in the commit message

WARN=""
if [[ "$(cd ${SOURCE_DIR}; git diff HEAD)" != "" ]]; then
  WARN="TREE WAS NOT CLEAN"
elif [[ "$(cd ${SOURCE_DIR}; git diff origin/master)" != "" ]]; then
  WARN="TREE WAS NOT MERGED"
fi

# Do the commit

pushd "${OBJECT_DIR}"
git commit \
  -m "${WARN} SwiftShader build as of:" \
  -m "    git hash: $( cd ${SOURCE_DIR}; git log -n1 | grep commit | head -1 | awk '{ print $2; }')" \
  -m "$(cd ${SOURCE_DIR}; git log -n1 | grep '^ *Change-Id:' | tail -1 | sed 's,-, ,')" \
  -m "    At $(cd ${SOURCE_DIR}; git remote -v | grep ^origin | head -1 | awk '{ print $2; }')" \
  -m "$1"
popd
rm -rf ${SOURCE_DIR_LINKED}
