#!/bin/bash

ANDROID_ABI=$1

# Build libyuv / opus / libvpx / oboe for Android
# Required:
#   1. set VCPKG_ROOT / ANDROID_NDK path environment variables
#   2. vcpkg initialized
#   3. ndk, version: 22 (if ndk < 22 you need to change LD as `export LD=$TOOLCHAIN/bin/$NDK_LLVM_TARGET-ld`)

if [ -z "$ANDROID_NDK" ]; then
  echo "Failed! Please set ANDROID_NDK"
  exit 1
fi

if [ -z "$VCPKG_ROOT" ]; then
  echo "Failed! Please set VCPKG_ROOT"
  exit 1
fi

API_LEVEL="21"

# NDK llvm toolchain
HOST_TAG="linux-x86_64" # current platform, set as `ls $ANDROID_NDK/toolchains/llvm/prebuilt/`
TOOLCHAIN=$ANDROID_NDK/toolchains/llvm/prebuilt/$HOST_TAG

function build {
  ANDROID_ABI=$1

  case "$ANDROID_ABI" in
  arm64-v8a)
     ABI=aarch64-linux-android$API_LEVEL
     VCPKG_TARGET=arm64-android
     ;;
  armeabi-v7a)
     ABI=armv7a-linux-androideabi$API_LEVEL
     VCPKG_TARGET=arm-neon-android
     ;;
  x86_64)
     ABI=x86_64-linux-android$API_LEVEL
     VCPKG_TARGET=x64-android
     ;;
  x86)
     ABI=i686-linux-android$API_LEVEL
     VCPKG_TARGET=x86-android
     ;;
  esac

  PREFIX=$VCPKG_ROOT/installed/$VCPKG_TARGET/

  # 1
  echo "*** [$ANDROID_ABI][Start] Build opus / libyuv from vcpkg"
  export ANDROID_NDK_HOME=$ANDROID_NDK
  pushd $VCPKG_ROOT
  $VCPKG_ROOT/vcpkg install opus --triplet $VCPKG_TARGET
  $VCPKG_ROOT/vcpkg install libyuv --triplet $VCPKG_TARGET
  $VCPKG_ROOT/vcpkg install aom --triplet $VCPKG_TARGET
  $VCPKG_ROOT/vcpkg install cpu-features --triplet $VCPKG_TARGET
  popd
  echo "*** [$ANDROID_ABI][Finished] Build opus / libyuv from vcpkg"

  # 2
  echo "*** [$ANDROID_ABI][Start] Build libvpx"
  pushd build/libvpx

  export AR=$TOOLCHAIN/bin/llvm-ar
  export CC=$TOOLCHAIN/bin/"$ABI"-clang
  export CXX=$TOOLCHAIN/bin/"$ABI"-clang++
  export LD=$TOOLCHAIN/bin/"$ABI"-clang
  export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
  export STRIP=$TOOLCHAIN/bin/llvm-strip

  case "$ANDROID_ABI" in
  arm64-v8a)
    export AS=$TOOLCHAIN/bin/llvm-as
    LIBVPX_EXTRA_BUILD_FLAGS="--target=arm64-android-gcc --enable-thumb --disable-runtime-cpu-detect"
    ;;
  armeabi-v7a)
    export AS=$TOOLCHAIN/bin/llvm-as
    LIBVPX_EXTRA_BUILD_FLAGS="--target=armv7-android-gcc --enable-thumb --disable-neon --disable-runtime-cpu-detect"
    ;;
  x86_64)
    export AS=$TOOLCHAIN/bin/yasm
    LIBVPX_EXTRA_BUILD_FLAGS="--target=x86_64-android-gcc --disable-avx --disable-avx2 --disable-avx512"
    ;;
  x86)
    export AS=$TOOLCHAIN/bin/yasm
    LIBVPX_EXTRA_BUILD_FLAGS="--target=x86-android-gcc --disable-sse4_1 --disable-avx --disable-avx2 --disable-avx512"
    ;;
  esac

  make clean

  ./configure \
              --enable-pic \
              --disable-webm-io \
              --disable-unit-tests \
              --disable-examples \
              --disable-libyuv \
              --disable-postproc \
              --disable-tools \
              --disable-docs \
              --prefix=$PREFIX \
              $LIBVPX_EXTRA_BUILD_FLAGS
  make -j
  make install

  unset AR CC CXX LD RANLIB STRIP

  popd
  echo "*** [$ANDROID_ABI][Finished] Build libvpx"

  # 3
  echo "*** [$ANDROID_ABI][Start] Build oboe"
  pushd build/oboe
  make clean
  cmake -DBUILD_SHARED_LIBS=true \
          -DCMAKE_BUILD_TYPE=RelWithDebInfo \
          -DANDROID_TOOLCHAIN=clang \
          -DANDROID_STL=c++_shared \
          -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
          -DCMAKE_INSTALL_PREFIX=$PREFIX \
          -DANDROID_ABI=$ANDROID_ABI \
          -DANDROID_PLATFORM=android-$API_LEVEL
  make -j
  make install
  mv $PREFIX/lib/$ANDROID_ABI/liboboe.a $PREFIX/lib/
  popd
  echo "*** [$ANDROID_ABI][Finished] Build oboe"

  echo "*** [$ANDROID_ABI][All Finished]"
}

# Bump libvpx to 1.13.1 to fix CVE-2023-5217
git clone -b v1.13.1 --depth=1 https://github.com/webmproject/libvpx.git build/libvpx
git clone -b 1.6.1 --depth=1 https://github.com/google/oboe build/oboe
patch -N -d build/oboe -p1 < ../src/oboe.patch

if [ ! -z "$ANDROID_ABI" ]; then
  build "$ANDROID_ABI"
else
  build arm64-v8a
  build armeabi-v7a
  build x86_64
  build x86
fi

[ -d "$VCPKG_ROOT/installed/arm-neon-android" ] && mv "$VCPKG_ROOT/installed/arm-neon-android" "$VCPKG_ROOT/installed/arm-android"

rm -rf build