# Copyright 2017 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Script to build Oboe for multiple Android ABIs and prepare them for distribution via CDep
#
# Ensure that ANDROID_NDK environment variable is set to your Android NDK location
# e.g. /Library/Android/sdk/ndk-bundle

#!/bin/bash

if [ -z "$ANDROID_NDK" ]; then
  echo "Please set ANDROID_NDK to the Android NDK folder"
  exit 1
fi

# Directories, paths and filenames
BUILD_DIR=build
CDEP_UPLOAD_DIR=${BUILD_DIR}/upload
CDEP_UPLOAD_PATH=`pwd`/${CDEP_UPLOAD_DIR}
CDEP_MANIFEST_FILE=${CDEP_UPLOAD_PATH}/cdep-manifest.yml

ANDROID_SYSTEM_VERSION=26

mkdir -p ${CDEP_UPLOAD_DIR}

# Zip the headers
zip -r ${CDEP_UPLOAD_DIR}/oboe-headers.zip include/

# Make the CDep package descriptor
printf "%s\r\n" "coordinate:" > ${CDEP_MANIFEST_FILE}
printf "  %s\r\n" "groupId: com.github.google" >> ${CDEP_MANIFEST_FILE}
printf "  %s\r\n" "artifactId: oboe" >> ${CDEP_MANIFEST_FILE}
printf "  %s\r\n" "version: 0.9.0"  >> ${CDEP_MANIFEST_FILE}
printf "%s\r\n" "license:" >> ${CDEP_MANIFEST_FILE}
printf "  %s\r\n" "url: https://raw.githubusercontent.com/google/oboe/master/LICENSE" \
  >> ${CDEP_MANIFEST_FILE}

printf "%s\r\n" "interfaces:" >> ${CDEP_MANIFEST_FILE}
printf "  %s\r\n" "headers:" >> ${CDEP_MANIFEST_FILE}
printf "    %s\r\n" "file: oboe-headers.zip" >> ${CDEP_MANIFEST_FILE}
printf "    %s\r\n" "include: include" >> ${CDEP_MANIFEST_FILE}

printf "    sha256: " >> ${CDEP_MANIFEST_FILE}
shasum -a 256 ${CDEP_UPLOAD_DIR}/oboe-headers.zip | awk '{print $1}' >> ${CDEP_MANIFEST_FILE}

printf "    size: " >> ${CDEP_MANIFEST_FILE}
ls -l ${CDEP_UPLOAD_DIR}/oboe-headers.zip | awk '{print $5}' >> ${CDEP_MANIFEST_FILE}
printf "%s\r\n" "android:" >> ${CDEP_MANIFEST_FILE}
printf "  %s\r\n" "archives:" >> ${CDEP_MANIFEST_FILE}

CMAKE_ARGS="-H. \
  -DCMAKE_BUILD_TYPE=RelWithDebInfo \
  -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang \
  -DCMAKE_SYSTEM_NAME=Android \
  -DCMAKE_SYSTEM_VERSION=${ANDROID_SYSTEM_VERSION} \
  -DCMAKE_ANDROID_STL_TYPE=c++_static \
  -DCMAKE_ANDROID_NDK=$ANDROID_NDK \
  -DCMAKE_INSTALL_PREFIX=."

function build_oboe {

  ABI=$1
  ABI_BUILD_DIR=build/${ABI}
  STAGING_DIR=staging

  echo "Building Oboe for ${ABI}"

  mkdir -p ${ABI_BUILD_DIR} ${ABI_BUILD_DIR}/${STAGING_DIR}

  cmake -B${ABI_BUILD_DIR} \
        -DCMAKE_ANDROID_ARCH_ABI=${ABI} \
        -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY=${STAGING_DIR}/lib/${ABI} \
        ${CMAKE_ARGS}

  pushd ${ABI_BUILD_DIR}
    make -j5

    echo "Creating CDep package for ${ABI} ABI"
    pushd ${STAGING_DIR}

      zip -r ${CDEP_UPLOAD_PATH}/oboe-${ABI}.zip .

      # Output the library SHA and size into the CDep manifest
      printf "    %s\r\n" "- file: oboe-${ABI}.zip" >> ${CDEP_MANIFEST_FILE}

      printf "      sha256: " >> ${CDEP_MANIFEST_FILE}
      shasum -a 256 ${CDEP_UPLOAD_PATH}/oboe-${ABI}.zip | awk '{print $1}' >> ${CDEP_MANIFEST_FILE}

      printf "      size: " >> ${CDEP_MANIFEST_FILE}
      ls -l ${CDEP_UPLOAD_PATH}/oboe-${ABI}.zip | awk '{print $5}' >> ${CDEP_MANIFEST_FILE}

      printf "    %s\r\n" "  abi: ${ABI}" >> ${CDEP_MANIFEST_FILE}
      printf "    %s\r\n" "  platform: ${ANDROID_SYSTEM_VERSION}" >> ${CDEP_MANIFEST_FILE}
      printf "      libs: [liboboe.a]\r\n" >> ${CDEP_MANIFEST_FILE}

    popd
  popd
}

build_oboe armeabi
build_oboe armeabi-v7a
build_oboe arm64-v8a
build_oboe x86
build_oboe x86_64
build_oboe mips

# Currently unsupported ABIs
# build_oboe mips64

# Output a code example
printf "%s\r\n" "example: |" >> ${CDEP_MANIFEST_FILE}
printf "%s\r\n" "  #include <oboe/Oboe.h>" >> ${CDEP_MANIFEST_FILE}
printf "%s\r\n" "  void openStream() {" >> ${CDEP_MANIFEST_FILE}
printf "%s\r\n" "    AudioStreamBuilder builder;" >> ${CDEP_MANIFEST_FILE}
printf "%s\r\n" "    AudioStream *stream;" >> ${CDEP_MANIFEST_FILE}
printf "%s\r\n" "    builder.openStream(&stream);" >> ${CDEP_MANIFEST_FILE}
printf "%s\r\n" "  }" >> ${CDEP_MANIFEST_FILE}


# Test package integrity
pushd ${BUILD_DIR}
git clone https://github.com/jomof/cdep-redist.git
cdep-redist/cdep wrapper
./cdep fetch ${CDEP_UPLOAD_PATH}/cdep-manifest.yml

# Create the example project
printf "%s\r\n" "builders: [cmake, cmakeExamples, ndk-build]" > cdep.yml
printf "%s\r\n" "dependencies:" >> cdep.yml
printf "%s\r\n" "- compile: ${CDEP_UPLOAD_PATH}/cdep-manifest.yml" >> cdep.yml
./cdep

# Build the example project

cmake \
  -H.cdep/examples/cmake/ \
  -Bbuild/examples \
  -DCMAKE_BUILD_TYPE=RelWithDebInfo \
  -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang \
  -DCMAKE_SYSTEM_NAME=Android \
  -DCMAKE_SYSTEM_VERSION=${ANDROID_SYSTEM_VERSION} \
  -DCMAKE_ANDROID_STL_TYPE=c++_static \
  -DCMAKE_ANDROID_NDK=${ANDROID_NDK} \
  -DCMAKE_ANDROID_ARCH_ABI=armeabi \
  -DCMAKE_CXX_FLAGS="-Werror -Wall -std=c++11"

cmake --build build/examples

popd

