#! /bin/bash
# Copyright (c) 2016, the R8 project authors. Please see the AUTHORS file
# for details. 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 will update the host art VM in tools/linux/art

# Before running this script make sure that you have a full android build
# and that the host Art version required is build in ~/android/master:
#
#  m -j24
#  m -j24 build-art
#
# Maybe also run the Art host tests:
#
#  m -j24 test-art-host

set -e

ANDROID_CHECKOUT=~/android/master
ANDROID_PRODUCT=angler
ART_DIR=art
DEST_ROOT=tools/linux

function usage {
  echo "Usage: $(basename $0)"
  echo "  [--android-checkout <android repo root>]"
  echo "  [--art-dir <destination directory>]"
  echo "  [--android-product <product name>]"
  echo "  [--destination-dir <destination directory>]"
  echo ""
  echo "  --android-checkout specifies the Android repo root"
  echo "  Defaults to: $ANDROID_CHECKOUT"
  echo ""
  echo "  --art-dir specifies the directory name inside the root destination"
  echo "  directory for the art bundle"
  echo "  Defaults to: $ART_DIR"
  echo ""
  echo "  --android-product specifies the Android product for the framework to include"
  echo "  Defaults to: $ANDROID_PRODUCT"
  echo ""
  echo "  --destination-dir specifies the root destination directory for the art bundle"
  echo "  Defaults to: $DEST_ROOT"
  echo ""
  echo "Update the master version of art from ~/android/master:"
  echo "  "
  echo "  $(basename $0)"
  echo "  "
  echo "Update a specific version of art:"
  echo "  "
  echo "  $(basename $0) --android-checkout ~/android/5.1.1_r19 --art-dir 5.1.1"
  echo "  "
  echo "Test the Art bundle in a temporary directory:"
  echo "  "
  echo "  $(basename $0) --android-checkout ~/android/5.1.1_r19 --art-dir art-5.1.1 --android-product mako --destination-dir /tmp/art"
  echo "  "
  exit 1
}

# Process options.
while [ $# -gt 0 ]; do
  case $1 in
    --android-checkout)
      ANDROID_CHECKOUT="$2"
      shift 2
      ;;
    --art-dir)
      ART_DIR="$2"
      shift 2
      ;;
    --android-product)
      ANDROID_PRODUCT="$2"
      shift 2
      ;;
    --destination-dir)
      DEST_ROOT="$2"
      shift 2
      ;;
    --help|-h|-H|-\?)
      usage
      ;;
    *)
      echo "Unkonwn option $1"
      echo ""
      usage
      ;;
  esac
done

ANDROID_HOST_BUILD=$ANDROID_CHECKOUT/out/host/linux-x86
ANDROID_TARGET_BUILD=$ANDROID_CHECKOUT/out/target
DEST=$DEST_ROOT/$ART_DIR

# Clean out the previous version of Art
rm -rf $DEST

# Required binaries and scripts.
mkdir -p $DEST/bin
if [ -f $ANDROID_HOST_BUILD/bin/art ]; then
  cp $ANDROID_HOST_BUILD/bin/art $DEST/bin
else
  cp $ANDROID_CHECKOUT/art/tools/art $DEST/bin
fi

cp $ANDROID_HOST_BUILD/bin/dalvikvm64 $DEST/bin
cp $ANDROID_HOST_BUILD/bin/dalvikvm32 $DEST/bin
# Copy the dalvikvm link creating a regular file instead, as download_from_google_stroage.py does
# not allow tar files with symbolic links (depending on Android/Art version dalvikvm links to
# dalvikvm32 or dalvikvm64).
cp $ANDROID_HOST_BUILD/bin/dalvikvm $DEST/bin
cp $ANDROID_HOST_BUILD/bin/dex2oat $DEST/bin
if [ -e $ANDROID_HOST_BUILD/bin/dex2oat64 ]
  then cp $ANDROID_HOST_BUILD/bin/dex2oat64 $DEST/bin
fi
if [ -e $ANDROID_HOST_BUILD/bin/patchoat ]
  # File patchoat does not exist on Q anymore.
  then cp $ANDROID_HOST_BUILD/bin/patchoat $DEST/bin
fi


# Required framework files.
mkdir -p $DEST/framework
cp -R $ANDROID_HOST_BUILD/framework/* $DEST/framework

# Required library files.
mkdir -p $DEST/lib64
cp -r $ANDROID_HOST_BUILD/lib64/* $DEST/lib64
mkdir -p $DEST/lib
cp -r $ANDROID_HOST_BUILD/lib/* $DEST/lib

# Image files required for dex2oat of actual android apps. We need an actual android product
# image containing framework classes to verify the code against.
mkdir -p $DEST/product/$ANDROID_PRODUCT/system/framework
cp -rL $ANDROID_TARGET_BUILD/product/$ANDROID_PRODUCT/system/framework/* $DEST/product/$ANDROID_PRODUCT/system/framework

# Required auxillary files.
if [ -e $ANDROID_HOST_BUILD/apex ]; then
  mkdir -p $DEST/apex
  cp -rL $ANDROID_HOST_BUILD/apex/* $DEST/apex
  if [ -e $ANDROID_HOST_BUILD/com.android.i18n ]; then
    mkdir -p $DEST/com.android.i18n
    cp -r $ANDROID_HOST_BUILD/com.android.i18n/* $DEST/com.android.i18n
  fi
  if [ -e $ANDROID_HOST_BUILD/com.android.tzdata ]; then
    mkdir -p $DEST/com.android.tzdata
    cp -r $ANDROID_HOST_BUILD/com.android.tzdata/* $DEST/com.android.tzdata
  fi
  if [ -e $ANDROID_HOST_BUILD/usr ]; then
    mkdir -p $DEST/usr
    cp -r $ANDROID_HOST_BUILD/usr/* $DEST/usr
  fi
else
  if [ -e $ANDROID_HOST_BUILD/usr/icu ]; then
    mkdir -p $DEST/usr/icu
    cp -r $ANDROID_HOST_BUILD/usr/icu/* $DEST/usr/icu
  else
    mkdir -p $DEST/com.android.runtime/etc/icu/
    cp -r $ANDROID_HOST_BUILD/com.android.runtime/etc/icu/* $DEST/com.android.runtime/etc/icu/
  fi
fi

# Update links for vdex files for Android P and later.
if [ -f $DEST/product/$ANDROID_PRODUCT/system/framework/boot.vdex ]; then
  for VDEXFILE in $DEST/product/$ANDROID_PRODUCT/system/framework/*.vdex; do
    VDEXNAME=$(basename ${VDEXFILE});
    for ARCH in arm arm64; do
      rm $DEST/product/$ANDROID_PRODUCT/system/framework/$ARCH/${VDEXNAME};
      # This relative link command will create a symbolic link of the form
      # ../${VDEXNAME} for each architecture.
      # ln -r -s $DEST/product/$ANDROID_PRODUCT/system/framework/${VDEXNAME} $DEST/product/$ANDROID_PRODUCT/system/framework/$ARCH/${VDEXNAME};
      # The Cloud Storage dependency tool (download_from_google_storage.py) does
      # not allow synlinks at all, so instad of the ln in the comment above just
      # copy the ${VDEXNAME} files.
      cp $DEST/product/$ANDROID_PRODUCT/system/framework/${VDEXNAME} $DEST/product/$ANDROID_PRODUCT/system/framework/$ARCH/${VDEXNAME};
    done
  done
fi

# Allow failure for strip commands below.
set +e

strip $DEST/bin/* 2> /dev/null
strip $DEST/lib/*
strip $DEST/lib64/*
strip $DEST/framework/x86/* 2> /dev/null
strip $DEST/framework/x86_64/* 2> /dev/null

echo "Now run"
echo "(cd $DEST_ROOT; upload_to_google_storage.py -a --bucket r8-deps $ART_DIR)"
echo "NOTE; If $ART_DIR has several directory elements adjust accordingly."