pjproject/configure-android

242 lines
8.4 KiB
Plaintext
Raw Normal View History

#!/bin/sh
#
F="configure-android"
if test "$*" = "--help" -o "$*" = "-h"; then
echo "$F [--use-ndk-cflags] [OPTIONS]"
echo ""
echo "where:"
echo " --use-ndk-cflags Optional parameter to use the same compilation flags"
echo " as the one used by ndk-build. Android NDK r9 or later"
echo " is required when using this option."
echo " OPTIONS Other options that will be passed directly to"
echo " ./aconfigure script. Run ./aconfigure --help"
echo " for more info."
echo ""
echo "Environment variables:"
echo " ANDROID_NDK_ROOT Specify the directory of Android NDK to use."
echo " APP_PLATFORM Optionally specify the platform level used, e.g."
echo " android-9. By default, configure will use the"
echo " maximum platform level detected."
echo " TARGET_ABI Optionally specify a single target architecture,"
echo " e.g. armeabi-v7a, mips, x86. By default, the target"
echo " architecture is armeabi. Only used when"
echo " --use-ndk-cflags is specified."
echo " IGNORE_CFLAGS Optionally specify compilation flags to be ignored."
echo " Each grepped flag that satisfies the criteria will"
echo " be ignored. Default:"
echo " IGNORE_CFLAGS=\"\-M\|\-f*stack\|\-f*alias\|\-\<g\>\""
echo " Only used when --use-ndk-cflags is specified."
echo ""
exit 0
fi
if test "x${ANDROID_NDK_ROOT}" = "x" || test ! -e ${ANDROID_NDK_ROOT}; then
echo "$F error: ANDROID_NDK_ROOT env var is not specified or invalid"
exit 0
fi
if test "x$APP_PLATFORM" = "x"; then
APP_PLATFORM=`ls ${ANDROID_NDK_ROOT}/platforms/ | sed 's/android-//' | sort -gr | head -1`
APP_PLATFORM="android-${APP_PLATFORM}"
echo "$F: APP_PLATFORM not specified, using ${APP_PLATFORM}"
fi
if test "x$TARGET_ABI" = "x"; then
TARGET_ABI="armeabi"
echo "$F: TARGET_ABI not specified, using ${TARGET_ABI}"
fi
if test "$TARGET_ABI" = "x86_64" || test "$TARGET_ABI" = "mips64"; then
USR_LIB="/usr/lib64"
else
USR_LIB="/usr/lib"
fi
if test "$1" = "--use-ndk-cflags"; then
shift
ADD_CFLAGS="1"
ADD_NDK_TOOLCHAIN="0"
ADD_NDK_TARGET="0"
if test "x${IGNORE_CFLAGS}" = "x"; then
IGNORE_CFLAGS="\-M\|\-f*stack\|\-f*alias\|\-\<g\>"
fi
if test -f ${ANDROID_NDK_ROOT}/build/ndk-build; then
NDK_BUILD=${ANDROID_NDK_ROOT}/build/ndk-build
else
NDK_BUILD=${ANDROID_NDK_ROOT}/ndk-build
fi
NDK_OUT=`${NDK_BUILD} -n -C pjsip-apps/src/samples/android_sample APP_PLATFORM=${APP_PLATFORM} APP_ABI=${TARGET_ABI}`
if test ! "${NDK_OUT}"; then
echo "$F error: failed to run ndk-build, check ANDROID_NDK_ROOT env var"
exit 1
fi
echo "====="
echo "NDK_OUT : ${NDK_OUT}"
echo "====="
for i in $NDK_OUT; do
if test "x${NDK_CXX}" != "x" -a "$i" = "-o"; then break; fi
# Parse NDK CXXFLAGS
if test "x${NDK_CXX}" != "x" -a "x`echo $i|grep 'dummy'`" = "x"; then
if test "x`echo $i|grep '\-\-sysroot='`" != "x"; then
ANDROID_SYSROOT=`echo $i|sed 's/--sysroot=//'`;
fi
NDK_CXXFLAGS="${NDK_CXXFLAGS} $i"
fi
# Parse NDK CFLAGS
if test "x${NDK_CC}" != "x" -a "x`echo $i|grep 'dummy'`" = "x" -a "${ADD_CFLAGS}" = "1"; then
if test "$i" = "-c"; then ADD_CFLAGS="0"; else
if test "x`echo $i|grep ${IGNORE_CFLAGS}`" = "x"; then
if test "${ADD_NDK_TOOLCHAIN}" = "0" -a "x`echo $i|grep '\-gcc-toolchain'`" != "x"; then
ADD_NDK_TOOLCHAIN="1"
elif test "${ADD_NDK_TARGET}" = "0" -a "x`echo $i|grep '\-target'`" != "x"; then
ADD_NDK_TARGET="1"
elif test "${ADD_NDK_TOOLCHAIN}" = "1"; then
NDK_TOOLCHAIN="$i"
ADD_NDK_TOOLCHAIN="2"
elif test "${ADD_NDK_TARGET}" = "1"; then
NDK_TARGET="$i"
ADD_NDK_TARGET="2"
fi
NDK_CFLAGS="${NDK_CFLAGS} $i"
fi
fi
fi
# Find gcc or clang toolchain
if test "x${NDK_CC}" = "x"; then
if test "x`echo $i | grep 'gcc'`" != "x" -o "x`echo $i | grep 'clang'`" != "x"; then
NDK_CC=$i
fi
fi
# Find g++ toolchain
if test "x`echo $i | grep 'g++'`" != "x"; then
NDK_CXX=$i
fi
done
echo "NDK_CC : ${NDK_CC}"
# Get target host from NDK toolchain dir name
TARGET_HOST=`echo ${NDK_CC} | sed -e 's/.*\/toolchains\/\([^\/]*\).*/\1/'`
# Remove version number suffix (otherwise config.sub will return error, perhaps it just doesn't like the format)
TARGET_HOST=`echo ${TARGET_HOST} | sed -e 's/\-[0-9\.]*$//'`
# Make sure target host string has 'linux-android' in it
if test "x`echo ${TARGET_HOST} | grep 'linux-android'`" = "x"; then
#TARGET_HOST=`echo ${TARGET_HOST} | sed -e 's/\(.*\)\-\([0-9\.]*\)/\1-linux-android-\2/'`
TARGET_HOST="${TARGET_HOST}-linux-android"
fi
# Set the binutils
if test "x${NDK_TOOLCHAIN}" = "x"; then
export AR=`echo ${NDK_CXX}|sed 's/-g++/-ar/'`;
export RANLIB=`echo ${NDK_CXX}|sed 's/-g++/-ranlib/'`;
export LDFLAGS="${LDFLAGS} --sysroot=${ANDROID_SYSROOT}"
else
#export AR="${NDK_TOOLCHAIN}/bin/${NDK_TARGET}-ar"
#export RANLIB="${NDK_TOOLCHAIN}/bin/${NDK_TARGET}-ranlib"
TARGET_HOST="arm-linux-androideabi"
export LDFLAGS="${LDFLAGS} --sysroot=${ANDROID_SYSROOT} -target ${NDK_TARGET} -gcc-toolchain ${NDK_TOOLCHAIN}"
fi
export TARGET_ABI="${TARGET_ABI}"
export CC="${NDK_CC}"
export CXX="${NDK_CXX}"
export LIBS="${LIBS} -lc -lgcc -ldl"
export CFLAGS="${NDK_CFLAGS} ${CFLAGS}"
export CPPFLAGS="${CFLAGS} -fexceptions -frtti"
export CXXFLAGS="${NDK_CXXFLAGS} -fexceptions -frtti"
else
if test "$TARGET_ABI" != "armeabi"; then
echo "$F error: For targets other than 'armeabi', specify --use-ndk-cflags"
exit 1
fi
TARGET_HOST="arm-linux-androideabi"
ANDROID_TC_VER=`ls -d ${ANDROID_NDK_ROOT}/toolchains/${TARGET_HOST}-* | sed 's/clang/0/' | sort -gr | head -1`
ANDROID_TC=`ls -d ${ANDROID_TC_VER}/prebuilt/* | grep -v gdbserver | head -1`
if test ! -d ${ANDROID_TC}; then
echo "$F error: unable to find directory ${ANDROID_TC} in Android NDK"
exit 1
fi
export ANDROID_SYSROOT="${ANDROID_NDK_ROOT}/platforms/${APP_PLATFORM}/arch-arm"
if test ! -d ${ANDROID_SYSROOT}; then
echo "$F error: unable to find sysroot dir ${ANDROID_SYSROOT} in Android NDK"
exit 1
fi
export TARGET_ABI="${TARGET_ABI}"
export CC="${ANDROID_TC}/bin/${TARGET_HOST}-gcc"
export CXX="${ANDROID_TC}/bin/${TARGET_HOST}-g++"
export AR="${ANDROID_TC}/bin/${TARGET_HOST}-ar"
export RANLIB="${ANDROID_TC}/bin/${TARGET_HOST}-ranlib"
export LDFLAGS="${LDFLAGS} --sysroot=${ANDROID_SYSROOT}"
export LIBS="${LIBS} -lc -lgcc"
export CFLAGS="${CFLAGS} --sysroot=${ANDROID_SYSROOT}"
export CPPFLAGS="${CFLAGS} -fexceptions -frtti"
export CXXFLAGS="${CXXFLAGS} -shared --sysroot=${ANDROID_SYSROOT} -fexceptions -frtti"
fi
if test "x${CC}" = "x" || test ! -e ${CC}; then
echo "$F error: compiler not found, please check environment settings (TARGET_ABI, etc)"
exit 1
fi
# C++ STL
# Note: STL for pjsua2 sample app is specified in pjsip-apps/src/swig/java/android/jni/Application.mk
if test "x${NDK_TOOLCHAIN}" = "x"; then
# gnustl
STDCPP_TC_VER=`ls -d ${ANDROID_NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/[0-9]* | sort -gr | head -1`
STDCPP_CFLAGS="-I${STDCPP_TC_VER}/include -I${STDCPP_TC_VER}/libs/${TARGET_ABI}/include"
STDCPP_LIBS="-lgnustl_static"
STDCPP_LDFLAGS="-L${STDCPP_TC_VER}/libs/${TARGET_ABI}/"
else
# llvm
STDCPP_TC="${ANDROID_NDK_ROOT}/sources/cxx-stl/llvm-libc++"
STDCPP_CFLAGS="-I${STDCPP_TC}/include"
STDCPP_LIBS="-lc++_static -lc++abi"
STDCPP_LDFLAGS="-L${STDCPP_TC}/libs/${TARGET_ABI}/"
fi
# stlport
#STDCPP_CFLAGS="-I${ANDROID_NDK_ROOT}/sources/cxx-stl/stlport/stlport"
#STDCPP_LIBS="-lstlport_static -ldl"
#STDCPP_LDFLAGS="-L${ANDROID_NDK_ROOT}/sources/cxx-stl/stlport/libs/${TARGET_ABI}"
export CFLAGS="${CFLAGS} ${STDCPP_CFLAGS}"
export LIBS="${STDCPP_LIBS} ${LIBS}"
export LDFLAGS="${LDFLAGS} ${STDCPP_LDFLAGS}"
# Print settings
if test "1" = "1"; then
echo "$F: calling ./configure with env vars:"
echo " CC = ${CC}"
echo " CXX = ${CXX}"
echo " CFLAGS = ${CFLAGS}"
echo " CXXFLAGS = ${CXXFLAGS}"
echo " LDFLAGS = ${LDFLAGS}"
echo " LIBS = ${LIBS}"
echo " AR = ${AR}"
echo " RANLIB = ${RANLIB}"
echo " TARGET_HOST = ${TARGET_HOST}"
echo " TARGET_ABI = ${TARGET_ABI}"
fi
./configure --host=${TARGET_HOST} $*