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