1#!/bin/sh 2# 3# Copyright (C) 2011 The Android Open Source Project 4# 5# Licensed under the Apache License, Version 2.0 (the "License"); 6# you may not use this file except in compliance with the License. 7# You may obtain a copy of the License at 8# 9# http://www.apache.org/licenses/LICENSE-2.0 10# 11# Unless required by applicable law or agreed to in writing, software 12# distributed under the License is distributed on an "AS IS" BASIS, 13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14# See the License for the specific language governing permissions and 15# limitations under the License. 16# 17# dev-platform-expand.sh 18# 19# This tool is used to expand the content of development/ndk/platforms 20# into a _single_ directory containing all headers / libraries corresponding 21# to a given API level and architecture. 22# 23# The idea is that the content of $SRC/android-N/ only contains stuff 24# that is relevant to API level N, and not contain anything that is already 25# provided by API level N-1, N-2, etc.. 26# 27# More precisely, for each architecture A: 28# $SRC/android-N/include --> $DST/android-N/arch-A/usr/include 29# $SRC/android-N/arch-A/include --> $DST/android-N/arch-A/usr/include 30# $SRC/android-N/arch-A/lib --> $DST/android-N/arch-A/usr/lib 31# 32# If we target level $API, we're going to copy the contents of android-3 to 33# android-$API to the destination directory. 34# 35 36. `dirname $0`/prebuilt-common.sh 37 38# Return the list of platform supported from $1/platforms 39# as a single space-separated list of levels. (e.g. "3 4 5 8 9") 40# $1: source directory 41extract_platforms_from () 42{ 43 local RET 44 if [ -d "$1" ] ; then 45 RET=$((cd "$1/platforms" && ls -d android-*) | sed -e "s!android-!!" | sort -g) 46 else 47 RET="" 48 fi 49 RET=$(echo $RET) # converts newlines to spaces 50 echo $RET 51} 52 53# The default platform is the last entry in the API_LEVELS default variable 54PLATFORM=android-$(echo $API_LEVELS | tr ' ' '\n' | tail -1) 55register_var_option "--platform=<level>" PLATFORM "Target API level" 56 57# We take by default stuff from $NDK/../development/ndk 58SRCDIR="$(cd $ANDROID_NDK_ROOT/../development/ndk/platforms && pwd)" 59register_var_option "--src-dir=<path>" SRCDIR "Source for compressed platforms" 60 61# The default destination directory is a temporary one 62DSTDIR=/tmp/ndk-$USER/platforms 63register_var_option "--dst-dir=<path>" DSTDIR "Destination directory" 64 65# Default architecture, note we can have several ones here 66ARCHS=$(find_ndk_unknown_archs) 67ARCHS="$DEFAULT_ARCHS $ARCHS" 68register_var_option "--arch=<name>" ARCHS "List of target architectures" 69 70PROGRAM_PARAMETERS="" 71 72PROGRAM_DESCRIPTION=\ 73"Uncompress the platform files (headers/libraries) correspond to a given 74platform into a single directory. The main idea is that the files are stored 75in a platform-specific way under SRC=$$NDK/../development/ndk, i.e.: 76 77 \$SRC/platforms/android-3/ -> all files corresponding to API level 3 78 \$SRC/platforms/android-4/ -> only new/modified files corresponding to API level 4 79 \$SRC/platforms/android-5/ -> only new/modified files corresponding to API level 5 80 ... 81 82As an example, expanding android-5 would mean: 83 84 1 - copy all files from android-3 to \$DST directory 85 86 2 - copy all files from android-4 to \$DST, eventually overwriting stuff 87 from android-3 that was modified in API level 4 88 89 3 - copy all files from android-5 to \$DST, eventually overwriting stuff 90 from android-4 that was modified in API level 5 91 92The script 'dev-platform-compress.sh' can be used to perform the opposite 93operation, and knows which files are part of which API level. 94" 95 96extract_parameters "$@" 97 98# Check source directory 99if [ ! -d "$SRCDIR" ] ; then 100 echo "ERROR: Source directory doesn't exist: $SRCDIR" 101 exit 1 102fi 103if [ ! -d "$SRCDIR/android-3" ]; then 104 echo "ERROR: Source directory doesn't seem to be valid: $SRCDIR" 105 exit 1 106fi 107log "Using source directory: $SRCDIR" 108 109# Check platform (normalize it, i.e. android-9 -> 9} 110PLATFORM=${PLATFORM##android-} 111if [ ! -d "$SRCDIR/android-$PLATFORM" ]; then 112 echo "ERROR: Platform directory doesn't exist: $SRCDIR/android-$PLATFORM" 113 exit 1 114fi 115log "Using platform: $PLATFORM" 116 117if [ ! -d "$DSTDIR" ]; then 118 mkdir -p "$DSTDIR" 119 if [ $? != 0 ]; then 120 echo "ERROR: Could not create destination directory: $DSTDIR" 121 exit 1 122 fi 123fi 124log "Using destination directory: $DSTDIR" 125 126# Handle architecture list 127# 128# We support both --arch and --abi for backwards compatibility reasons 129# --arch is the new hotness, --abi is deprecated. 130# 131if [ -n "$OPTION_ARCH" ]; then 132 OPTION_ARCH=$(commas_to_spaces $OPTION_ARCH) 133fi 134 135if [ -n "$OPTION_ABI" ] ; then 136 echo "WARNING: --abi=<names> is deprecated. Use --arch=<names> instead!" 137 OPTION_ABI=$(commas_to_spaces $OPTION_ABI) 138 if [ -n "$OPTION_ARCH" -a "$OPTION_ARCH" != "$OPTION_ABI" ]; then 139 echo "ERROR: You can't use both --abi and --arch with different values!" 140 exit 1 141 fi 142 OPTION_ARCH=$OPTION_ABI 143fi 144 145ARCHS=$(commas_to_spaces $ARCHS) 146log "Using architectures: $(commas_to_spaces $ARCHS)" 147 148# log "Checking source platform architectures." 149# BAD_ARCHS= 150# for ARCH in $ARCHS; do 151# eval CHECK_$ARCH=no 152# done 153# for ARCH in $ARCHS; do 154# DIR="$SRCDIR/android-$PLATFORM/arch-$ARCH" 155# if [ -d $DIR ] ; then 156# log " $DIR" 157# eval CHECK_$ARCH=yes 158# fi 159# done 160# 161# BAD_ARCHS= 162# for ARCH in $ARCHS; do 163# CHECK=`var_value CHECK_$ARCH` 164# log " $ARCH check: $CHECK" 165# if [ "$CHECK" = no ] ; then 166# if [ -z "$BAD_ARCHS" ] ; then 167# BAD_ARCHS=$ARCH 168# else 169# BAD_ARCHS="$BAD_ARCHS $ARCH" 170# fi 171# fi 172# done 173# 174# if [ -n "$BAD_ARCHS" ] ; then 175# echo "ERROR: Source directory doesn't support these ARCHs: $BAD_ARCHS" 176# exit 3 177# fi 178 179copy_optional_directory () 180{ 181 if [ -d "$1" ]; then 182 copy_directory "$1" "$2" 183 fi 184} 185 186# Copy platform sysroot and samples into your destination 187# 188 189# $SRC/android-$PLATFORM/include --> $DST/platforms/android-$PLATFORM/arch-$ARCH/usr/include 190# $SRC/android-$PLATFORM/arch-$ARCH/include --> $DST/platforms/android-$PLATFORM/arch-$ARCH/usr/include 191# for compatibility: 192# $SRC/android-$PLATFORM/arch-$ARCH/usr/include --> $DST/platforms/android-$PLATFORM/arch-$ARCH/usr/include 193 194 195 196# $SRC/android-$PLATFORM/arch-$ARCH/usr --> $DST/platforms/android-$PLATFORM/arch-$ARCH/usr 197# $SRC/android-$PLATFORM/samples --> $DST/samples 198# 199for LEVEL in $API_LEVELS; do 200 if [ "$LEVEL" -gt "$PLATFORM" ]; then 201 break 202 fi 203 log "Copying android-$LEVEL platform files" 204 for ARCH in $ARCHS; do 205 SDIR="$SRCDIR/android-$LEVEL" 206 DDIR="$DSTDIR/android-$PLATFORM" 207 if [ -d "$SDIR" ]; then 208 copy_directory "$SDIR/include" "$DDIR/include" 209 fi 210 ARCH_SDIR="$SDIR/arch-$ARCH" 211 ARCH_DDIR="$DDIR/arch-$ARCH" 212 if [ -d "$ARCH_SDIR" ]; then 213 copy_optional_directory "$ARCH_SDIR/include" "$ARCH_DDIR/include" 214 copy_optional_directory "$ARCH_SDIR/lib" "$ARCH_DDIR/lib" 215 rm -f "$ARCH_DDIR"/lib/*.so 216 copy_optional_directory "$ARCH_SDIR/symbols" "$ARCH_DDIR/symbols" 217 rm -f "$ARCH_DDIR"/symbols/*.so.txt 218 fi 219 done 220done 221 222log "Done !" 223exit 0 224