#!/bin/sh
# 
# Copyright (C) 2009 Jurij Smakov <jurij@wooyd.org>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.

die() {
    echo "FATAL: ${1}"
    exit 1
}

check_variables() {
    test -z "${ANDROID_DIR}" && die "specify Android directory using --android-dir"
    test -d "${ANDROID_DIR}" || die "Android directory ${ANDROID_DIR} is invalid"
    test -z "${PJSIP_DIR}" && test -z "${SKIP_PJSIP}" && die "specify PJSIP directory using --pjsip-dir"
    test ! -d "${PJSIP_DIR}" && test -z "${SKIP_PJSIP}" && die "PJSIP directory ${PJSIP_DIR} is invalid"
    test -z "${VOIDROID_DIR}" && test -z "${SKIP_VOIDROID}" && die "specify VOIDROID directory using --voidroid-dir"
    test ! -d "${VOIDROID_DIR}" && test -z "${SKIP_VOIDROID}" && die "VOIDROID directory ${VOIDROID_DIR} is invalid"
    echo "Android directory: ${ANDROID_DIR}"
    echo "PJSIP directory: ${PJSIP_DIR}"
    echo "VOIDROID directory: ${VOIDROID_DIR}"
}

build_pjsip() {
    MAK_FILE="${PJSIP_DIR}/build/os-android.mak"
    test -f "${MAK_FILE}" || die "${MAK_FILE} not found"
    echo "INFO: running substitutions in ${MAK_FILE}"
    sed -i -e "s!@ANDROID_CFLAGS@!${ANDROID_CFLAGS}!g" "${MAK_FILE}"
    sed -i -e "s!@ANDROID_LDFLAGS@!${ANDROID_LDFLAGS}!g" "${MAK_FILE}"
    TOOLCHAIN_BIN="${ANDROID_DIR}/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin"

    (export PATH="${PATH}:${TOOLCHAIN_BIN}"
     cd "${PJSIP_DIR}" && \
     env CC='arm-eabi-gcc'               \
         CFLAGS="${ANDROID_CFLAGS}"      \
         LDFLAGS="${ANDROID_LDFLAGS}"    \
         ./configure --host=arm-eabi && make dep && make)
}

build_voidroid() {
    MF_IN="${VOIDROID_DIR}/assets/Makefile.android.in"
    MF_OUT="${VOIDROID_DIR}/assets/Makefile"
    sed -e "s!@PJSIP_DIR@!${PJSIP_DIR}!g" \
        -e "s!@ANDROID_DIR@!${ANDROID_DIR}!g" \
        -e "s!@ANDROID_LDFLAGS_LIBRARY@!${ANDROID_LDFLAGS_LIBRARY}!" \
        -e "s!@ANDROID_CXXFLAGS@!${ANDROID_CFLAGS}!" < "${MF_IN}" > "${MF_OUT}"
    (cd "${VOIDROID_DIR}/assets" && make clean && make)
    (cd "${VOIDROID_DIR}" && ant)
}

# Main script

while test -n "${1}"; do
    case "${1}" in
        --android-dir)
            ANDROID_DIR="${2}"
            shift 2
            ;;
        --pjsip-dir)
            PJSIP_DIR="${2}"
            shift 2
            ;;
        --skip-pjsip)
            SKIP_PJSIP='yes'
            shift 1
            ;;
        --voidroid-dir)
            VOIDROID_DIR="${2}"
            shift 2
            ;;
        --skip-voidroid)
            SKIP_VOIDROID='yes'
            shift 1
            ;;
        *)
            die "unknown option \"${1}\"."
            ;;
    esac
done

check_variables

ANDROID_CFLAGS="-DPJ_ANDROID=1 -I${ANDROID_DIR}/system/core/include -I${ANDROID_DIR}/hardware/libhardware/include -I${ANDROID_DIR}/hardware/ril/include -I${ANDROID_DIR}/dalvik/libnativehelper/include -I${ANDROID_DIR}/frameworks/base/include -I${ANDROID_DIR}/external/skia/include -I${ANDROID_DIR}/out/target/product/generic/obj/include -I${ANDROID_DIR}/bionic/libc/arch-arm/include -I${ANDROID_DIR}/bionic/libc/include -I${ANDROID_DIR}/bionic/libstdc++/include -I${ANDROID_DIR}/bionic/libc/kernel/common -I${ANDROID_DIR}/bionic/libc/kernel/arch-arm -I${ANDROID_DIR}/bionic/libm/include -I${ANDROID_DIR}/bionic/libm/include/arch/arm -I${ANDROID_DIR}/bionic/libthread_db/include -I${ANDROID_DIR}/bionic/libm/arm -I${ANDROID_DIR}/bionic/libm -I${ANDROID_DIR}/out/target/product/generic/obj/SHARED_LIBRARIES/libm_intermediates -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -DANDROID -DSK_RELEASE -include ${ANDROID_DIR}/system/core/include/arch/linux-arm/AndroidConfig.h -UDEBUG -DNDEBUG -march=armv5te -mtune=xscale -msoft-float -mthumb-interwork -fpic -fno-exceptions -ffunction-sections -funwind-tables -fstack-protector -fmessage-length=0 -O2 -finline-functions -finline-limit=300 -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers -fomit-frame-pointer -fstrict-aliasing -funswitch-loops"

# LDFLAGS for linking an executable
ANDROID_LDFLAGS="-nostdlib -Bdynamic -Wl,-T,${ANDROID_DIR}/build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc -Wl,--no-undefined -Wl,-rpath-link=${ANDROID_DIR}/out/target/product/generic/obj/lib -L${ANDROID_DIR}/out/target/product/generic/obj/lib ${ANDROID_DIR}/out/target/product/generic/obj/lib/crtend_android.o ${ANDROID_DIR}/out/target/product/generic/obj/lib/crtbegin_dynamic.o ${ANDROID_DIR}/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a -lc -lm -lm  -lssl -lcrypto -lmedia"

# LDFLAGS for linking a shared library
ANDROID_LDFLAGS_LIBRARY="-nostdlib -Wl,-T,${ANDROID_DIR}/build/core/armelf.xsc -Wl,-shared,-Bsymbolic -L${ANDROID_DIR}/out/target/product/generic/obj/lib -lc -lm -lm  -lssl -lcrypto -lmedia"

test -z "${SKIP_PJSIP}" && build_pjsip
test -z "${SKIP_VOIDROID}" && build_voidroid
