#!/bin/bash

#
#    Copyright (c) 2014-2017 Nest Labs, Inc.
#    All rights reserved.
#
#    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.
#

#
#    Description:
#      This file is built in the spirit of and in replacement of the
#      'ndk-which' tool from the Android NDK. The Android NDK tool, at
#      least in R10, is broken in that it does not allow the
#      specification of the ABI in addition to the tool.
#

#
# usage <status>
#
# Display program usage.
#
usage() {
    name=`basename $0`

    echo "Usage: ${name} [ -h ] [ --ndk-home <DIR> ] <tool> [ <ABI> ]"

    if [ $1 -ne 0 ]; then
        echo "Try '${name} -h' for more information."
    fi

    if [ $1 -ne 1 ]; then
        echo "  -h, --help      Print this help, then exit."
	echo "  --ndk-home DIR  Set the Android NDK home to DIR."
    fi

    exit $1
}

#
# createskel
#
# Create a temporary Android NDK project skeleton, required by
# build-local.mk.
#
# The caller is required to save the returned directory to TMPSKELDIR
# in the environment.
#
createskel() {
    local tmpskeldir=`mktemp -d tmp.XXXXXXXXXX`

    mkdir -p ${tmpskeldir}/jni
    touch ${tmpskeldir}/jni/Android.mk

    echo ${tmpskeldir}
}

#
# removeskel
#
# Remove the temporary Android NDK skeleton.
#
removeskel() {
    rm -Rf ${TMPSKELDIR}
}

#
# ndk_which <NDK home> <tool> [ <ABI> ]
#
# Determine the fully-qualified path name of the Android NDK tool in
# the specified Android NDK home, optionally, for the specified ABI.
#
# If the ABI is not specified, it defaults to armeabi.
#
ndk_which() {
    local ndkhome=${1}
    local tool=${2}
    if [ ${#} -eq 3 ]; then
        local abi=${3}
    else
	local abi=armeabi
    fi

    if [ -z "$GNUMAKE" ]; then
        GNUMAKE=make
    fi

    prefix=`NDK_PROJECT_PATH=${TMPSKELDIR} ${GNUMAKE} --no-print-dir -f ${ndkhome}/build/core/build-local.mk DUMP_TOOLCHAIN_PREFIX APP_ABI=${abi}`

    bindir=`dirname ${prefix}`

    PATH="${bindir}:${PATH}" which "${prefix}${tool}"
}

# Parse out any command line options

while [ ${#} -gt 2 ]; do
    if [ ${1} == "-h" ] || [ ${1} == "--help" ]; then
	usage 0

    elif [ ${1} == "--ndk-home" ]; then
	export NDK_HOME="${2}"
	shift 2

    else
	usage 1

    fi
done

# Ensure, at minimum, at least one argument, the tool is specified.

if [ ${#} -lt 1 ]; then
    usage 1
fi

# Ensure that the Android NDK home directory is known.

if [ -z "${NDK_HOME}" ]; then
    if [ -z "${ANDROID_NDK_HOME}" ]; then
        echo "One of either ANDROID_NDK_HOME or NDK_HOME must be set in the environment or the --ndk-home option must be specified."

    else
	export NDK_HOME="${ANDROID_NDK_HOME}"

    fi
fi

# Create the temporary Android NDK project skeleton.

trap "removeskel" 1 2 3 9 15

TMPSKELDIR=`createskel`

# Attempt to determine the requested Android NDK tool.

ndk_which "${NDK_HOME}" ${1} ${2}

# Save the status.

status=${?}

# Remove the temporary Android NDK project skeleton.

removeskel

exit ${status}

