Merge "Support rebuilding stlport/gabi++ libraries with clang."
diff --git a/build/tools/build-gabi++.sh b/build/tools/build-gabi++.sh
index f6eef6b..00969c9 100755
--- a/build/tools/build-gabi++.sh
+++ b/build/tools/build-gabi++.sh
@@ -36,6 +36,9 @@
By default, this will try with the current NDK directory, unless
you use the --ndk-dir=<path> option.
+If you want use clang to rebuild the binaries, please
+use --llvm-version=<ver> option.
+
The output will be placed in appropriate sub-directories of
<ndk>/$GABIXX_SUBDIR, but you can override this with the --out-dir=<path>
option.
@@ -63,6 +66,9 @@
VISIBLE_LIBGABIXX_STATIC=
register_var_option "--visible-libgabixx-static" VISIBLE_LIBGABIXX_STATIC "Do not use hidden visibility for libgabi++_static.a"
+LLVM_VERSION=
+register_var_option "--llvm-version=<ver>" LLVM_VERSION "Specify LLVM version"
+
register_jobs_option
extract_parameters "$@"
@@ -133,7 +139,7 @@
mkdir -p "$DSTDIR"
- builder_begin_android $ABI "$BUILDDIR" "$MAKEFILE"
+ builder_begin_android $ABI "$BUILDDIR" "$LLVM_VERSION" "$MAKEFILE"
builder_set_srcdir "$GABIXX_SRCDIR"
builder_set_dstdir "$DSTDIR"
diff --git a/build/tools/build-stlport.sh b/build/tools/build-stlport.sh
index c84f71d..908943a 100755
--- a/build/tools/build-stlport.sh
+++ b/build/tools/build-stlport.sh
@@ -36,6 +36,9 @@
By default, this will try with the current NDK directory, unless
you use the --ndk-dir=<path> option.
+If you want use clang to rebuild the binaries, please
+use --llvm-version=<ver> option.
+
The output will be placed in appropriate sub-directories of
<ndk>/$STLPORT_SUBDIR, but you can override this with the --out-dir=<path>
option.
@@ -63,6 +66,9 @@
VISIBLE_LIBSTLPORT_STATIC=
register_var_option "--visible-libstlport-static" VISIBLE_LIBSTLPORT_STATIC "Do not use hidden visibility for libstlport_static.a"
+LLVM_VERSION=
+register_var_option "--llvm-version=<ver>" LLVM_VERSION "Specify LLVM version"
+
register_jobs_option
extract_parameters "$@"
@@ -167,7 +173,7 @@
mkdir -p "$DSTDIR"
- builder_begin_android $ABI "$BUILDDIR" "$MAKEFILE"
+ builder_begin_android $ABI "$BUILDDIR" "$LLVM_VERSION" "$MAKEFILE"
builder_set_dstdir "$DSTDIR"
diff --git a/build/tools/builder-funcs.sh b/build/tools/builder-funcs.sh
index 5afc054..7a6bb42 100644
--- a/build/tools/builder-funcs.sh
+++ b/build/tools/builder-funcs.sh
@@ -131,6 +131,13 @@
_BUILD_AR=${1}ar
}
+builder_set_binprefix_llvm ()
+{
+ _BUILD_BINPREFIX=$1
+ _BUILD_CC=${1}clang
+ _BUILD_CXX=${1}clang++
+}
+
builder_set_builddir ()
{
_BUILD_DIR=$1
@@ -295,8 +302,11 @@
_BUILD_TARGETS=$_BUILD_TARGETS" $lib"
echo "$lib: $_BUILD_OBJECTS" >> $_BUILD_MK
fi
+ if [ -z "${_BUILD_AR}" ]; then
+ _BUILD_AR=${AR:-ar}
+ fi
builder_log "${_BUILD_PREFIX}Archive: $libname"
- builder_command ${_BUILD_BINPREFIX}ar crs "$lib" "$_BUILD_OBJECTS"
+ builder_command ${_BUILD_AR} crs "$lib" "$_BUILD_OBJECTS"
fail_panic "Could not archive ${_BUILD_PREFIX}$libname objects!"
}
@@ -336,7 +346,7 @@
# Important: -lgcc must appear after objects and static libraries,
# but before shared libraries for Android. It doesn't hurt
# for other platforms.
- builder_command ${_BUILD_BINPREFIX}g++ \
+ builder_command ${_BUILD_CXX} \
-Wl,-soname,$(basename $lib) \
-Wl,-shared,-Bsymbolic \
$_BUILD_LDFLAGS_BEGIN_SO \
@@ -427,11 +437,13 @@
# Same as builder_begin, but to target Android with a specific ABI
# $1: ABI name (e.g. armeabi)
# $2: Build directory
-# $3: Optional Makefile name
+# $3: Optional llvm version
+# $4: Optional Makefile name
builder_begin_android ()
{
local ARCH ABI PLATFORM BUILDDIR DSTDIR SYSROOT CFLAGS
local CRTBEGIN_SO_O CRTEND_SO_O CRTBEGIN_EXE_SO CRTEND_SO_O
+ local BINPREFIX GCC_TOOLCHAIN LLVM_TRIPLE
if [ -z "$NDK_DIR" ]; then
panic "NDK_DIR is not defined!"
elif [ ! -d "$NDK_DIR/platforms" ]; then
@@ -442,7 +454,14 @@
PLATFORM=${2##android-}
SYSROOT=$NDK_DIR/platforms/android-$PLATFORM/arch-$ARCH
- BINPREFIX=$NDK_DIR/$(get_default_toolchain_binprefix_for_arch $ARCH)
+ if [ -z "$3" ]; then
+ BINPREFIX=$NDK_DIR/$(get_default_toolchain_binprefix_for_arch $ARCH)
+ else
+ BINPREFIX=$NDK_DIR/$(get_llvm_toolchain_binprefix $3)
+ GCC_TOOLCHAIN=`dirname $NDK_DIR/$(get_default_toolchain_binprefix_for_arch $ARCH)`
+ GCC_TOOLCHAIN=`dirname $GCC_TOOLCHAIN`
+ fi
+
SYSROOT=$NDK_DIR/$(get_default_platform_sysroot_for_arch $ARCH)
CRTBEGIN_EXE_O=$SYSROOT/usr/lib/crtbegin_dynamic.o
@@ -457,9 +476,29 @@
CRTEND_SO_O=$CRTEND_EXE_O
fi
- builder_begin "$2" "$3"
+ builder_begin "$2" "$4"
builder_set_prefix "$ABI "
- builder_set_binprefix "$BINPREFIX"
+ if [ -z "$3" ]; then
+ builder_set_binprefix "$BINPREFIX"
+ else
+ builder_set_binprefix_llvm "$BINPREFIX"
+ case $ABI in
+ armeabi)
+ LLVM_TRIPLE=armv5te-none-linux-androideabi
+ ;;
+ armeabi-v7a)
+ LLVM_TRIPLE=armv7-none-linux-androideabi
+ ;;
+ x86)
+ LLVM_TRIPLE=i686-none-linux-android
+ ;;
+ mips)
+ LLVM_TRIPLE=mipsel-none-linux-android
+ ;;
+ esac
+ builder_cflags "-target $LLVM_TRIPLE -gcc-toolchain $GCC_TOOLCHAIN"
+ builder_ldflags "-target $LLVM_TRIPLE -gcc-toolchain $GCC_TOOLCHAIN"
+ fi
builder_cflags "--sysroot=$SYSROOT"
builder_cxxflags "--sysroot=$SYSROOT"
diff --git a/build/tools/prebuilt-common.sh b/build/tools/prebuilt-common.sh
index 6cfb888..d6b6433 100644
--- a/build/tools/prebuilt-common.sh
+++ b/build/tools/prebuilt-common.sh
@@ -1177,6 +1177,19 @@
echo "$BINPREFIX"
}
+# Return llvm toolchain binary path prefix for given llvm version
+# $1: llvm version
+# $2: optional, system name, defaults to $HOST_TAG
+get_llvm_toolchain_binprefix ()
+{
+ local NAME DIR BINPREFIX
+ local SYSTEM=${2:-$(get_prebuilt_host_tag)}
+ NAME=llvm-$1
+ DIR=$(get_toolchain_install . $NAME $SYSTEM)
+ BINPREFIX=${DIR#./}/bin/
+ echo "$BINPREFIX"
+}
+
# Return the default toochain binary path prefix for a given architecture
# For example: arm -> toolchains/arm-linux-androideabi-4.6/prebuilt/<system>/bin/arm-linux-androideabi-
# $1: Architecture name