1 #!/bin/sh 2 # 3 # Copyright (C) 2010 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 # build-platforms.sh 18 # 19 # This tool is used when packaging a new release, or when developing 20 # the NDK itself. It will populate DST ($NDK/platforms by default) 21 # with the content of SRC ($NDK/../development/ndk/platforms/ by default). 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 # For backwards compatibility: 33 # $SRC/android-N/arch-A/usr/include --> $DST/android-N/arch-A/usr/include 34 # $SRC/android-N/arch-A/usr/lib --> $DST/android-N/arch-A/usr/lib 35 # 36 # Repeat after that for N+1, N+2, etc.. 37 # 38 39 . `dirname $0`/prebuilt-common.sh 40 41 # Return the list of platform supported from $1/platforms 42 # as a single space-separated list of levels. (e.g. "3 4 5 8 9") 43 # $1: source directory 44 extract_platforms_from () 45 { 46 if [ -d "$1" ] ; then 47 (cd "$1/platforms" && ls -d android-*) | sed -e "s!android-!!" | sort -g | tr '\n' ' ' 48 else 49 echo "" 50 fi 51 } 52 53 SRCDIR="../development/ndk" 54 DSTDIR="$ANDROID_NDK_ROOT" 55 56 ARCHS="arm" 57 PLATFORMS=`extract_platforms_from "$SRCDIR"` 58 59 OPTION_HELP=no 60 OPTION_PLATFORMS= 61 OPTION_SRCDIR= 62 OPTION_DSTDIR= 63 OPTION_NO_SAMPLES=no 64 OPTION_NO_SYMLINKS=no 65 OPTION_ARCH= 66 OPTION_ABI= 67 68 VERBOSE=no 69 VERBOSE2=no 70 71 for opt do 72 optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'` 73 case "$opt" in 74 --help|-h|-\?) OPTION_HELP=yes 75 ;; 76 --verbose) 77 if [ "$VERBOSE" = "yes" ] ; then 78 VERBOSE2=yes 79 else 80 VERBOSE=yes 81 fi 82 ;; 83 --src-dir=*) 84 OPTION_SRCDIR="$optarg" 85 ;; 86 --dst-dir=*) 87 OPTION_DSTDIR="$optarg" 88 ;; 89 --platform=*) 90 OPTION_PLATFORM=$optarg 91 ;; 92 --arch=*) 93 OPTION_ARCH=$optarg 94 ;; 95 --abi=*) # We still support this for backwards-compatibility 96 OPTION_ABI=$optarg 97 ;; 98 --no-samples) 99 OPTION_NO_SAMPLES=yes 100 ;; 101 --no-symlinks) 102 OPTION_NO_SYMLINKS=yes 103 ;; 104 *) 105 echo "unknown option '$opt', use --help" 106 exit 1 107 esac 108 done 109 110 if [ $OPTION_HELP = "yes" ] ; then 111 echo "Collect files from an Android NDK development tree and assemble" 112 echo "the platform files appropriately into a final release structure." 113 echo "" 114 echo "options:" 115 echo "" 116 echo " --help Print this message" 117 echo " --verbose Enable verbose messages" 118 echo " --src-dir=<path> Source directory for development platform files [$SRCDIR]" 119 echo " --dst-dir=<path> Destination directory [$DSTDIR]" 120 echo " --platform=<list> List of API levels [$PLATFORMS]" 121 echo " --arch=<list> List of CPU architectures [$ARCHS]" 122 echo " --no-samples Ignore samples" 123 echo " --no-symlinks Don't create symlinks, copy files instead" 124 echo "" 125 exit 0 126 fi 127 128 if [ -n "$OPTION_SRCDIR" ] ; then 129 SRCDIR="$OPTION_SRCDIR"; 130 if [ ! -d "$SRCDIR" ] ; then 131 echo "ERROR: Source directory $SRCDIR does not exist !" 132 exit 1 133 fi 134 if [ ! -d "$SRCDIR/platforms/android-3" ] ; then 135 echo "ERROR: Invalid source directory: $SRCDIR" 136 echo "Please make sure it contains platforms/android-3 etc..." 137 exit 1 138 fi 139 else 140 SRCDIR=`dirname $ANDROID_NDK_ROOT`/development/ndk 141 log "Using source directory: $SRCDIR" 142 fi 143 144 if [ -n "$OPTION_PLATFORM" ] ; then 145 PLATFORMS=$(commas_to_spaces $OPTION_PLATFORM) 146 else 147 # Build the list from the content of SRCDIR 148 PLATFORMS=`extract_platforms_from "$SRCDIR"` 149 log "Using platforms: $PLATFORMS" 150 fi 151 152 # Remove the android- prefix of any platform name 153 PLATFORMS=$(echo $PLATFORMS | tr ' ' '\n' | sed -e 's!android-!!g' | tr '\n' ' ') 154 155 if [ -n "$OPTION_DSTDIR" ] ; then 156 DSTDIR="$OPTION_DSTDIR" 157 else 158 log "Using destination directory: $DSTDIR" 159 fi 160 161 # Handle architecture list 162 # 163 # We support both --arch and --abi for backwards compatibility reasons 164 # --arch is the new hotness, --abi is deprecated. 165 # 166 if [ -n "$OPTION_ARCH" ]; then 167 OPTION_ARCH=$(commas_to_spaces $OPTION_ARCH) 168 fi 169 170 if [ -n "$OPTION_ABI" ] ; then 171 echo "WARNING: --abi=<names> is deprecated. Use --arch=<names> instead!" 172 OPTION_ABI=$(commas_to_spaces $OPTION_ABI) 173 if [ -n "$OPTION_ARCH" -a "$OPTION_ARCH" != "$OPTION_ABI" ]; then 174 echo "ERROR: You can't use both --abi and --arch with different values!" 175 exit 1 176 fi 177 OPTION_ARCH=$OPTION_ABI 178 fi 179 180 if [ -n "$OPTION_ARCH" ] ; then 181 ARCHS="$OPTION_ARCH" 182 fi 183 log "Using architectures: $(commas_to_spaces $ARCHS)" 184 185 log "Checking source platforms." 186 for PLATFORM in $PLATFORMS; do 187 DIR="$SRCDIR/platforms/android-$PLATFORM" 188 if [ ! -d $DIR ] ; then 189 echo "ERROR: Directory missing: $DIR" 190 echo "Please check your --platform=<list> option and try again." 191 exit 2 192 else 193 log " $DIR" 194 fi 195 done 196 197 log "Checking source platform architectures." 198 BAD_ARCHS= 199 for ARCH in $ARCHS; do 200 eval CHECK_$ARCH=no 201 done 202 for PLATFORM in $PLATFORMS; do 203 for ARCH in $ARCHS; do 204 DIR="$SRCDIR/platforms/android-$PLATFORM/arch-$ARCH" 205 if [ -d $DIR ] ; then 206 log " $DIR" 207 eval CHECK_$ARCH=yes 208 fi 209 done 210 done 211 212 BAD_ARCHS= 213 for ARCH in $ARCHS; do 214 CHECK=`var_value CHECK_$ARCH` 215 log " $ARCH check: $CHECK" 216 if [ "$CHECK" = no ] ; then 217 if [ -z "$BAD_ARCHS" ] ; then 218 BAD_ARCHS=$ARCH 219 else 220 BAD_ARCHS="$BAD_ARCHS $ARCH" 221 fi 222 fi 223 done 224 225 if [ -n "$BAD_ARCHS" ] ; then 226 echo "ERROR: Source directory doesn't support these ARCHs: $BAD_ARCHS" 227 exit 3 228 fi 229 230 # $1: source directory (relative to $SRCDIR) 231 # $2: destination directory (relative to $DSTDIR) 232 # $3: description of directory contents (e.g. "sysroot" or "samples") 233 copy_src_directory () 234 { 235 local SDIR="$SRCDIR/$1" 236 local DDIR="$DSTDIR/$2" 237 if [ -d "$SDIR" ] ; then 238 log "Copying $3 from \$SRC/$1 to \$DST/$2." 239 mkdir -p "$DDIR" && (cd "$SDIR" && tar chf - *) | (tar xf - -C "$DDIR") 240 if [ $? != 0 ] ; then 241 echo "ERROR: Could not copy $3 directory $SDIR into $DDIR !" 242 exit 5 243 fi 244 fi 245 } 246 247 # Create a symlink-copy of directory $1 into $2 248 # This function is recursive. 249 # 250 # $1: source directory (relative to $SRCDIR) 251 # $2: destination directory (relative to $DSTDIR) 252 symlink_src_directory () 253 { 254 local files subdirs file subdir rev 255 mkdir -p "$DSTDIR/$2" 256 files=`cd $DSTDIR/$1 && ls -1p | grep -v -e '.*/'` 257 subdirs=`cd $DSTDIR/$1 && ls -1p | grep -e '.*/' | sed -e 's!/$!!g'` 258 rev=`reverse_path $1` 259 for file in $files; do 260 ln -s $rev/$1/$file $DSTDIR/$2/$file 261 done 262 for subdir in $subdirs; do 263 symlink_src_directory $1/$subdir $2/$subdir 264 done 265 } 266 267 # Copy platform sysroot and samples into your destination 268 # 269 270 # $SRC/android-$PLATFORM/include --> $DST/platforms/android-$PLATFORM/arch-$ARCH/usr/include 271 # $SRC/android-$PLATFORM/arch-$ARCH/include --> $DST/platforms/android-$PLATFORM/arch-$ARCH/usr/include 272 # for compatibility: 273 # $SRC/android-$PLATFORM/arch-$ARCH/usr/include --> $DST/platforms/android-$PLATFORM/arch-$ARCH/usr/include 274 275 276 277 # $SRC/android-$PLATFORM/arch-$ARCH/usr --> $DST/platforms/android-$PLATFORM/arch-$ARCH/usr 278 # $SRC/android-$PLATFORM/samples --> $DST/samples 279 # 280 rm -rf $DSTDIR/platforms && mkdir -p $DSTDIR/platforms 281 PREV_PLATFORM_DST= 282 for PLATFORM in $PLATFORMS; do 283 NEW_PLATFORM=platforms/android-$PLATFORM 284 PLATFORM_SRC=$NEW_PLATFORM 285 PLATFORM_DST=$NEW_PLATFORM 286 dump "Copying android-$PLATFORM platform files" 287 if [ -n "$PREV_PLATFORM_DST" ] ; then 288 if [ "$OPTION_NO_SYMLINKS" = "yes" ] ; then 289 log "Copying \$DST/$PREV_PLATFORM_DST to \$DST/$PLATFORM_DST" 290 #cp -r $DSTDIR/$PREV_PLATFORM_DST $DSTDIR/$PLATFORM_DST 291 copy_directory "$DSTDIR/$PREV_PLATFORM_DST" "$DSTDIR/$PLATFORM_DST" 292 else 293 log "Symlink-copying \$DST/$PREV_PLATFORM_DST to \$DST/$PLATFORM_DST" 294 symlink_src_directory $PREV_PLATFORM_DST $PLATFORM_DST 295 fi 296 if [ $? != 0 ] ; then 297 echo "ERROR: Could not copy previous sysroot to $DSTDIR/$NEW_PLATFORM" 298 exit 4 299 fi 300 fi 301 for ARCH in $ARCHS; do 302 SYSROOT=arch-$ARCH/usr 303 log "Copy $ARCH sysroot files from \$SRC/android-$PLATFORM over \$DST/android-$PLATFORM/arch-$ARCH" 304 copy_src_directory $PLATFORM_SRC/include $PLATFORM_DST/$SYSROOT/include "sysroot headers" 305 copy_src_directory $PLATFORM_SRC/arch-$ARCH/include $PLATFORM_DST/$SYSROOT/include "sysroot headers" 306 copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib $PLATFORM_DST/$SYSROOT/lib "sysroot libs" 307 copy_src_directory $PLATFORM_SRC/$SYSROOT $PLATFORM_DST/$SYSROOT "sysroot" 308 done 309 PREV_PLATFORM_DST=$PLATFORM_DST 310 done 311 312 if [ "$OPTION_NO_SAMPLES" = no ] ; then 313 # Copy platform samples and generic samples into your destination 314 # 315 # $SRC/samples/ --> $DST/samples/ 316 # $SRC/android-$PLATFORM/samples/ --> $DST/samples 317 # 318 dump "Copying generic samples" 319 rm -rf $DSTDIR/samples && mkdir -p $DSTDIR/samples 320 copy_src_directory samples samples samples 321 322 for PLATFORM in $PLATFORMS; do 323 dump "Copy android-$PLATFORM samples" 324 # $SRC/platform-$PLATFORM/samples --> $DST/samples 325 copy_src_directory platforms/android-$PLATFORM/samples samples samples 326 done 327 328 # Cleanup generated files in samples 329 rm -rf "$DSTDIR/samples/*/obj" 330 rm -rf "$DSTDIR/samples/*/libs" 331 fi 332 333 log "Done !" 334