| #!/bin/sh |
| # |
| # Copyright (C) 2011 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. |
| # |
| # dev-platform-expand.sh |
| # |
| # This tool is used to expand the content of development/ndk/platforms |
| # into a _single_ directory containing all headers / libraries corresponding |
| # to a given API level and architecture. |
| # |
| # The idea is that the content of $SRC/android-N/ only contains stuff |
| # that is relevant to API level N, and not contain anything that is already |
| # provided by API level N-1, N-2, etc.. |
| # |
| # More precisely, for each architecture A: |
| # $SRC/android-N/include --> $DST/android-N/arch-A/usr/include |
| # $SRC/android-N/arch-A/include --> $DST/android-N/arch-A/usr/include |
| # $SRC/android-N/arch-A/lib --> $DST/android-N/arch-A/usr/lib |
| # |
| # If we target level $API, we're going to copy the contents of android-3 to |
| # android-$API to the destination directory. |
| # |
| |
| . `dirname $0`/prebuilt-common.sh |
| |
| # Return the list of platform supported from $1/platforms |
| # as a single space-separated list of levels. (e.g. "3 4 5 8 9") |
| # $1: source directory |
| extract_platforms_from () |
| { |
| local RET |
| if [ -d "$1" ] ; then |
| RET=$((cd "$1/platforms" && ls -d android-*) | sed -e "s!android-!!" | sort -g) |
| else |
| RET="" |
| fi |
| RET=$(echo $RET) # converts newlines to spaces |
| echo $RET |
| } |
| |
| # The default platform is the last entry in the API_LEVELS default variable |
| PLATFORM=android-$(echo $API_LEVELS | tr ' ' '\n' | tail -1) |
| register_var_option "--platform=<level>" PLATFORM "Target API level" |
| |
| # We take by default stuff from $NDK/../development/ndk |
| SRCDIR="$(cd $ANDROID_NDK_ROOT/../development/ndk/platforms && pwd)" |
| register_var_option "--src-dir=<path>" SRCDIR "Source for compressed platforms" |
| |
| # The default destination directory is a temporary one |
| DSTDIR=/tmp/ndk-$USER/platforms |
| register_var_option "--dst-dir=<path>" DSTDIR "Destination directory" |
| |
| # Default architecture, note we can have several ones here |
| ARCHS="arm,x86,mips" |
| register_var_option "--arch=<name>" ARCHS "List of target architectures" |
| |
| PROGRAM_PARAMETERS="" |
| |
| PROGRAM_DESCRIPTION=\ |
| "Uncompress the platform files (headers/libraries) correspond to a given |
| platform into a single directory. The main idea is that the files are stored |
| in a platform-specific way under SRC=$$NDK/../development/ndk, i.e.: |
| |
| \$SRC/platforms/android-3/ -> all files corresponding to API level 3 |
| \$SRC/platforms/android-4/ -> only new/modified files corresponding to API level 4 |
| \$SRC/platforms/android-5/ -> only new/modified files corresponding to API level 5 |
| ... |
| |
| As an example, expanding android-5 would mean: |
| |
| 1 - copy all files from android-3 to \$DST directory |
| |
| 2 - copy all files from android-4 to \$DST, eventually overwriting stuff |
| from android-3 that was modified in API level 4 |
| |
| 3 - copy all files from android-5 to \$DST, eventually overwriting stuff |
| from android-4 that was modified in API level 5 |
| |
| The script 'dev-platform-compress.sh' can be used to perform the opposite |
| operation, and knows which files are part of which API level. |
| " |
| |
| extract_parameters "$@" |
| |
| # Check source directory |
| if [ ! -d "$SRCDIR" ] ; then |
| echo "ERROR: Source directory doesn't exist: $SRCDIR" |
| exit 1 |
| fi |
| if [ ! -d "$SRCDIR/android-3" ]; then |
| echo "ERROR: Source directory doesn't seem to be valid: $SRCDIR" |
| exit 1 |
| fi |
| log "Using source directory: $SRCDIR" |
| |
| # Check platform (normalize it, i.e. android-9 -> 9} |
| PLATFORM=${PLATFORM##android-} |
| if [ ! -d "$SRCDIR/android-$PLATFORM" ]; then |
| echo "ERROR: Platform directory doesn't exist: $SRCDIR/android-$PLATFORM" |
| exit 1 |
| fi |
| log "Using platform: $PLATFORM" |
| |
| if [ ! -d "$DSTDIR" ]; then |
| mkdir -p "$DSTDIR" |
| if [ $? != 0 ]; then |
| echo "ERROR: Could not create destination directory: $DSTDIR" |
| exit 1 |
| fi |
| fi |
| log "Using destination directory: $DSTDIR" |
| |
| # Handle architecture list |
| # |
| # We support both --arch and --abi for backwards compatibility reasons |
| # --arch is the new hotness, --abi is deprecated. |
| # |
| if [ -n "$OPTION_ARCH" ]; then |
| OPTION_ARCH=$(commas_to_spaces $OPTION_ARCH) |
| fi |
| |
| if [ -n "$OPTION_ABI" ] ; then |
| echo "WARNING: --abi=<names> is deprecated. Use --arch=<names> instead!" |
| OPTION_ABI=$(commas_to_spaces $OPTION_ABI) |
| if [ -n "$OPTION_ARCH" -a "$OPTION_ARCH" != "$OPTION_ABI" ]; then |
| echo "ERROR: You can't use both --abi and --arch with different values!" |
| exit 1 |
| fi |
| OPTION_ARCH=$OPTION_ABI |
| fi |
| |
| ARCHS=$(commas_to_spaces $ARCHS) |
| log "Using architectures: $(commas_to_spaces $ARCHS)" |
| |
| # log "Checking source platform architectures." |
| # BAD_ARCHS= |
| # for ARCH in $ARCHS; do |
| # eval CHECK_$ARCH=no |
| # done |
| # for ARCH in $ARCHS; do |
| # DIR="$SRCDIR/android-$PLATFORM/arch-$ARCH" |
| # if [ -d $DIR ] ; then |
| # log " $DIR" |
| # eval CHECK_$ARCH=yes |
| # fi |
| # done |
| # |
| # BAD_ARCHS= |
| # for ARCH in $ARCHS; do |
| # CHECK=`var_value CHECK_$ARCH` |
| # log " $ARCH check: $CHECK" |
| # if [ "$CHECK" = no ] ; then |
| # if [ -z "$BAD_ARCHS" ] ; then |
| # BAD_ARCHS=$ARCH |
| # else |
| # BAD_ARCHS="$BAD_ARCHS $ARCH" |
| # fi |
| # fi |
| # done |
| # |
| # if [ -n "$BAD_ARCHS" ] ; then |
| # echo "ERROR: Source directory doesn't support these ARCHs: $BAD_ARCHS" |
| # exit 3 |
| # fi |
| |
| copy_optional_directory () |
| { |
| if [ -d "$1" ]; then |
| copy_directory "$1" "$2" |
| fi |
| } |
| |
| # Copy platform sysroot and samples into your destination |
| # |
| |
| # $SRC/android-$PLATFORM/include --> $DST/platforms/android-$PLATFORM/arch-$ARCH/usr/include |
| # $SRC/android-$PLATFORM/arch-$ARCH/include --> $DST/platforms/android-$PLATFORM/arch-$ARCH/usr/include |
| # for compatibility: |
| # $SRC/android-$PLATFORM/arch-$ARCH/usr/include --> $DST/platforms/android-$PLATFORM/arch-$ARCH/usr/include |
| |
| |
| |
| # $SRC/android-$PLATFORM/arch-$ARCH/usr --> $DST/platforms/android-$PLATFORM/arch-$ARCH/usr |
| # $SRC/android-$PLATFORM/samples --> $DST/samples |
| # |
| for LEVEL in $API_LEVELS; do |
| if [ "$LEVEL" -gt "$PLATFORM" ]; then |
| break |
| fi |
| log "Copying android-$LEVEL platform files" |
| for ARCH in $ARCHS; do |
| SDIR="$SRCDIR/android-$LEVEL" |
| DDIR="$DSTDIR/android-$PLATFORM" |
| if [ -d "$SDIR" ]; then |
| copy_directory "$SDIR/include" "$DDIR/include" |
| fi |
| ARCH_SDIR="$SDIR/arch-$ARCH" |
| ARCH_DDIR="$DDIR/arch-$ARCH" |
| if [ -d "$ARCH_SDIR" ]; then |
| copy_optional_directory "$ARCH_SDIR/include" "$ARCH_DDIR/include" |
| copy_optional_directory "$ARCH_SDIR/lib" "$ARCH_DDIR/lib" |
| rm -f "$ARCH_DDIR"/lib/*.so |
| copy_optional_directory "$ARCH_SDIR/symbols" "$ARCH_DDIR/symbols" |
| rm -f "$ARCH_DDIR"/symbols/*.so.txt |
| fi |
| done |
| done |
| |
| log "Done !" |
| exit 0 |