#!/bin/sh
#
# Copyright (C) 2010 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# This shell script is used to copy the prebuilt GNU libstdc++ binaries
# from a fresh toolchain directory generated with a command like
# "build-gcc.sh --keep-libstdcxx".
#
. `dirname $0`/prebuilt-common.sh
PROGRAM_PARAMETERS="<toolchain-dir> <ndk-dir>"
PROGRAM_DESCRIPTION="\
This program is used to extract fresh GNU libstdc++ binaries from a
toolchain directory that was generated with a command like:
build-gcc.sh --keep-libstdcxx <toolchain-dir> <ndk-dir> <toolchain>
It will copy the files (headers and libraries) under <ndk-dir>/$GNUSTL_SUBDIR
unless you use the --out-dir option.
"
NDK_DIR="$ANDROID_NDK_ROOT"
register_var_option "--ndk-dir=<path>" NDK_DIR "Source NDK installation."
OUT_DIR=
register_var_option "--out-dir=<path>" OUT_DIR "Alternate installation location."
CLEAN_NDK=no
register_var_option "--clean-ndk" CLEAN_NDK "Remove binaries from NDK installation."
TOOLCHAIN=arm-linux-androideabi-4.4.3
register_var_option "--toolchain=<name>" TOOLCHAIN "Specify toolchain name."
REVERSE=no
register_var_option "--reverse" REVERSE "Reverse copy direction."
extract_parameters "$@"
# Set HOST_TAG to linux-x86 on 64-bit Linux systems
force_32bit_binaries
set_parameters ()
{
TOOLCHAIN_DIR="$1"
NDK_DIR="$2"
# Check source directory
#
if [ -z "$TOOLCHAIN_DIR" ] ; then
echo "ERROR: Missing toolchain directory parameter. See --help for details."
exit 1
fi
TOOLCHAIN_DIR2="$TOOLCHAIN_DIR/toolchains/$TOOLCHAIN/prebuilt/$HOST_TAG"
if [ -d "$TOOLCHAIN_DIR2" ] ; then
TOOLCHAIN_DIR="$TOOLCHAIN_DIR2"
log "Auto-detecting toolchain installation: $TOOLCHAIN_DIR"
fi
if [ ! -d "$TOOLCHAIN_DIR/bin" -o ! -d "$TOOLCHAIN_DIR/lib" ] ; then
echo "ERROR: Directory does not point to toolchain: $TOOLCHAIN_DIR"
exit 1
fi
log "Using toolchain directory: $TOOLCHAIN_DIR"
# Check NDK installation directory
#
if [ -z "$NDK_DIR" ] ; then
echo "ERROR: Missing NDK directory parameter. See --help for details."
exit 1
fi
if [ ! -d "$NDK_DIR" ] ; then
echo "ERROR: Not a valid directory: $NDK_DIR"
exit 1
fi
log "Using NDK directory: $NDK_DIR"
}
set_parameters $PARAMETERS
parse_toolchain_name
# Determine output directory
if [ -n "$OUT_DIR" ] ; then
if [ "$REVERSE" = "no" ] ; then
mkdir -p "$OUT_DIR"
fail_panic "Could not create directory: $OUT_DIR"
log "Using specific output directory: $OUT_DIR"
fi
else
OUT_DIR="$NDK_DIR/$GNUSTL_SUBDIR"
log "Using default output directory: $OUT_DIR"
mkdir -p "$OUT_DIR"
fi
if [ ! -d "$OUT_DIR" ] ; then
panic "Directory does not exist: $OUT_DIR"
fi
ABI_STL="$TOOLCHAIN_DIR/$ABI_CONFIGURE_TARGET"
ABI_STL_INCLUDE="$ABI_STL/include/c++/$GCC_VERSION"
OUT_INCLUDE="$OUT_DIR/include"
OUT_INCLUDE_ABI="$OUT_INCLUDE/$ABI_CONFIGURE_TARGET"
OUT_LIBS="$OUT_DIR/libs"
OUT_ABI="$OUT_DIR/$ABI_CONFIGURE_TARGET"
if [ "$REVERSE" = "no" ] ; then
# Check the directories
if [ ! -d "$ABI_STL" ] ; then
panic "ERROR: Missing arch-specific directory: $ABI_STL"
fi
if [ ! -d "$ABI_STL_INCLUDE" ] ; then
panic "ERROR: Missing toolchain-specific include directory: $ABI_STL_INCLUDE"
fi
# First, copy the headers
copy_directory "$ABI_STL_INCLUDE" "$OUT_INCLUDE"
# Copy platform-specific headers from $ABI_STL_INCLUDE/$ABI_CONFIGURE_TARGET
# to relevant locations under $NDK_STL/libs/<arch>/include
case "$ARCH" in
arm)
# We use the thumb version by default.
copy_directory "$OUT_INCLUDE_ABI/thumb/bits" "$OUT_LIBS/armeabi/include/bits"
copy_file_list "$ABI_STL/lib/thumb" "$OUT_LIBS/armeabi" "libstdc++.*"
copy_directory "$OUT_INCLUDE_ABI/armv7-a/bits" "$OUT_LIBS/armeabi-v7a/include/bits"
copy_file_list "$ABI_STL/lib/armv7-a" "$OUT_LIBS/armeabi-v7a" "libstdc++.*"
;;
x86)
copy_directory "$OUT_INCLUDE_ABI/bits" "$OUT_LIBS/x86/include/bits"
copy_file_list "$ABI_STL/lib" "$OUT_LIBS/x86" "libstdc++.*"
;;
*)
dump "ERROR: Unsupported NDK architecture!"
esac
# Remove ABI-specific include headers
run rm -rf "$OUT_INCLUDE_ABI"
# We don't need the versioned libraries anymore (e.g. libstdc++.so.6
# and libstdc++.so.6.0.13)
run rm -f "$OUT_LIBS/"*/libstdc++.so.*
else # REVERSE = yes
copy_directory "$OUT_DIR/include" "$ABI_STL_INCLUDE"
ABI_STL_INCLUDE_TARGET="$ABI_STL_INCLUDE/$ABI_CONFIGURE_TARGET"
mkdir -p "$ABI_STL_INCLUDE_TARGET"
fail_panic "Can't create directory: $ABI_STL_INCLUDE_TARGET"
case "$ARCH" in
arm)
copy_directory "$OUT_LIBS/armeabi/include/bits" "$ABI_STL_INCLUDE_TARGET/bits"
copy_file_list "$OUT_LIBS/armeabi" "$ABI_STL/lib" "libstdc++.*"
copy_directory "$OUT_LIBS/armeabi/include/bits" "$ABI_STL_INCLUDE_TARGET/thumb/bits"
copy_file_list "$OUT_LIBS/armeabi" "$ABI_STL/lib/thumb" "libstdc++.*"
copy_directory "$OUT_LIBS/armeabi-v7a/include/bits" "$ABI_STL_INCLUDE_TARGET/armv7-a/bits"
copy_file_list "$OUT_LIBS/armeabi-v7a" "$ABI_STL/lib/armv7-a" "libstdc++.*"
;;
x86)
copy_directory "$OUT_LIBS/x86/include/bits" "$ABI_STL_INCLUDE_TARGET/bits"
copy_file_list "$OUT_LIBS/x86" "$ABI_STL/lib" "libstdc++.*"
;;
*)
dump "ERROR: Unsupported NDK architecture!"
esac
fi # REVERSE = yes