Fix on-device toolchain script

1. build-device-llvm.sh use --abis instead of --arch
2. build-device-llvm.sh keeps BUILD_OUT explicitly specified
3. wrap more commands with "run" (better in --verbose)
4. more arch-specific flags

Change-Id: Ia453945215ada4532a24ab11f54ff195898c49ec
diff --git a/build/tools/build-device-llvm.sh b/build/tools/build-device-llvm.sh
index ba12744..b026fb3 100755
--- a/build/tools/build-device-llvm.sh
+++ b/build/tools/build-device-llvm.sh
@@ -30,16 +30,19 @@
 the top-level NDK installation path."
 
 RELEASE=`date +%Y%m%d`
-BUILD_OUT=/tmp/ndk-$USER/build/toolchain
-TOOLCHAIN_BUILD_PREFIX="$BUILD_OUT/../prefix"
-ARCHS="$DEFAULT_ARCHS"
+ABIS="$PREBUILT_ABIS"
 BUILDTOOLS=$ANDROID_NDK_ROOT/build/tools
 
+BUILD_OUT=/tmp/ndk-$USER/build/toolchain
+OPTION_BUILD_OUT=
+register_var_option "--build-out=<path>" OPTION_BUILD_OUT "Set temporary build directory"
+
+OUT_DIR="$BUILD_OUT/../prefix"
 OPTION_OUT_DIR=
 register_var_option "--out-dir=<path>" OPTION_OUT_DIR "On-device toolchain will be put at <path>"
 
-OPTION_ARCH=
-register_var_option "--arch=<arm,x86,mips>" OPTION_ARCH "Default: all"
+OPTION_ABIS=
+register_var_option "--abis=<armeabi,armeabi-v7a,x86,mips>" OPTION_ABIS "Default: $ABIS"
 
 OPTION_GCC_VERSION=
 register_var_option "--gcc-version=<version>" OPTION_GCC_VERSION "Specify GCC toolchain version [Default: $DEFAULT_GCC_VERSION]"
@@ -50,10 +53,12 @@
 
 prepare_canadian_toolchain /tmp/ndk-$USER/build
 
-fix_option TOOLCHAIN_BUILD_PREFIX "$OPTION_OUT_DIR" "On-device toolchain will be put at <path>"
-fix_option ARCHS "$OPTION_ARCH" "on-device architecture"
-ARCHS="`commas_to_spaces $ARCHS`"
+fix_option ABIS "$OPTION_ABIS" "on-device architecture"
+ABIS=($commas_to_spaces $ABIS)
+fix_option BUILD_OUT "$OPTION_BUILD_OUT" "build directory"
 setup_default_log_file $BUILD_OUT/config.log
+fix_option OUT_DIR "$OPTION_OUT_DIR" "On-device toolchain will be put at <path>"
+TOOLCHAIN_BUILD_PREFIX="$OUT_DIR"
 
 set_parameters ()
 {
@@ -107,11 +112,6 @@
 prepare_abi_configure_build
 set_toolchain_ndk $NDK_DIR $TOOLCHAIN
 
-if [ "$MINGW" != "yes" -a "$DARWIN" != "yes" ] ; then
-    dump "Using C compiler: $CC"
-    dump "Using C++ compiler: $CXX"
-fi
-
 rm -rf $BUILD_OUT
 mkdir -p $BUILD_OUT
 
@@ -138,43 +138,54 @@
 PATH="`echo $PATH | sed -e \"s#$aosp_regex##g\"`"
 export PATH
 
-for arch in $ARCHS; do
-  dump "Rebuild for architecture $arch"
+for abi in $ABIS; do
+  dump "Rebuild for ABI $abi"
 
   # configure the toolchain
   dump "Configure: $TOOLCHAIN toolchain build"
-  LLVM_BUILD_OUT=$BUILD_OUT/llvm/$arch
-  mkdir -p $LLVM_BUILD_OUT && cd $LLVM_BUILD_OUT
+  LLVM_BUILD_OUT=$BUILD_OUT/llvm/$abi
+  run mkdir -p $LLVM_BUILD_OUT && cd $LLVM_BUILD_OUT
   fail_panic "Couldn't cd into llvm build path: $LLVM_BUILD_OUT"
 
+  arch="$(convert_abi_to_arch $abi)"
   toolchain_prefix=`get_default_toolchain_prefix_for_arch $arch`
   toolchain_name=`get_default_toolchain_name_for_arch $arch`
   if [ -n "$OPTION_GCC_VERSION" ]; then
     toolchain_name="${toolchain_name//${DEFAULT_GCC_VERSION}/${OPTION_GCC_VERSION}}"
   fi
-  extra_configure_flags=''
-  if [ $arch = "arm" ]; then
-    extra_configure_flags='-mthumb -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16'
-  fi
+  CFLAGS="-fomit-frame-pointer -fstrict-aliasing"
+  case $abi in
+    armeabi)
+      # No -mthumb, because ./llvm/lib/Target/ARM/ARMJITInfo.cpp now contain inline assembly
+      # code such as "stmdb sp!,{r0,r1,r2,r3,lr}" which doesn't support thumb1
+      CFLAGS=$CFLAGS" -march=armv5te -msoft-float"
+      ;;
+    armeabi-v7a)
+      CFLAGS=$CFLAGS" -mthumb -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16"
+      ;;
+    mips)
+      CFLAGS=$CFLAGS" -fmessage-length=0 -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers"
+      ;;
+  esac
 
   run $BUILDTOOLS/make-standalone-toolchain.sh \
     --toolchain=$toolchain_name \
     --stl=stlport \
     --arch=$arch \
-    --system=linux-$HOST_ARCH \
+    --system=$HOST_TAG \
     --platform=android-9 \
     --install-dir=$BUILD_OUT/ndk-standalone-$arch
   fail_panic "Couldn't make standalone for $arch"
 
-  mkdir -p $TOOLCHAIN_BUILD_PREFIX/$arch
-  cp -f $BUILD_OUT/ndk-standalone-$arch/$toolchain_prefix/lib/libstlport_shared.so $TOOLCHAIN_BUILD_PREFIX/$arch
+  run mkdir -p $TOOLCHAIN_BUILD_PREFIX/$abi
+  run cp -f $BUILD_OUT/ndk-standalone-$arch/$toolchain_prefix/lib/libstlport_shared.so $TOOLCHAIN_BUILD_PREFIX/$abi
 
   CC=$BUILD_OUT/ndk-standalone-$arch/bin/$toolchain_prefix-gcc
   CXX=$BUILD_OUT/ndk-standalone-$arch/bin/$toolchain_prefix-g++
   export CC CXX
 
   run $SRC_DIR/$TOOLCHAIN/llvm/configure \
-    --prefix=$TOOLCHAIN_BUILD_PREFIX/$arch \
+    --prefix=$TOOLCHAIN_BUILD_PREFIX/$abi \
     --host=$toolchain_prefix \
     --with-bug-report-url=$DEFAULT_ISSUE_TRACKER_URL \
     --enable-targets=$arch \
@@ -185,8 +196,8 @@
     --enable-shared \
     --with-extra-ld-options=-lstlport_shared \
     --disable-assertions \
-    --with-extra-options="$extra_configure_flags"
-  fail_panic "Couldn't configure llvm toolchain for $arch"
+    --with-extra-options="$CFLAGS"
+  fail_panic "Couldn't configure llvm toolchain for ABI $abi"
 
   dump "Building : llvm toolchain [this can take a long time]."
   unset CC CXX  # Need for BuildTools
@@ -195,28 +206,28 @@
   fail_panic "Couldn't compile llvm toolchain"
 
   # Copy binaries what we need
-  mkdir -p $TOOLCHAIN_BUILD_PREFIX/$arch
-  cp -f $LLVM_BUILD_OUT/Release/lib/libLLVM-${DEFAULT_LLVM_VERSION}.so $TOOLCHAIN_BUILD_PREFIX/$arch
-  cp -f $LLVM_BUILD_OUT/Release/bin/le32-none-ndk-translate $TOOLCHAIN_BUILD_PREFIX/$arch
-  cp -f $LLVM_BUILD_OUT/Release/bin/llc $TOOLCHAIN_BUILD_PREFIX/$arch
+  run mkdir -p $TOOLCHAIN_BUILD_PREFIX/$abi
+  run cp -f $LLVM_BUILD_OUT/Release/lib/libLLVM-${DEFAULT_LLVM_VERSION}.so $TOOLCHAIN_BUILD_PREFIX/$abi
+  run cp -f $LLVM_BUILD_OUT/Release/bin/le32-none-ndk-translate $TOOLCHAIN_BUILD_PREFIX/$abi
+  run cp -f $LLVM_BUILD_OUT/Release/bin/llc $TOOLCHAIN_BUILD_PREFIX/$abi
 
   # build mclinker only against default the LLVM version, once
   dump "Configure: mclinker against $TOOLCHAIN"
-  MCLINKER_BUILD_OUT=$MCLINKER_SRC_DIR/build/$arch
-  mkdir -p $MCLINKER_BUILD_OUT && cd $MCLINKER_BUILD_OUT
+  MCLINKER_BUILD_OUT=$MCLINKER_SRC_DIR/build/$abi
+  run mkdir -p $MCLINKER_BUILD_OUT && cd $MCLINKER_BUILD_OUT
   fail_panic "Couldn't cd into mclinker build path: $MCLINKER_BUILD_OUT"
 
-  CC=$BUILD_OUT/ndk-standalone-$arch/bin/$toolchain_prefix-gcc
-  CXX="$BUILD_OUT/ndk-standalone-$arch/bin/$toolchain_prefix-g++ -lstlport_shared"
+  CC="$BUILD_OUT/ndk-standalone-$arch/bin/$toolchain_prefix-gcc $CFLAGS"
+  CXX="$BUILD_OUT/ndk-standalone-$arch/bin/$toolchain_prefix-g++ $CFLAGS -lstlport_shared"
   export CC CXX
 
   run $MCLINKER_SRC_DIR/configure \
-    --prefix=$TOOLCHAIN_BUILD_PREFIX/$arch \
+    --prefix=$TOOLCHAIN_BUILD_PREFIX/$abi \
     --with-llvm-config=$LLVM_BUILD_OUT/BuildTools/Release/bin/llvm-config \
     --with-llvm-shared-lib=$LLVM_BUILD_OUT/Release/lib/libLLVM-${DEFAULT_LLVM_VERSION}.so \
     --enable-targets=$arch \
     --host=$toolchain_prefix
-  fail_panic "Couldn't configure mclinker for $arch"
+  fail_panic "Couldn't configure mclinker for ABI $abi"
 
   CXXFLAGS="$CXXFLAGS -fexceptions"  # optimized/ScriptParser.cc needs it
   export CXXFLAGS
@@ -225,14 +236,17 @@
   run make -j$NUM_JOBS $MAKE_FLAGS CXXFLAGS="$CXXFLAGS"
   fail_panic "Couldn't compile mclinker"
 
-  mkdir -p $TOOLCHAIN_BUILD_PREFIX/$arch
-  cp -f $MCLINKER_BUILD_OUT/optimized/ld.mcld $TOOLCHAIN_BUILD_PREFIX/$arch
+  run mkdir -p $TOOLCHAIN_BUILD_PREFIX/$abi
+  run cp -f $MCLINKER_BUILD_OUT/optimized/ld.mcld $TOOLCHAIN_BUILD_PREFIX/$abi
 
   # Strip
   STRIP=$BUILD_OUT/ndk-standalone-$arch/bin/$toolchain_prefix-strip
-  find $TOOLCHAIN_BUILD_PREFIX/$arch -maxdepth 1 -type f -exec $STRIP --strip-all {} \;
+  find $TOOLCHAIN_BUILD_PREFIX/$abi -maxdepth 1 -type f -exec $STRIP --strip-all {} \;
 done
 
 TOOLCHAIN_BUILD_PREFIX="`cd $TOOLCHAIN_BUILD_PREFIX; pwd`"
+
 dump "Done. Output is under $TOOLCHAIN_BUILD_PREFIX"
-rm -rf $BUILD_OUT
+if [ -z "$OPTION_BUILD_OUT" ] ; then
+  rm -rf $BUILD_OUT
+fi
\ No newline at end of file
diff --git a/build/tools/build-on-device-toolchain.sh b/build/tools/build-on-device-toolchain.sh
index 8c2a106..c06a388 100755
--- a/build/tools/build-on-device-toolchain.sh
+++ b/build/tools/build-on-device-toolchain.sh
@@ -53,9 +53,8 @@
 SRC_DIR="$PARAMETERS"
 check_toolchain_src_dir "$SRC_DIR"
 BUILDTOOLS=$ANDROID_NDK_ROOT/build/tools
-rm -rf $BUILD_DIR; mkdir -p $BUILD_DIR
-mkdir -p $OUT_DIR
-
+run rm -rf $BUILD_DIR
+run mkdir -p $BUILD_DIR $OUT_DIR
 
 FLAGS=
 if [ "$VERBOSE" = "yes" ]; then
@@ -73,45 +72,46 @@
 SYSROOT=$NDK_DIR/$(get_default_platform_sysroot_for_arch $ARCH)
 OUT_SYSROOT=$OUT_DIR
 
-mkdir -p $OUT_SYSROOT/usr/bin
-mkdir -p $OUT_SYSROOT/usr/lib
+run mkdir -p $OUT_SYSROOT/usr/bin
+run mkdir -p $OUT_SYSROOT/usr/lib
 
 dump "Copy platform CRT files..."
-cp -r $SYSROOT/usr/lib/crtbegin_dynamic.o $OUT_SYSROOT/usr/lib
-cp -r $SYSROOT/usr/lib/crtbegin_so.o $OUT_SYSROOT/usr/lib
-cp -r $SYSROOT/usr/lib/crtend_android.o $OUT_SYSROOT/usr/lib
-cp -r $SYSROOT/usr/lib/crtend_so.o $OUT_SYSROOT/usr/lib
+run cp -r $SYSROOT/usr/lib/crtbegin_dynamic.o $OUT_SYSROOT/usr/lib
+run cp -r $SYSROOT/usr/lib/crtbegin_so.o $OUT_SYSROOT/usr/lib
+run cp -r $SYSROOT/usr/lib/crtend_android.o $OUT_SYSROOT/usr/lib
+run cp -r $SYSROOT/usr/lib/crtend_so.o $OUT_SYSROOT/usr/lib
 
 dump "Copy $ABI gabi++ library"
-cp -f $NDK_DIR/$GABIXX_SUBDIR/libs/$ABI/libgabi++_shared.so $OUT_SYSROOT/usr/lib
+run cp -f $NDK_DIR/$GABIXX_SUBDIR/libs/$ABI/libgabi++_shared.so $OUT_SYSROOT/usr/lib
 
 dump "Copy $ABI libportable library"
-cp -f $NDK_DIR/$LIBPORTABLE_SUBDIR/libs/$ABI/libportable.a $OUT_SYSROOT/usr/lib
-cp -f $NDK_DIR/$LIBPORTABLE_SUBDIR/libs/$ABI/libportable.wrap $OUT_SYSROOT/usr/lib
+run cp -f $NDK_DIR/$LIBPORTABLE_SUBDIR/libs/$ABI/libportable.a $OUT_SYSROOT/usr/lib
+run cp -f $NDK_DIR/$LIBPORTABLE_SUBDIR/libs/$ABI/libportable.wrap $OUT_SYSROOT/usr/lib
 
 dump "Copy $ABI libportable library"
-cp -f $NDK_DIR/$COMPILER_RT_SUBDIR/libs/$ABI/libcompiler_rt_static.a $OUT_SYSROOT/usr/lib
+run cp -f $NDK_DIR/$COMPILER_RT_SUBDIR/libs/$ABI/libcompiler_rt_static.a $OUT_SYSROOT/usr/lib
 
 if [ "$TESTING" = "yes" ]; then
   dump "Copy stuff for testing"
-  cp -f $NDK_DIR/$GNUSTL_SUBDIR/$GCC_TOOLCHAIN_VERSION/libs/$ABI/libsupc++.a $OUT_SYSROOT/usr/lib
-  cp -f $NDK_DIR/$GNUSTL_SUBDIR/$GCC_TOOLCHAIN_VERSION/libs/$ABI/libgnustl_static.a $OUT_SYSROOT/usr/lib
-  cp -f $NDK_DIR/$GNUSTL_SUBDIR/$GCC_TOOLCHAIN_VERSION/libs/$ABI/libgnustl_shared.so $OUT_SYSROOT/usr/lib
+  run cp -f $NDK_DIR/$GNUSTL_SUBDIR/$GCC_TOOLCHAIN_VERSION/libs/$ABI/libsupc++.a $OUT_SYSROOT/usr/lib
+  run cp -f $NDK_DIR/$GNUSTL_SUBDIR/$GCC_TOOLCHAIN_VERSION/libs/$ABI/libgnustl_static.a $OUT_SYSROOT/usr/lib
+  run cp -f $NDK_DIR/$GNUSTL_SUBDIR/$GCC_TOOLCHAIN_VERSION/libs/$ABI/libgnustl_shared.so $OUT_SYSROOT/usr/lib
 
-  cp -f $NDK_DIR/$STLPORT_SUBDIR/libs/$ABI/libstlport_static.a $OUT_SYSROOT/usr/lib
-  cp -f $NDK_DIR/$STLPORT_SUBDIR/libs/$ABI/libstlport_shared.so $OUT_SYSROOT/usr/lib
+  run cp -f $NDK_DIR/$STLPORT_SUBDIR/libs/$ABI/libstlport_static.a $OUT_SYSROOT/usr/lib
+  run cp -f $NDK_DIR/$STLPORT_SUBDIR/libs/$ABI/libstlport_shared.so $OUT_SYSROOT/usr/lib
 
-  cp -f $NDK_DIR/$GABIXX_SUBDIR/libs/$ABI/libgabi++_static.a $OUT_SYSROOT/usr/lib
-  cp -f $NDK_DIR/$GABIXX_SUBDIR/libs/$ABI/libgabi++_shared.so $OUT_SYSROOT/usr/lib
+  run cp -f $NDK_DIR/$GABIXX_SUBDIR/libs/$ABI/libgabi++_static.a $OUT_SYSROOT/usr/lib
+  run cp -f $NDK_DIR/$GABIXX_SUBDIR/libs/$ABI/libgabi++_shared.so $OUT_SYSROOT/usr/lib
 fi
 
 
-dump "Build $ARCH LLVM toolchain..."
-run $BUILDTOOLS/build-device-llvm.sh $FLAGS --arch=$ARCH --gcc-version=$GCC_TOOLCHAIN_VERSION $SRC_DIR $NDK_DIR
+dump "Build $ABI LLVM toolchain from $SRC_DIR ..."
+run $BUILDTOOLS/build-device-llvm.sh $FLAGS --abis=$ABI --gcc-version=$GCC_TOOLCHAIN_VERSION $SRC_DIR $NDK_DIR
 fail_panic "Could not build le32 LLVM toolchain!"
-mv -f $TMP_OUT_DIR/$ARCH/lib*.so $OUT_SYSROOT/usr/lib
-mv -f $TMP_OUT_DIR/$ARCH/* $OUT_SYSROOT/usr/bin
-
+run mv -f $TMP_OUT_DIR/$ABI/lib*.so $OUT_SYSROOT/usr/lib
+run mv -f $TMP_OUT_DIR/$ABI/* $OUT_SYSROOT/usr/bin
+run rmdir $TMP_OUT_DIR/$ABI
+run rmdir $TMP_OUT_DIR
 
 if [ "$NO_SYNC" != "yes" ]; then
   dump "Push on-device $ABI toolchain sysroot to /data/local/tmp/"