Home | History | Annotate | Download | only in tools
      1 #!/bin/bash
      2 # Copyright (C) 2010 The Android Open Source Project
      3 #
      4 # Licensed under the Apache License, Version 2.0 (the "License");
      5 # you may not use this file except in compliance with the License.
      6 # You may obtain a copy of the License at
      7 #
      8 #      http://www.apache.org/licenses/LICENSE-2.0
      9 #
     10 # Unless required by applicable law or agreed to in writing, software
     11 # distributed under the License is distributed on an "AS IS" BASIS,
     12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 # See the License for the specific language governing permissions and
     14 # limitations under the License.
     15 #
     16 
     17 # Create a standalone toolchain package for Android.
     18 
     19 . `dirname $0`/prebuilt-common.sh
     20 
     21 PROGRAM_PARAMETERS=""
     22 PROGRAM_DESCRIPTION=\
     23 "Generate a customized Android toolchain installation that includes
     24 a working sysroot. The result is something that can more easily be
     25 used as a standalone cross-compiler, e.g. to run configure and
     26 make scripts."
     27 
     28 # For now, this is the only toolchain that works reliably.
     29 TOOLCHAIN_NAME=
     30 register_var_option "--toolchain=<name>" TOOLCHAIN_NAME "Specify toolchain name"
     31 
     32 USE_LLVM=no
     33 do_option_use_llvm ()
     34 {
     35     USE_LLVM=yes
     36 }
     37 register_option "--use-llvm" do_option_use_llvm "Use LLVM."
     38 
     39 STL=gnustl
     40 register_var_option "--stl=<name>" STL "Specify C++ STL"
     41 
     42 ARCH=
     43 register_var_option "--arch=<name>" ARCH "Specify target architecture"
     44 
     45 # Grab the ABIs that match the architecture.
     46 ABIS=
     47 register_var_option "--abis=<list>" ABIS "Specify list of target ABIs."
     48 
     49 NDK_DIR=`dirname $0`
     50 NDK_DIR=`dirname $NDK_DIR`
     51 NDK_DIR=`dirname $NDK_DIR`
     52 register_var_option "--ndk-dir=<path>" NDK_DIR "Take source files from NDK at <path>"
     53 
     54 PACKAGE_DIR=$TMPDIR
     55 register_var_option "--package-dir=<path>" PACKAGE_DIR "Place package file in <path>"
     56 
     57 INSTALL_DIR=
     58 register_var_option "--install-dir=<path>" INSTALL_DIR "Don't create package, install files to <path> instead."
     59 
     60 PLATFORM=
     61 register_option "--platform=<name>" do_platform "Specify target Android platform/API level." "android-3"
     62 do_platform () {
     63     PLATFORM=$1;
     64     if [ "$PLATFORM" = "android-L" ]; then
     65         echo "WARNING: android-L is renamed as android-21"
     66         PLATFORM=android-21
     67     fi
     68 }
     69 
     70 extract_parameters "$@"
     71 
     72 # Check NDK_DIR
     73 if [ ! -d "$NDK_DIR/build/core" ] ; then
     74     echo "Invalid source NDK directory: $NDK_DIR"
     75     echo "Please use --ndk-dir=<path> to specify the path of an installed NDK."
     76     exit 1
     77 fi
     78 
     79 # Check TOOLCHAIN_NAME
     80 ARCH_BY_TOOLCHAIN_NAME=
     81 if [ -n "$TOOLCHAIN_NAME" ]; then
     82     case $TOOLCHAIN_NAME in
     83         arm-*)
     84             ARCH_BY_TOOLCHAIN_NAME=arm
     85             ;;
     86         x86-*)
     87             ARCH_BY_TOOLCHAIN_NAME=x86
     88             ;;
     89         mipsel-*)
     90             ARCH_BY_TOOLCHAIN_NAME=mips
     91             ;;
     92         aarch64-*)
     93             ARCH_BY_TOOLCHAIN_NAME=arm64
     94             ;;
     95         x86_64-linux-android-*)
     96             ARCH_BY_TOOLCHAIN_NAME=x86_64
     97             TOOLCHAIN_NAME=$(echo "$TOOLCHAIN_NAME" | sed -e 's/-linux-android//')
     98             echo "Auto-truncate: --toolchain=$TOOLCHAIN_NAME"
     99             ;;
    100         x86_64-*)
    101             ARCH_BY_TOOLCHAIN_NAME=x86_64
    102             ;;
    103         mips64el-*)
    104             ARCH_BY_TOOLCHAIN_NAME=mips64
    105             ;;
    106         *)
    107             echo "Invalid toolchain $TOOLCHAIN_NAME"
    108             exit 1
    109             ;;
    110     esac
    111 fi
    112 # Check ARCH
    113 if [ -z "$ARCH" ]; then
    114     ARCH=$ARCH_BY_TOOLCHAIN_NAME
    115     if [ -z "$ARCH" ]; then
    116         ARCH=arm
    117     fi
    118     echo "Auto-config: --arch=$ARCH"
    119 fi
    120 
    121 if [ -z "$ABIS" ]; then
    122     ABIS=$(convert_arch_to_abi $ARCH)
    123 fi
    124 
    125 if [ -z "$ABIS" ]; then
    126     dump "ERROR: No ABIS. Possibly unsupported NDK architecture $ARCH?"
    127     exit 1
    128 fi
    129 
    130 # Check toolchain name
    131 if [ -z "$TOOLCHAIN_NAME" ]; then
    132     TOOLCHAIN_NAME=$(get_default_toolchain_name_for_arch $ARCH)
    133     echo "Auto-config: --toolchain=$TOOLCHAIN_NAME"
    134 fi
    135 
    136 # Detect LLVM version from toolchain name with *clang*
    137 TOOLCHAIN_LLVM=$(echo "$TOOLCHAIN_NAME" | grep clang)
    138 if [ -n "$TOOLCHAIN_LLVM" ]; then
    139     USE_LLVM=yes
    140     DEFAULT_GCC_VERSION=$(get_default_gcc_version_for_arch $ARCH)
    141     NEW_TOOLCHAIN_NAME=${TOOLCHAIN_NAME%-clang}-${DEFAULT_GCC_VERSION}
    142     TOOLCHAIN_NAME=$NEW_TOOLCHAIN_NAME
    143 fi
    144 
    145 # Check PLATFORM
    146 if [ -z "$PLATFORM" ] ; then
    147     case $ARCH in
    148         arm) PLATFORM=android-3
    149             ;;
    150         x86|mips)
    151             PLATFORM=android-9
    152             ;;
    153         arm64|x86_64|mips64)
    154             PLATFORM=android-$FIRST_API64_LEVEL
    155             ;;
    156         *)
    157             dump "ERROR: Unsupported NDK architecture $ARCH!"
    158     esac
    159     echo "Auto-config: --platform=$PLATFORM"
    160 fi
    161 
    162 if [ ! -d "$NDK_DIR/platforms/$PLATFORM" ] ; then
    163     echo "Invalid platform name: $PLATFORM"
    164     echo "Please use --platform=<name> with one of:" `(cd "$NDK_DIR/platforms" && ls)`
    165     exit 1
    166 fi
    167 
    168 if [ -d "$NDK_DIR/prebuilt/$HOST_TAG" ]; then
    169     SYSTEM=$HOST_TAG
    170 else
    171     SYSTEM=$HOST_TAG32
    172 fi
    173 
    174 # Check toolchain name
    175 TOOLCHAIN_PATH="$NDK_DIR/toolchains/$TOOLCHAIN_NAME/prebuilt/$SYSTEM"
    176 if [ ! -d "$TOOLCHAIN_PATH" ] ; then
    177     echo "Could not find toolchain: $TOOLCHAIN_PATH"
    178     echo "Please use --toolchain=<name> with the name of a toolchain supported by the source NDK."
    179     echo "Try one of: " `(cd "$NDK_DIR/toolchains" && ls)`
    180     exit 1
    181 fi
    182 
    183 # Extract architecture from platform name
    184 parse_toolchain_name $TOOLCHAIN_NAME
    185 
    186 case "$TOOLCHAIN_NAME" in
    187   *4.9l)
    188     GCC_VERSION=4.9l
    189     ;;
    190   *4.8l)
    191     GCC_VERSION=4.8l
    192     ;;
    193 esac
    194 
    195 # Check that there are any platform files for it!
    196 (cd $NDK_DIR/platforms && ls -d */arch-$ARCH >/dev/null 2>&1 )
    197 if [ $? != 0 ] ; then
    198     echo "Platform $PLATFORM doesn't have any files for this architecture: $ARCH"
    199     echo "Either use --platform=<name> or --toolchain=<name> to select a different"
    200     echo "platform or arch-dependent toolchain name (respectively)!"
    201     exit 1
    202 fi
    203 
    204 # Compute source sysroot
    205 SRC_SYSROOT_INC="$NDK_DIR/platforms/$PLATFORM/arch-$ARCH/usr/include"
    206 SRC_SYSROOT_LIB="$NDK_DIR/platforms/$PLATFORM/arch-$ARCH/usr/lib"
    207 if [ ! -d "$SRC_SYSROOT_INC" -o ! -d "$SRC_SYSROOT_LIB" ] ; then
    208     echo "No platform files ($PLATFORM) for this architecture: $ARCH"
    209     exit 1
    210 fi
    211 
    212 # Check that we have any prebuilts GCC toolchain here
    213 if [ ! -d "$TOOLCHAIN_PATH" ]; then
    214     echo "Toolchain is missing prebuilt files: $TOOLCHAIN_NAME"
    215     echo "You must point to a valid NDK release package!"
    216     exit 1
    217 fi
    218 
    219 TOOLCHAIN_PATH="$TOOLCHAIN_PATH"
    220 TOOLCHAIN_GCC=$TOOLCHAIN_PATH/bin/$ABI_CONFIGURE_TARGET-gcc
    221 
    222 if [ ! -f "$TOOLCHAIN_GCC" ] ; then
    223     echo "Toolchain $TOOLCHAIN_GCC is missing!"
    224     exit 1
    225 fi
    226 
    227 if [ "$USE_LLVM" = "yes" ]; then
    228     LLVM_TOOLCHAIN_PATH="$NDK_DIR/toolchains/llvm/prebuilt/$SYSTEM"
    229     # Check that we have any prebuilts LLVM toolchain here
    230     if [ ! -d "$LLVM_TOOLCHAIN_PATH" ] ; then
    231         echo "LLVM Toolchain is missing prebuilt files"
    232         echo "You must point to a valid NDK release package!"
    233         exit 1
    234     fi
    235     LLVM_TOOLCHAIN_PATH="$LLVM_TOOLCHAIN_PATH"
    236 fi
    237 
    238 # Get GCC_BASE_VERSION.  Note that GCC_BASE_VERSION may be slightly different from GCC_VERSION.
    239 # eg. In gcc4.9 GCC_BASE_VERSION is "4.9.x-google"
    240 LIBGCC_PATH=`$TOOLCHAIN_GCC -print-libgcc-file-name`
    241 LIBGCC_BASE_PATH=${LIBGCC_PATH%/*}         # base path of libgcc.a
    242 GCC_BASE_VERSION=${LIBGCC_BASE_PATH##*/}   # stuff after the last /
    243 
    244 # Create temporary directory
    245 TMPDIR=$NDK_TMPDIR/standalone/$TOOLCHAIN_NAME
    246 
    247 dump "Copying prebuilt binaries..."
    248 # Now copy the GCC toolchain prebuilt binaries
    249 copy_directory "$TOOLCHAIN_PATH" "$TMPDIR"
    250 
    251 # Copy python-related to for gdb.exe
    252 PYTHON=python
    253 PYTHON_x=python$(echo "$DEFAULT_PYTHON_VERSION" | cut -d . -f 1)
    254 PYTHON_xdotx=python$(echo "$DEFAULT_PYTHON_VERSION" | cut -d . -f 1-2)
    255 copy_directory "$NDK_DIR/prebuilt/$SYSTEM/include/$PYTHON_xdotx" "$TMPDIR/include/$PYTHON_xdotx"
    256 copy_directory "$NDK_DIR/prebuilt/$SYSTEM/lib/$PYTHON_xdotx" "$TMPDIR/lib/$PYTHON_xdotx"
    257 copy_file_list "$NDK_DIR/prebuilt/$SYSTEM/bin" "$TMPDIR/bin" "$PYTHON$HOST_EXE" "$PYTHON_x$HOST_EXE" "$PYTHON_xdotx$HOST_EXE"
    258 if [ "$HOST_TAG32" = "windows" ]; then
    259   copy_file_list "$NDK_DIR/prebuilt/$SYSTEM/bin" "$TMPDIR/bin" lib$PYTHON_xdotx.dll
    260 fi
    261 
    262 # Copy yasm for x86
    263 if [ "$ARCH" = "x86" ]; then
    264   copy_file_list "$NDK_DIR/prebuilt/$SYSTEM/bin" "$TMPDIR/bin" "yasm$HOST_EXE"
    265 fi
    266 
    267 # Clang stuff
    268 
    269 if [ "$USE_LLVM" = "yes" ]; then
    270   # Copy the clang/llvm toolchain prebuilt binaries
    271   copy_directory "$LLVM_TOOLCHAIN_PATH" "$TMPDIR"
    272 
    273   # Move clang and clang++ to clang${LLVM_VERSION} and clang${LLVM_VERSION}++,
    274   # then create scripts linking them with predefined -target flag.  This is to
    275   # make clang/++ easier drop-in replacement for gcc/++ in NDK standalone mode.
    276   # Note that the file name of "clang" isn't important, and the trailing
    277   # "++" tells clang to compile in C++ mode
    278   LLVM_TARGET=
    279   case "$ARCH" in
    280       arm)
    281           # Note: -target may change by clang based on the presence of
    282           # subsequent -march=armv5te and/or -mthumb.
    283           LLVM_TARGET=armv7a-none-linux-androideabi
    284           TOOLCHAIN_PREFIX=$DEFAULT_ARCH_TOOLCHAIN_PREFIX_arm
    285           ;;
    286       x86)
    287           LLVM_TARGET=i686-none-linux-android
    288           TOOLCHAIN_PREFIX=$DEFAULT_ARCH_TOOLCHAIN_PREFIX_x86
    289           ;;
    290       mips)
    291           LLVM_TARGET=mipsel-none-linux-android
    292           TOOLCHAIN_PREFIX=$DEFAULT_ARCH_TOOLCHAIN_PREFIX_mips
    293           ;;
    294       arm64)
    295           LLVM_TARGET=aarch64-none-linux-android
    296           TOOLCHAIN_PREFIX=$DEFAULT_ARCH_TOOLCHAIN_PREFIX_arm64
    297           ;;
    298       x86_64)
    299           LLVM_TARGET=x86_64-none-linux-android
    300           TOOLCHAIN_PREFIX=$DEFAULT_ARCH_TOOLCHAIN_PREFIX_x86_64
    301           ;;
    302       mips64)
    303           LLVM_TARGET=mips64el-none-linux-android
    304           TOOLCHAIN_PREFIX=$DEFAULT_ARCH_TOOLCHAIN_PREFIX_mips64
    305           ;;
    306       *)
    307         dump "ERROR: Unsupported NDK architecture $ARCH!"
    308   esac
    309 
    310   # We need to copy clang and clang++ to some other named binary because clang
    311   # and clang++ are going to be the shell scripts with the prefilled target. We
    312   # have the version info available, and that's a typical alternate name (and is
    313   # what we historically used).
    314   LLVM_VERSION=$(cat $LLVM_TOOLCHAIN_PATH/AndroidVersion.txt | \
    315       egrep -o '[[:digit:]]+\.[[:digit:]]')
    316 
    317   # Need to remove '.' from LLVM_VERSION when constructing new clang name,
    318   # otherwise clang3.3++ may still compile *.c code as C, not C++, which
    319   # is not consistent with g++
    320   LLVM_VERSION_WITHOUT_DOT=$(echo "$LLVM_VERSION" | sed -e "s!\.!!")
    321   mv "$TMPDIR/bin/clang${HOST_EXE}" "$TMPDIR/bin/clang${LLVM_VERSION_WITHOUT_DOT}${HOST_EXE}"
    322   if [ -h "$TMPDIR/bin/clang++${HOST_EXE}" ] ; then
    323     ## clang++ is a link to clang.  Remove it and reconstruct
    324     rm "$TMPDIR/bin/clang++${HOST_EXE}"
    325     ln -sf "clang${LLVM_VERSION_WITHOUT_DOT}${HOST_EXE}" "$TMPDIR/bin/clang${LLVM_VERSION_WITHOUT_DOT}++${HOST_EXE}"
    326   else
    327     mv "$TMPDIR/bin/clang++${HOST_EXE}" "$TMPDIR/bin/clang$LLVM_VERSION_WITHOUT_DOT++${HOST_EXE}"
    328   fi
    329 
    330   TARGET_FLAG="-target $LLVM_TARGET"
    331   CLANG_FLAGS="$TARGET_FLAG --sysroot \`dirname \$0\`/../sysroot"
    332 
    333   cat > "$TMPDIR/bin/clang" <<EOF
    334 #!/bin/bash
    335 if [ "\$1" != "-cc1" ]; then
    336     \`dirname \$0\`/clang$LLVM_VERSION_WITHOUT_DOT $CLANG_FLAGS "\$@"
    337 else
    338     # target/triple already spelled out.
    339     \`dirname \$0\`/clang$LLVM_VERSION_WITHOUT_DOT "\$@"
    340 fi
    341 EOF
    342   cat > "$TMPDIR/bin/clang++" <<EOF
    343 #!/bin/bash
    344 if [ "\$1" != "-cc1" ]; then
    345     \`dirname \$0\`/clang$LLVM_VERSION_WITHOUT_DOT++ $CLANG_FLAGS "\$@"
    346 else
    347     # target/triple already spelled out.
    348     \`dirname \$0\`/clang$LLVM_VERSION_WITHOUT_DOT++ "\$@"
    349 fi
    350 EOF
    351   chmod 0755 "$TMPDIR/bin/clang" "$TMPDIR/bin/clang++"
    352   cp -a "$TMPDIR/bin/clang" "$TMPDIR/bin/$TOOLCHAIN_PREFIX-clang"
    353   cp -a "$TMPDIR/bin/clang++" "$TMPDIR/bin/$TOOLCHAIN_PREFIX-clang++"
    354 
    355   if [ -n "$HOST_EXE" ] ; then
    356     CLANG_FLAGS="$TARGET_FLAG --sysroot %~dp0\\..\\sysroot"
    357     cat > "$TMPDIR/bin/clang.cmd" <<EOF
    358 @echo off
    359 if "%1" == "-cc1" goto :L
    360 %~dp0\\clang${LLVM_VERSION_WITHOUT_DOT}${HOST_EXE} $CLANG_FLAGS %*
    361 if ERRORLEVEL 1 exit /b 1
    362 goto :done
    363 :L
    364 rem target/triple already spelled out.
    365 %~dp0\\clang${LLVM_VERSION_WITHOUT_DOT}${HOST_EXE} %*
    366 if ERRORLEVEL 1 exit /b 1
    367 :done
    368 EOF
    369     cat > "$TMPDIR/bin/clang++.cmd" <<EOF
    370 @echo off
    371 if "%1" == "-cc1" goto :L
    372 %~dp0\\clang${LLVM_VERSION_WITHOUT_DOT}++${HOST_EXE} $CLANG_FLAGS %*
    373 if ERRORLEVEL 1 exit /b 1
    374 goto :done
    375 :L
    376 rem target/triple already spelled out.
    377 %~dp0\\clang${LLVM_VERSION_WITHOUT_DOT}++${HOST_EXE} %*
    378 if ERRORLEVEL 1 exit /b 1
    379 :done
    380 EOF
    381     chmod 0755 "$TMPDIR/bin/clang.cmd" "$TMPDIR/bin/clang++.cmd"
    382     cp -a "$TMPDIR/bin/clang.cmd" "$TMPDIR/bin/$TOOLCHAIN_PREFIX-clang.cmd"
    383     cp -a "$TMPDIR/bin/clang++.cmd" "$TMPDIR/bin/$TOOLCHAIN_PREFIX-clang++.cmd"
    384   fi
    385 fi
    386 
    387 dump "Copying sysroot headers and libraries..."
    388 # Copy the sysroot under $TMPDIR/sysroot. The toolchain was built to
    389 # expect the sysroot files to be placed there!
    390 copy_directory_nolinks "$SRC_SYSROOT_INC" "$TMPDIR/sysroot/usr/include"
    391 copy_directory_nolinks "$SRC_SYSROOT_LIB" "$TMPDIR/sysroot/usr/lib"
    392 case "$ARCH" in
    393 # x86_64 and mips* toolchain are built multilib.
    394     x86_64)
    395         copy_directory_nolinks "$SRC_SYSROOT_LIB/../lib64" "$TMPDIR/sysroot/usr/lib64"
    396         copy_directory_nolinks "$SRC_SYSROOT_LIB/../libx32" "$TMPDIR/sysroot/usr/libx32"
    397         ;;
    398     mips64)
    399         copy_directory_nolinks "$SRC_SYSROOT_LIB/../libr2" "$TMPDIR/sysroot/usr/libr2"
    400         copy_directory_nolinks "$SRC_SYSROOT_LIB/../libr6" "$TMPDIR/sysroot/usr/libr6"
    401         copy_directory_nolinks "$SRC_SYSROOT_LIB/../lib64" "$TMPDIR/sysroot/usr/lib64"
    402         copy_directory_nolinks "$SRC_SYSROOT_LIB/../lib64r2" "$TMPDIR/sysroot/usr/lib64r2"
    403         ;;
    404     mips)
    405         copy_directory_nolinks "$SRC_SYSROOT_LIB/../libr2" "$TMPDIR/sysroot/usr/libr2"
    406         copy_directory_nolinks "$SRC_SYSROOT_LIB/../libr6" "$TMPDIR/sysroot/usr/libr6"
    407         ;;
    408 esac
    409 
    410 GNUSTL_DIR=$NDK_DIR/$GNUSTL_SUBDIR/4.9
    411 GNUSTL_LIBS=$GNUSTL_DIR/libs
    412 
    413 STLPORT_DIR=$NDK_DIR/$STLPORT_SUBDIR
    414 STLPORT_LIBS=$STLPORT_DIR/libs
    415 
    416 LIBCXX_DIR=$NDK_DIR/$LIBCXX_SUBDIR
    417 LIBCXX_LIBS=$LIBCXX_DIR/libs
    418 LIBCXX_SUPPORT_LIB=libc++abi
    419 
    420 SUPPORT_DIR=$NDK_DIR/$SUPPORT_SUBDIR
    421 
    422 COMPILER_RT_DIR=$NDK_DIR/$COMPILER_RT_SUBDIR
    423 COMPILER_RT_LIBS=$COMPILER_RT_DIR/libs
    424 
    425 if [ "$STL" = "libcxx" -o "$STL" = "libc++" ]; then
    426     dump "Copying c++ runtime headers and libraries (with $LIBCXX_SUPPORT_LIB)..."
    427 else
    428     dump "Copying c++ runtime headers and libraries..."
    429 fi
    430 
    431 ABI_STL="$TMPDIR/$ABI_CONFIGURE_TARGET"
    432 ABI_STL_INCLUDE="$TMPDIR/include/c++/$GCC_BASE_VERSION"
    433 ABI_STL_INCLUDE_TARGET="$ABI_STL_INCLUDE/$ABI_CONFIGURE_TARGET"
    434 
    435 # $1: filenames of headers
    436 copy_abi_headers () {
    437   local ABI_NAME=$1
    438   shift
    439 
    440   for header in $@; do
    441     (set -e; cd $ABI_STL_INCLUDE && cp -a ../../$ABI_NAME/include/$header $header) || exit 1
    442   done
    443 }
    444 
    445 # Copy common STL headers (i.e. the non-arch-specific ones)
    446 copy_stl_common_headers () {
    447     case $STL in
    448         gnustl)
    449             copy_directory "$GNUSTL_DIR/include" "$ABI_STL_INCLUDE"
    450             ;;
    451         libcxx|libc++)
    452             copy_directory "$LIBCXX_DIR/libcxx/include" "$ABI_STL_INCLUDE"
    453             copy_directory "$SUPPORT_DIR/include" "$ABI_STL_INCLUDE"
    454             if [ "$LIBCXX_SUPPORT_LIB" = "gabi++" ]; then
    455                 copy_directory "$STLPORT_DIR/../gabi++/include" "$ABI_STL_INCLUDE/../../gabi++/include"
    456                 copy_abi_headers gabi++ cxxabi.h unwind.h unwind-arm.h unwind-itanium.h gabixx_config.h
    457             elif [ "$LIBCXX_SUPPORT_LIB" = "libc++abi" ]; then
    458                 copy_directory "$LIBCXX_DIR/../llvm-libc++abi/libcxxabi/include" "$ABI_STL_INCLUDE/../../llvm-libc++abi/include"
    459                 copy_abi_headers llvm-libc++abi cxxabi.h libunwind.h unwind.h
    460             else
    461                 dump "ERROR: Unknown libc++ support lib: $LIBCXX_SUPPORT_LIB"
    462                 exit 1
    463             fi
    464             ;;
    465         stlport)
    466             copy_directory "$STLPORT_DIR/stlport" "$ABI_STL_INCLUDE"
    467             copy_directory "$STLPORT_DIR/../gabi++/include" "$ABI_STL_INCLUDE/../../gabi++/include"
    468             copy_abi_headers gabi++ cxxabi.h unwind.h unwind-arm.h unwind-itanium.h gabixx_config.h
    469             ;;
    470     esac
    471 }
    472 
    473 # $1: Source ABI (e.g. 'armeabi')
    474 # #2  Optional destination path of additional header to copy (eg. include/bits), default to empty
    475 # $3: Optional source path of additional additional header to copy, default to empty
    476 # $4: Optional destination directory, default to empty (e.g. "", "thumb", "armv7-a/thumb")
    477 # $5: Optional source directory, default to empty (e.g. "", "thumb", "armv7-a/thumb")
    478 copy_stl_libs () {
    479     local ABI=$1
    480     local HEADER_DST=$2
    481     local HEADER_SRC=$3
    482     local DEST_DIR=$4
    483     local SRC_DIR=$5
    484     local ABI_SRC_DIR=$ABI
    485 
    486     if [ -n "$SRC_DIR" ]; then
    487         ABI_SRC_DIR=$ABI/$SRC_DIR
    488     else
    489         if [ "$DEST_DIR" != "${DEST_DIR%%/*}" ] ; then
    490             ABI_SRC_DIR=$ABI/`basename $DEST_DIR`
    491         fi
    492     fi
    493 
    494     case $STL in
    495         gnustl)
    496             if [ "$HEADER_SRC" != "" ]; then
    497                 copy_directory "$GNUSTL_LIBS/$ABI/include/$HEADER_SRC" "$ABI_STL_INCLUDE_TARGET/$HEADER_DST"
    498             fi
    499             copy_file_list "$GNUSTL_LIBS/$ABI_SRC_DIR" "$ABI_STL/lib/$DEST_DIR" "libgnustl_shared.so"
    500             copy_file_list "$GNUSTL_LIBS/$ABI_SRC_DIR" "$ABI_STL/lib/$DEST_DIR" "libsupc++.a"
    501             cp -p "$GNUSTL_LIBS/$ABI_SRC_DIR/libgnustl_static.a" "$ABI_STL/lib/$DEST_DIR/libstdc++.a"
    502             ;;
    503         libcxx|libc++)
    504             copy_file_list "$LIBCXX_LIBS/$ABI_SRC_DIR" "$ABI_STL/lib/$DEST_DIR" "libc++_shared.so"
    505             cp -p "$LIBCXX_LIBS/$ABI_SRC_DIR/libc++_static.a" "$ABI_STL/lib/$DEST_DIR/libstdc++.a"
    506             ;;
    507         stlport)
    508             copy_file_list "$STLPORT_LIBS/$ABI_SRC_DIR" "$ABI_STL/lib/$DEST_DIR" "libstlport_shared.so"
    509             cp -p "$STLPORT_LIBS/$ABI_SRC_DIR/libstlport_static.a" "$ABI_STL/lib/$DEST_DIR/libstdc++.a"
    510             ;;
    511         *)
    512             dump "ERROR: Unsupported STL: $STL"
    513             exit 1
    514             ;;
    515     esac
    516 }
    517 
    518 # $1: Source ABI (e.g. 'armeabi')
    519 copy_stl_libs_for_abi () {
    520     local ABI=$1
    521 
    522     if [ "$(convert_abi_to_arch "$ABI")" != "$ARCH" ]; then
    523         dump "ERROR: ABI '$ABI' does not match ARCH '$ARCH'"
    524         exit 1
    525     fi
    526 
    527     case $ABI in
    528         armeabi)
    529             copy_stl_libs armeabi          "bits"                "bits"
    530             copy_stl_libs armeabi          "thumb/bits"          "bits"       "/thumb"
    531             ;;
    532         armeabi-v7a)
    533             copy_stl_libs armeabi-v7a      "armv7-a/bits"        "bits"       "armv7-a"
    534             copy_stl_libs armeabi-v7a      "armv7-a/thumb/bits"  "bits"       "armv7-a/thumb"
    535             ;;
    536         armeabi-v7a-hard)
    537             copy_stl_libs armeabi-v7a-hard ""                    ""           "armv7-a/hard"       "."
    538             copy_stl_libs armeabi-v7a-hard ""                    ""           "armv7-a/thumb/hard" "thumb"
    539             ;;
    540         x86_64)
    541             if [ "$STL" = "gnustl" ]; then
    542                 copy_stl_libs x86_64       "32/bits"             "32/bits"    ""                   "lib"
    543                 copy_stl_libs x86_64       "bits"                "bits"       "../lib64"           "lib64"
    544                 copy_stl_libs x86_64       "x32/bits"            "x32/bits"   "../libx32"          "libx32"
    545             else
    546                 copy_stl_libs x86_64       ""                    ""           "../lib64"           "."
    547             fi
    548             ;;
    549         mips64)
    550             if [ "$STL" = "gnustl" ]; then
    551                 copy_stl_libs mips64       "32/mips-r1/bits"     "32/mips-r1/bits"  ""             "lib"
    552                 copy_stl_libs mips64       "32/mips-r2/bits"     "32/mips-r2/bits"  "../libr2"     "libr2"
    553                 copy_stl_libs mips64       "32/mips-r6/bits"     "32/mips-r6/bits"  "../libr6"     "libr6"
    554                 copy_stl_libs mips64       "bits"                "bits"             "../lib64"     "lib64"
    555             else
    556                 copy_stl_libs mips64       ""                    ""                 "../lib64"     "."
    557             fi
    558             ;;
    559         mips|mips32r6)
    560             if [ "$STL" = "gnustl" ]; then
    561                 copy_stl_libs mips         "bits"                "bits"             "../lib"       "lib"
    562                 copy_stl_libs mips         "mips-r2/bits"        "mips-r2/bits"     "../libr2"     "libr2"
    563                 copy_stl_libs mips         "mips-r6/bits"        "mips-r6/bits"     "../libr6"     "libr6"
    564             else
    565                 copy_stl_libs mips         "bits"                "bits"
    566             fi
    567             ;;
    568         *)
    569             copy_stl_libs "$ABI"           "bits"                "bits"
    570             ;;
    571     esac
    572 }
    573 
    574 mkdir -p "$ABI_STL_INCLUDE_TARGET"
    575 fail_panic "Can't create directory: $ABI_STL_INCLUDE_TARGET"
    576 copy_stl_common_headers
    577 for ABI in $(echo "$ABIS" | tr ',' ' '); do
    578   copy_stl_libs_for_abi "$ABI"
    579 done
    580 
    581 # Install or Package
    582 if [ -n "$INSTALL_DIR" ] ; then
    583     dump "Copying files to: $INSTALL_DIR"
    584     if [ ! -d "$INSTALL_DIR" ]; then
    585         move_directory "$TMPDIR" "$INSTALL_DIR"
    586     else
    587         copy_directory "$TMPDIR" "$INSTALL_DIR"
    588     fi
    589 else
    590     PACKAGE_FILE="$PACKAGE_DIR/$TOOLCHAIN_NAME.tar.bz2"
    591     dump "Creating package file: $PACKAGE_FILE"
    592     pack_archive "$PACKAGE_FILE" "`dirname $TMPDIR`" "$TOOLCHAIN_NAME"
    593     fail_panic "Could not create tarball from $TMPDIR"
    594 fi
    595 dump "Cleaning up..."
    596 rm -rf $TMPDIR
    597 
    598 dump "Done."
    599