#!/bin/sh
PROGDIR=`dirname $0`
NDK=`cd $PROGDIR/.. && pwd`
NDK_BUILDTOOLS_PATH=$NDK/build/tools
. $NDK_BUILDTOOLS_PATH/ndk-common.sh
. $NDK_BUILDTOOLS_PATH/prebuilt-common.sh
# Find all devices
DEVICE_arm=
DEVICE_mips=
DEVICE_x86=
ADB_CMD=`which adb`
if [ -n "$ANDROID_SERIAL" ] ; then
echo ANDROID_SERIAL=$ANDROID_SERIAL
else
if [ -n $ADB_CMD ] ; then
# Get list of online devices, turn ' ' in device into '#'
DEVICES=`$ADB_CMD devices | grep -v offline | awk 'NR>1 {gsub(/[ \t]+device$/,""); print;}' | sed '/^$/d' | tr ' ' '#'`
for DEVICE in $DEVICES; do
# undo previous ' '-to-'#' translation
DEVICE=$(echo "$DEVICE" | tr '#' ' ')
# get arch
ARCH=`$ADB_CMD -s "$DEVICE" shell getprop ro.product.cpu.abi | tr -dc '[:print:]'`
case "$ARCH" in
armeabi*)
if [ -z "$DEVICE_arm" ]; then
DEVICE_arm=$DEVICE
fi
;;
x86)
if [ -z "$DEVICE_x86" ]; then
DEVICE_x86=$DEVICE
fi
;;
mips*)
if [ -z "$DEVICE_mips" ]; then
DEVICE_mips=$DEVICE
fi
;;
*)
echo "ERROR: Unsupported architecture: $ARCH"
exit 1
esac
done
fi
echo "DEVICE_arm=$DEVICE_arm"
echo "DEVICE_x86=$DEVICE_x86"
echo "DEVICE_mips=$DEVICE_mips"
fi
#
# check if we need to also test 32-bit host toolchain
#
TEST_HOST_32BIT=no
TAGS=$HOST_TAG
case "$HOST_TAG" in
linux-x86_64|darwin-x86_64)
if [ -d "$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/$HOST_TAG" ] ; then
if [ -d "$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/$HOST_TAG32" ] ; then
# ideally we should check each individual compiler the presence of 64-bit
# but for test script this is fine
TEST_HOST_32BIT=yes
TAGS=$TAGS" $HOST_TAG32"
fi
else
TAGS=$HOST_TAG32
fi
;;
windows*)
if [ "$ProgramW6432" != "" ] ; then
if [ -d "$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64" ] ; then
if [ -d "$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/windows" ] ; then
TEST_HOST_32BIT=yes
TAGS=$TAGS" windows-x86_64"
fi
else
TAGS=windows
fi
fi
esac
#
# Run run-tests.sh
#
SYSTEM=$(get_prebuilt_host_tag)
NDK_TOOLCHAIN_VERSIONS=
for V in $DEFAULT_GCC_VERSION_LIST; do
NDK_TOOLCHAIN_VERSIONS=$NDK_TOOLCHAIN_VERSIONS" gcc"$V
done
for V in $DEFAULT_LLVM_VERSION_LIST; do
NDK_TOOLCHAIN_VERSIONS=$NDK_TOOLCHAIN_VERSIONS" clang"$V
done
# keep this simple, only intend to test the case when NDK_TOOLCHAIN_VERSION isn't specified
dump "### Run simple tests"
ANDROID_SERIAL=none ./run-tests.sh --continue-on-build-fail --abi=armeabi
# Another simple test to test NDK_TOOLCHAIN_VERSION=clang which picks up the most recent version
dump "### Run simple tests with clang"
NDK_TOOLCHAIN_VERSION=clang ANDROID_SERIAL=none ./run-tests.sh --continue-on-build-fail --abi=armeabi-v7a
# enumerate all cases using $SYSTEM toolchain
for V in $NDK_TOOLCHAIN_VERSIONS; do
dump "### Running $HOST_TAG $V full tests"
NDK_TOOLCHAIN_VERSION="${V#gcc*}" ./run-tests.sh --continue-on-build-fail --full
done
if [ "$TEST_HOST_32BIT" = "yes" ] ; then
for V in $NDK_TOOLCHAIN_VERSIONS; do
dump "### Running $HOST_TAG32 $V tests (32-bit host)"
NDK_HOST_32BIT=1 NDK_TOOLCHAIN_VERSION="${V#gcc*}" ./run-tests.sh --continue-on-build-fail
done
fi
if [ "$SYSTEM" = "linux-x86" -a -d "$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64" ] ; then
# using 64-bit windows toolchain
for V in $NDK_TOOLCHAIN_VERSIONS; do
dump "### Running windows-x86_64 $V tests"
NDK_TOOLCHAIN_VERSION="${V#gcc*}" ./run-tests.sh --continue-on-build-fail --wine # --full
done
fi
if [ "$SYSTEM" = "linux-x86" -a -d "$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/windows" ] ; then
# using 32-bit windows toolchain
for V in $NDK_TOOLCHAIN_VERSIONS; do
dump "### Running windows $V tests"
NDK_HOST_32BIT=1 NDK_TOOLCHAIN_VERSION="${V#gcc*}" ./run-tests.sh --continue-on-build-fail --wine # --full
done
fi
# add more if you want ...
#
# Run standalone tests
#
STANDALONE_TMPDIR=$NDK_TMPDIR
# $1: Host tag
# $2: API level
# $3: Arch
# $4: GCC version
# $5: STL
standalone_path ()
{
local TAG=$1
local API=$2
local ARCH=$3
local GCC_VERSION=$4
local STL=$5
echo ${STANDALONE_TMPDIR}/android-ndk-api${API}-${ARCH}-${TAG}-${GCC_VERSION}-${STL}
}
# $1: Host tag
# $2: API level
# $3: Arch
# $4: GCC version
# $5: LLVM version
# $6: STL
make_standalone ()
{
local TAG=$1
local API=$2
local ARCH=$3
local GCC_VERSION=$4
local LLVM_VERSION=$5
local STL=$6
(cd $NDK && \
./build/tools/make-standalone-toolchain.sh \
--platform=android-$API \
--install-dir=$(standalone_path $TAG $API $ARCH $GCC_VERSION $STL) \
--llvm-version=$LLVM_VERSION \
--toolchain=$(get_toolchain_name_for_arch $ARCH $GCC_VERSION) \
--system=$TAG \
--stl=$STL)
}
API32=14
API64=L
for ARCH in $(commas_to_spaces $DEFAULT_ARCHS); do
if [ "$ARCH" = "${ARCH%%64*}" ]; then
API=$API32
else
API=$API64
fi
DEFAULT_GCC_VERSION=$(get_default_gcc_version_for_arch $ARCH)
MAKE_IT=
for GCC_VERSION in $(commas_to_spaces $DEFAULT_GCC_VERSION_LIST); do
# Only process GCC_VERSION from DEFAULT_GCC_VERSION
if [ -z "$MAKE_IT" -a "$GCC_VERSION" = "$DEFAULT_GCC_VERSION" ]; then
MAKE_IT=yes
fi
if [ -z "$MAKE_IT" ]; then
continue
fi
for TAG in $TAGS; do
dump "### [$TAG] Testing $ARCH gcc-$GCC_VERSION toolchain with --sysroot"
(cd $NDK && \
./tests/standalone/run.sh --prefix=$(get_toolchain_binprefix_for_arch $ARCH $GCC_VERSION $TAG)-gcc)
for STL in gnustl stlport libc++; do
GCC_TESTED=no
for LLVM_VERSION in $(commas_to_spaces $DEFAULT_LLVM_VERSION_LIST); do
dump "### [$TAG] Making $ARCH gcc-$GCC_VERSION/clang$LLVM_VERSION standalone toolchain STL=$STL"
make_standalone $TAG $API $ARCH $GCC_VERSION $LLVM_VERSION $STL
if [ "$GCC_TESTED" != "yes" ]; then
dump "### [$TAG] Testing $ARCH gcc-$GCC_VERSION standalone toolchain"
(cd $NDK && \
./tests/standalone/run.sh --no-sysroot \
--prefix=$(standalone_path $TAG $API $ARCH $GCC_VERSION $STL)/bin/$(get_default_toolchain_prefix_for_arch $ARCH)-gcc)
GCC_TESTED=yes
fi
# only Run clang test for 64-bit on DEFAULT_LLVM_VERSION
if [ "$ARCH" != "${ARCH%%64*}" -a "$LLVM_VERSION" != "$DEFAULT_LLVM_VERSION" ]; then
continue
fi
dump "### [$TAG] Testing clang$LLVM_VERSION in $ARCH gcc-$GCC_VERSION standalone toolchain STL=$STL"
(cd $NDK && \
./tests/standalone/run.sh --no-sysroot \
--prefix=$(standalone_path $TAG $API $ARCH $GCC_VERSION $STL)/bin/clang)
rm -rf $(standalone_path $TAG $API $ARCH $GCC_VERSION $STL)
done
done
done
done
done
# clean up
rm -rf $STANDALONE_TMPDIR