Merge "Add options to dev-rebuild-ndk.sh and scripts to customize NDK build"
diff --git a/build/tools/build-host-prebuilts.sh b/build/tools/build-host-prebuilts.sh
index f76101f..a1cbf29 100755
--- a/build/tools/build-host-prebuilts.sh
+++ b/build/tools/build-host-prebuilts.sh
@@ -55,6 +55,9 @@
 NO_GEN_PLATFORMS=
 register_var_option "--no-gen-platforms" NO_GEN_PLATFORMS "Don't generate platforms/ directory, use existing one"
 
+GCC_VERSION_LIST="default" # it's arch defined by default so use default keyword
+register_var_option "--gcc-version-list=<vers>" GCC_VERSION_LIST "List of GCC release versions"
+
 LLVM_VERSION_LIST=$DEFAULT_LLVM_VERSION_LIST
 register_var_option "--llvm-version-list=<vers>" LLVM_VERSION_LIST "List of LLVM release versions"
 
@@ -319,8 +322,19 @@
     # Then the toolchains
     for ARCH in $ARCHS; do
         TOOLCHAIN_NAMES=$(get_toolchain_name_list_for_arch $ARCH)
+        if [ "$GCC_VERSION_LIST" != "default" ]; then
+           TOOLCHAINS=
+           for VERSION in $(commas_to_spaces $GCC_VERSION_LIST); do
+              for TOOLCHAIN in $TOOLCHAIN_NAMES; do
+                 if [ $TOOLCHAIN != ${TOOLCHAIN%%$VERSION} ]; then
+                    TOOLCHAINS="$TOOLCHAIN $TOOLCHAINS"
+                 fi
+              done
+           done
+           TOOLCHAIN_NAMES=$TOOLCHAINS
+        fi
         if [ -z "$TOOLCHAIN_NAMES" ]; then
-            echo "ERROR: Invalid architecture name: $ARCH"
+            echo "ERROR: Toolchains: "$(spaces_to_commas $GCC_VERSION_LIST)" are not available for arch: $ARCH"
             exit 1
         fi
 
diff --git a/build/tools/dev-rebuild-ndk.sh b/build/tools/dev-rebuild-ndk.sh
index 3acc329..4bc0ec8 100755
--- a/build/tools/dev-rebuild-ndk.sh
+++ b/build/tools/dev-rebuild-ndk.sh
@@ -40,9 +40,19 @@
 OPTION_QUICK_BUILD="no"
 register_var_option "--quick" OPTION_QUICK_BUILD "Only build the Linux basics"
 
+ARCHS=$(find_ndk_unknown_archs)
+ARCHS="$DEFAULT_ARCHS $ARCHS"
+register_var_option "--arch=<arch>" ARCHS "Specify target architectures"
+
 # List of toolchains to package
-OPTION_TOOLCHAINS="$DEFAULT_ARCH_TOOLCHAIN_NAME_arm,$DEFAULT_ARCH_TOOLCHAIN_NAME_x86,$DEFAULT_ARCH_TOOLCHAIN_NAME_mips"
-register_var_option "--toolchains=<toolchain[,toolchain]>" OPTION_TOOLCHAINS "Toolchain(s) to package"
+GCC_VERSION_LIST="default" # it's arch defined by default so use default keyword
+register_var_option "--gcc-version-list=<vers>" GCC_VERSION_LIST "List of GCC release versions"
+
+LLVM_VERSION_LIST=$DEFAULT_LLVM_VERSION_LIST
+register_var_option "--llvm-version-list=<vers>" LLVM_VERSION_LIST "List of LLVM release versions"
+
+OPTION_SRC_DIR=
+register_var_option "--toolchain-src-dir=<path>" OPTION_SRC_DIR "Select toolchain source directory"
 
 OPTION_TRY_64=
 register_try64_option
@@ -135,24 +145,23 @@
 
 echo
 echo "Checking for Toolchain sources"
-NDK_SRC_DIR=/tmp/ndk-$USER/src/android-ndk-src-${TOOLCHAIN_GIT_DATE}${PATCHES_SHA1}
-if [ ! -d $NDK_SRC_DIR ]
+if [ -z "$OPTION_SRC_DIR" ]
+then
+    OPTION_SRC_DIR=/tmp/ndk-$USER/src/android-ndk-src-${TOOLCHAIN_GIT_DATE}${PATCHES_SHA1}
+fi
+if [ ! -d $OPTION_SRC_DIR ]
 then
     echo "  Downloading Toolchain sources"
-    mkdir -p `dirname $NDK_SRC_DIR`
+    mkdir -p `dirname $OPTION_SRC_DIR`
     logfile="$TOP/download-toolchain-sources.log"
     rotate_log $logfile
-    $PROGDIR/download-toolchain-sources.sh $NDK_SRC_DIR \
+    $PROGDIR/download-toolchain-sources.sh $OPTION_SRC_DIR \
         > $logfile 2>&1
     fail_panic "Could not download toolchain sources!"
 else
-    echo "  Found existing $NDK_SRC_DIR"
+    echo "  Found existing $OPTION_SRC_DIR"
 fi
 
-
-ARCHS=$(find_ndk_unknown_archs)
-ARCHS="$DEFAULT_ARCHS $ARCHS"
-
 # Build the platform
 echo
 echo "Build the ndk/platforms directory"
@@ -199,12 +208,14 @@
     $PROGDIR/rebuild-all-prebuilt.sh \
         --arch=$(spaces_to_commas $ARCHS)  \
         --package-dir=$PACKAGE_DIR \
+        --gcc-version-list="$GCC_VERSION_LIST" \
+        --llvm-version-list="$LLVM_VERSION_LIST" \
         $MPFR_VERSION $GDB_VERSION $BINUTILS_VERSION \
         $TARGET_PLATFORM_FLAGS \
         $VERBOSE \
         $OPTION_TRY_64 \
         $OPTION_ALSO_64 \
-        $NDK_SRC_DIR >> $logfile 2>&1
+        $OPTION_SRC_DIR >> $logfile 2>&1
     fail_panic "rebuild-all-prebuilt.sh failed. Logfile in $logfile"
 done # with TARGET_PLATFORM
 
@@ -220,17 +231,18 @@
     --systems="$ALL_SYSTEMS" \
     --out-dir=$PACKAGE_DIR \
     --arch=$(spaces_to_commas $ARCHS)  \
+    --gcc-version-list="$GCC_VERSION_LIST" \
+    --llvm-version-list="$LLVM_VERSION_LIST" \
     --prefix=android-ndk-${OPTION_NDK_RELEASE} \
     $OPTION_TRY_64 \
     $OPTION_SEPARATE_64 \
-    --no-git \
     $VERBOSE > $logfile 2>&1
 fail_panic "package-release.sh failed. Logfile in $logfile"
 
 echo
 echo "Packaging the NDK Toolchain sources"
 NDK_TOOLCHAIN_PKG=${PACKAGE_DIR}/toolchain-src.tar.bz2
-(cd $NDK_SRC_DIR && tar cjf $NDK_TOOLCHAIN_PKG .)
+(cd $OPTION_SRC_DIR && tar cjf $NDK_TOOLCHAIN_PKG .)
 fail_panic "Could not package NDK Toolchain sources!"
 
 exit 0
diff --git a/build/tools/package-release.sh b/build/tools/package-release.sh
index 52965fa..b01da5c 100755
--- a/build/tools/package-release.sh
+++ b/build/tools/package-release.sh
@@ -60,8 +60,7 @@
 register_var_option "--no-git" NO_GIT "Don't use git to list input files, take all of them."
 
 # set of toolchain prebuilts we need to package
-TOOLCHAINS=$(get_toolchain_name_list_for_arch arm)
-OPTION_TOOLCHAINS=$TOOLCHAINS
+OPTION_TOOLCHAINS=
 register_var_option "--toolchains=<list>" OPTION_TOOLCHAINS "Specify list of toolchains."
 
 # set of platforms to package (all by default)
@@ -80,8 +79,11 @@
 DEVELOPMENT_ROOT=`dirname $ANDROID_NDK_ROOT`/development/ndk
 register_var_option "--development-root=<path>" DEVELOPMENT_ROOT "Specify platforms/samples directory"
 
+GCC_VERSION_LIST="default" # it's arch defined by default so use default keyword
+register_var_option "--gcc-version-list=<vers>" GCC_VERSION_LIST "List of GCC release versions"
+
 LLVM_VERSION_LIST=$DEFAULT_LLVM_VERSION_LIST
-register_var_option "--llvm=<versions>" LLVM_VERSION_LIST "List of LLVM release versions"
+register_var_option "--llvm-version-list=<versions>" LLVM_VERSION_LIST "List of LLVM release versions"
 
 register_try64_option
 
@@ -130,32 +132,6 @@
     ARCHS=$(filter_out "$UNKNOWN_ARCH" "$ARCHS")
 fi
 
-TRY_x86=
-TRY_mips=
-TRY_arm64=
-TRY_x86_64=
-TRY_mips64=
-echo "$ARCHS" | tr ' ' '\n' | grep -q x86
-if [ $? = 0 ] ; then
-    TRY_x86=yes
-fi
-echo "$ARCHS" | tr ' ' '\n' | grep -q mips
-if [ $? = 0 ] ; then
-    TRY_mips=yes
-fi
-echo "$ARCHS" | tr ' ' '\n' | grep -q arm64
-if [ $? = 0 ] ; then
-    TRY_arm64=yes
-fi
-echo "$ARCHS" | tr ' ' '\n' | grep -q x86_64
-if [ $? = 0 ] ; then
-    TRY_x86_64=yes
-fi
-echo "$ARCHS" | tr ' ' '\n' | grep -q mips64
-if [ $? = 0 ] ; then
-    TRY_mips64=yes
-fi
-
 # Compute ABIS from ARCHS
 ABIS=
 for ARCH in $ARCHS; do
@@ -181,24 +157,27 @@
 if [ "$OPTION_TOOLCHAINS" != "$TOOLCHAINS" ]; then
     TOOLCHAINS=$(commas_to_spaces $OPTION_TOOLCHAINS)
 else
-    if [ "$TRY_x86" = "yes" ]; then
-        TOOLCHAINS=$TOOLCHAINS" "$(get_toolchain_name_list_for_arch x86)
-    fi
-    if [ "$TRY_mips" = "yes" ]; then
-        TOOLCHAINS=$TOOLCHAINS" "$(get_toolchain_name_list_for_arch mips)
-    fi
-    if [ "$TRY_arm64" = "yes" ]; then
-        TOOLCHAINS=$TOOLCHAINS" "$(get_toolchain_name_list_for_arch arm64)
-    fi
-    if [ "$TRY_x86_64" = "yes" ]; then
-        TOOLCHAINS=$TOOLCHAINS" "$(get_toolchain_name_list_for_arch x86_64)
-    fi
-    if [ "$TRY_mips64" = "yes" ]; then
-        TOOLCHAINS=$TOOLCHAINS" "$(get_toolchain_name_list_for_arch mips64)
-    fi
+    for ARCH in $ARCHS; do
+       case $ARCH in
+           arm|arm64|x86|x86_64|mips|mips64) TOOLCHAINS=$TOOLCHAINS" "$(get_toolchain_name_list_for_arch $ARCH) ;;
+           *) echo "ERROR: Unknown arch to package: $ARCH"; exit 1 ;;
+       esac
+    done
     TOOLCHAINS=$(commas_to_spaces $TOOLCHAINS)
 fi
 
+if [ "$GCC_VERSION_LIST" != "default" ]; then
+   TOOLCHAIN_NAMES=
+   for VERSION in $(commas_to_spaces $GCC_VERSION_LIST); do
+      for TOOLCHAIN in $TOOLCHAINS; do
+         if [ $TOOLCHAIN != ${TOOLCHAIN%%$VERSION} ]; then
+            TOOLCHAIN_NAMES="$TOOLCHAIN $TOOLCHAIN_NAMES"
+         fi
+      done
+   done
+   TOOLCHAINS=$TOOLCHAIN_NAMES
+fi
+
 # Check the prebuilt path
 #
 if [ -n "$PREBUILT_NDK" -a -n "$PREBUILT_DIR" ] ; then
@@ -248,7 +227,8 @@
 
 echo "Architectures: $ARCHS"
 echo "CPU ABIs: $ABIS"
-echo "Toolchains: $TOOLCHAINS"
+echo "GCC Toolchains: $TOOLCHAINS"
+echo "LLVM Toolchains: $LLVM_VERSION_LIST"
 echo "Host systems: $SYSTEMS"
 
 
@@ -546,7 +526,9 @@
         done
 
         # Unpack mclinker
-        unpack_prebuilt ld.mcld-$SYSTEM "$DSTDIR" "$DSTDIR64"
+        if [ -n "$LLVM_VERSION_LIST" ]; then
+            unpack_prebuilt ld.mcld-$SYSTEM "$DSTDIR" "$DSTDIR64"
+        fi
         rm -rf $DSTDIR/toolchains/*l
         rm -rf $DSTDIR64/toolchains/*l
 
diff --git a/build/tools/rebuild-all-prebuilt.sh b/build/tools/rebuild-all-prebuilt.sh
index 9592ba7..1772255 100755
--- a/build/tools/rebuild-all-prebuilt.sh
+++ b/build/tools/rebuild-all-prebuilt.sh
@@ -34,6 +34,12 @@
 NO_GEN_PLATFORMS=
 register_var_option "--no-gen-platforms" NO_GEN_PLATFORMS "Don't generate platforms/ directory, use existing one"
 
+GCC_VERSION_LIST="default" # it's arch defined by default so use default keyword
+register_var_option "--gcc-version-list=<vers>" GCC_VERSION_LIST "List of GCC release versions"
+
+LLVM_VERSION_LIST=$DEFAULT_LLVM_VERSION_LIST
+register_var_option "--llvm-version-list=<vers>" LLVM_VERSION_LIST "List of LLVM release versions"
+
 SYSTEMS=$HOST_TAG32
 if [ "$HOST_TAG32" = "linux-x86" ]; then
     SYSTEMS=$SYSTEMS",windows"
@@ -103,6 +109,11 @@
 fi
 
 HOST_FLAGS=$FLAGS" --systems=$(spaces_to_commas $SYSTEMS)"
+if [ "$GCC_VERSION_LIST" != "default" ]; then
+    HOST_FLAGS=$HOST_FLAGS" --gcc-version-list=$(spaces_to_commas $GCC_VERSION_LIST)"
+fi
+HOST_FLAGS=$HOST_FLAGS" --llvm-version-list=$(spaces_to_commas $LLVM_VERSION_LIST)"
+
 if [ "$TRY64" = "yes" ]; then
     HOST_FLAGS=$HOST_FLAGS" --try-64"
 fi