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# gen-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# Also, we generate on-the-fly shared dynamic libraries from list of symbols: 33# 34# $SRC/android-N/arch-A/symbols --> $DST/android-N/arch-A/usr/lib 35# 36# Repeat after that for N+1, N+2, etc.. 37# 38 39PROGDIR=$(dirname "$0") 40. "$PROGDIR/prebuilt-common.sh" 41 42# Return the list of platform supported from $1/platforms 43# as a single space-separated sorted list of levels. (e.g. "3 4 5 8 9 14") 44# $1: source directory 45extract_platforms_from () 46{ 47 if [ -d "$1" ] ; then 48 (cd "$1/platforms" && ls -d android-*) | sed -e "s!android-!!" | sort -g | tr '\n' ' ' 49 else 50 echo "" 51 fi 52} 53 54SRCDIR="../development/ndk" 55DSTDIR="$ANDROID_NDK_ROOT" 56 57ARCHS=$(find_ndk_unknown_archs) 58ARCHS="$DEFAULT_ARCHS $ARCHS" 59PLATFORMS=`extract_platforms_from "$SRCDIR"` 60NDK_DIR=$ANDROID_NDK_ROOT 61 62OPTION_HELP=no 63OPTION_PLATFORMS= 64OPTION_SRCDIR= 65OPTION_DSTDIR= 66OPTION_SAMPLES= 67OPTION_FAST_COPY= 68OPTION_MINIMAL= 69OPTION_ARCH= 70OPTION_ABI= 71OPTION_DEBUG_LIBS= 72OPTION_OVERLAY= 73OPTION_GCC_VERSION= 74OPTION_LLVM_VERSION=$DEFAULT_LLVM_VERSION 75PACKAGE_DIR= 76 77VERBOSE=no 78VERBOSE2=no 79 80for opt do 81 optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'` 82 case "$opt" in 83 --help|-h|-\?) OPTION_HELP=yes 84 ;; 85 --verbose) 86 if [ "$VERBOSE" = "yes" ] ; then 87 VERBOSE2=yes 88 else 89 VERBOSE=yes 90 fi 91 ;; 92 --src-dir=*) 93 OPTION_SRCDIR="$optarg" 94 ;; 95 --dst-dir=*) 96 OPTION_DSTDIR="$optarg" 97 ;; 98 --ndk-dir=*) 99 NDK_DIR=$optarg 100 ;; 101 --platform=*) 102 OPTION_PLATFORM=$optarg 103 ;; 104 --arch=*) 105 OPTION_ARCH=$optarg 106 ;; 107 --abi=*) # We still support this for backwards-compatibility 108 OPTION_ABI=$optarg 109 ;; 110 --samples) 111 OPTION_SAMPLES=yes 112 ;; 113 --fast-copy) 114 OPTION_FAST_COPY=yes 115 ;; 116 --minimal) 117 OPTION_MINIMAL=yes 118 ;; 119 --package-dir=*) 120 PACKAGE_DIR=$optarg 121 ;; 122 --debug-libs) 123 OPTION_DEBUG_LIBS=true 124 ;; 125 --overlay) 126 OPTION_OVERLAY=true 127 ;; 128 --gcc-version=*) 129 OPTION_GCC_VERSION=$optarg 130 ;; 131 --llvm-version=*) 132 OPTION_LLVM_VERSION=$optarg 133 ;; 134 *) 135 echo "unknown option '$opt', use --help" 136 exit 1 137 esac 138done 139 140if [ $OPTION_HELP = "yes" ] ; then 141 echo "Collect files from an Android NDK development tree and assemble" 142 echo "the platform files appropriately into a final release structure." 143 echo "" 144 echo "options:" 145 echo "" 146 echo " --help Print this message" 147 echo " --verbose Enable verbose messages" 148 echo " --src-dir=<path> Source directory for development platform files [$SRCDIR]" 149 echo " --dst-dir=<path> Destination directory [$DSTDIR]" 150 echo " --ndk-dir=<path> Use toolchains from this NDK directory [$NDK_DIR]" 151 echo " --platform=<list> List of API levels [$PLATFORMS]" 152 echo " --arch=<list> List of CPU architectures [$ARCHS]" 153 echo " --minimal Ignore samples, symlinks and generated shared libs." 154 echo " --fast-copy Don't create symlinks, copy files instead" 155 echo " --samples Also generate samples directories." 156 echo " --package-dir=<path> Package platforms archive in specific path." 157 echo " --debug-libs Also generate C source file for generated libraries." 158 echo "" 159 echo "Use the --minimal flag if you want to generate minimal sysroot directories" 160 echo "that will be used to generate prebuilt toolchains. Otherwise, the script" 161 echo "will require these toolchains to be pre-installed and will use them to" 162 echo "generate shared system shared libraries from the symbol list files." 163 exit 0 164fi 165 166if [ -n "$OPTION_SRCDIR" ] ; then 167 SRCDIR="$OPTION_SRCDIR"; 168 if [ ! -d "$SRCDIR" ] ; then 169 echo "ERROR: Source directory $SRCDIR does not exist !" 170 exit 1 171 fi 172 if [ ! -d "$SRCDIR/platforms/android-3" ] ; then 173 echo "ERROR: Invalid source directory: $SRCDIR" 174 echo "Please make sure it contains platforms/android-3 etc..." 175 exit 1 176 fi 177else 178 SRCDIR=`dirname $ANDROID_NDK_ROOT`/development/ndk 179 log "Using source directory: $SRCDIR" 180fi 181 182if [ -n "$OPTION_PLATFORM" ] ; then 183 PLATFORMS=$(commas_to_spaces $OPTION_PLATFORM) 184else 185 # Build the list from the content of SRCDIR 186 PLATFORMS=`extract_platforms_from "$SRCDIR"` 187 # hack to place non-numeric level 'L' (lmp-preview) at the very end 188 if [ "$PLATFORMS" != "${PLATFORMS%%L*}" ] ; then 189 PLATFORMS=`echo $PLATFORMS | tr -d 'L'` 190 PLATFORMS="$PLATFORMS L" 191 fi 192 log "Using platforms: $PLATFORMS" 193fi 194 195# Remove the android- prefix of any platform name 196PLATFORMS=$(echo $PLATFORMS | tr ' ' '\n' | sed -e 's!^android-!!g' | tr '\n' ' ') 197 198if [ -n "$OPTION_DSTDIR" ] ; then 199 DSTDIR="$OPTION_DSTDIR" 200else 201 log "Using destination directory: $DSTDIR" 202fi 203 204# Handle architecture list 205# 206# We support both --arch and --abi for backwards compatibility reasons 207# --arch is the new hotness, --abi is deprecated. 208# 209if [ -n "$OPTION_ARCH" ]; then 210 OPTION_ARCH=$(commas_to_spaces $OPTION_ARCH) 211fi 212 213if [ -n "$OPTION_ABI" ] ; then 214 echo "WARNING: --abi=<names> is deprecated. Use --arch=<names> instead!" 215 OPTION_ABI=$(commas_to_spaces $OPTION_ABI) 216 if [ -n "$OPTION_ARCH" -a "$OPTION_ARCH" != "$OPTION_ABI" ]; then 217 echo "ERROR: You can't use both --abi and --arch with different values!" 218 exit 1 219 fi 220 OPTION_ARCH=$OPTION_ABI 221fi 222 223if [ -n "$OPTION_ARCH" ] ; then 224 ARCHS="$OPTION_ARCH" 225fi 226log "Using architectures: $(commas_to_spaces $ARCHS)" 227 228log "Checking source platforms." 229for PLATFORM in $PLATFORMS; do 230 DIR="$SRCDIR/platforms/android-$PLATFORM" 231 if [ ! -d $DIR ] ; then 232 echo "ERROR: Directory missing: $DIR" 233 echo "Please check your --platform=<list> option and try again." 234 exit 2 235 else 236 log " $DIR" 237 fi 238done 239 240log "Checking source platform architectures." 241BAD_ARCHS= 242for ARCH in $ARCHS; do 243 eval CHECK_$ARCH=no 244done 245for PLATFORM in $PLATFORMS; do 246 for ARCH in $ARCHS; do 247 DIR="$SRCDIR/platforms/android-$PLATFORM/arch-$ARCH" 248 if [ -d $DIR ] ; then 249 log " $DIR" 250 eval CHECK_$ARCH=yes 251 fi 252 done 253done 254 255if [ "$OPTION_MINIMAL" ]; then 256 OPTION_SAMPLES= 257 OPTION_FAST_COPY=yes 258fi 259 260BAD_ARCHS= 261for ARCH in $ARCHS; do 262 CHECK=`var_value CHECK_$ARCH` 263 log " $ARCH check: $CHECK" 264 if [ "$CHECK" = no ] ; then 265 if [ -z "$BAD_ARCHS" ] ; then 266 BAD_ARCHS=$ARCH 267 else 268 BAD_ARCHS="$BAD_ARCHS $ARCH" 269 fi 270 fi 271done 272 273if [ -n "$BAD_ARCHS" ] ; then 274 echo "ERROR: Source directory doesn't support these ARCHs: $BAD_ARCHS" 275 exit 3 276fi 277 278# $1: source directory (relative to $SRCDIR) 279# $2: destination directory (relative to $DSTDIR) 280# $3: description of directory contents (e.g. "sysroot" or "samples") 281copy_src_directory () 282{ 283 local SDIR="$SRCDIR/$1" 284 local DDIR="$DSTDIR/$2" 285 if [ -d "$SDIR" ] ; then 286 log "Copying $3 from \$SRC/$1 to \$DST/$2." 287 mkdir -p "$DDIR" && (cd "$SDIR" && 2>/dev/null tar chf - *) | (tar xf - -C "$DDIR") 288 if [ $? != 0 ] ; then 289 echo "ERROR: Could not copy $3 directory $SDIR into $DDIR !" 290 exit 5 291 fi 292 fi 293} 294 295# $1: source dir 296# $2: destination dir 297# $3: reverse path 298# 299symlink_src_directory_inner () 300{ 301 local files file subdir rev 302 mkdir -p "$DSTDIR/$2" 303 rev=$3 304 files=$(cd $DSTDIR/$1 && ls -1p) 305 for file in $files; do 306 if [ "$file" = "${file%%/}" ]; then 307 log2 "Link \$DST/$2/$file --> $rev/$1/$file" 308 ln -s $rev/$1/$file $DSTDIR/$2/$file 309 else 310 file=${file%%/} 311 symlink_src_directory_inner "$1/$file" "$2/$file" "$rev/.." 312 fi 313 done 314} 315# Create a symlink-copy of directory $1 into $2 316# This function is recursive. 317# 318# $1: source directory (relative to $SRCDIR) 319# $2: destination directory (relative to $DSTDIR) 320symlink_src_directory () 321{ 322 symlink_src_directory_inner "$1" "$2" "$(reverse_path $1)" 323} 324 325# Remove unwanted symbols 326# $1: symbol file (one symbol per line) 327# $2+: Input symbol list 328# Out: Input symbol file, without any unwanted symbol listed by $1 329remove_unwanted_symbols_from () 330{ 331 local SYMBOL_FILE="$1" 332 shift 333 if [ -f "$SYMBOL_FILE" ]; then 334 echo "$@" | tr ' ' '\n' | grep -v -F -x -f $SYMBOL_FILE | tr '\n' ' ' 335 else 336 echo "$@" 337 fi 338} 339 340# Remove unwanted symbols from a library's functions list. 341# $1: Architecture name 342# $2: Library name (e.g. libc.so) 343# $3+: Input symbol list 344# Out: Input symbol list without any unwanted symbols. 345remove_unwanted_function_symbols () 346{ 347 local ARCH LIBRARY SYMBOL_FILE 348 ARCH=$1 349 LIBRARY=$2 350 shift; shift 351 SYMBOL_FILE=$PROGDIR/unwanted-symbols/$ARCH/$LIBRARY.functions.txt 352 remove_unwanted_symbols_from $SYMBOL_FILE "$@" 353} 354 355# Same as remove_unwanted_functions_symbols, but for variable names. 356# 357remove_unwanted_variable_symbols () 358{ 359 local ARCH LIBRARY SYMBOL_FILE 360 ARCH=$1 361 LIBRARY=$2 362 shift; shift 363 SYMBOL_FILE=$PROGDIR/unwanted-symbols/$ARCH/$LIBRARY.variables.txt 364 remove_unwanted_symbols_from $SYMBOL_FILE "$@" 365} 366 367# $1: Architecture 368# Out: compiler command 369get_default_compiler_for_arch() 370{ 371 local ARCH=$1 372 local TOOLCHAIN_PREFIX EXTRA_CFLAGS CC GCC_VERSION 373 374 if [ "$ARCH" = "${ARCH%%64*}" -a "$(arch_in_unknown_archs $ARCH)" = "yes" ]; then 375 for TAG in $HOST_TAG $HOST_TAG32; do 376 TOOLCHAIN_PREFIX="$NDK_DIR/$(get_llvm_toolchain_binprefix $OPTION_LLVM_VERSION $TAG)" 377 CC="$TOOLCHAIN_PREFIX/clang" 378 if [ -f "$CC" ]; then 379 break; 380 fi 381 done 382 EXTRA_CFLAGS="-emit-llvm" 383 else 384 if [ -n "$OPTION_GCC_VERSION" ]; then 385 GCC_VERSION=$OPTION_GCC_VERSION 386 else 387 GCC_VERSION=$(get_default_gcc_version_for_arch $ARCH) 388 fi 389 for TAG in $HOST_TAG $HOST_TAG32; do 390 TOOLCHAIN_PREFIX="$NDK_DIR/$(get_toolchain_binprefix_for_arch $ARCH $GCC_VERSION $TAG)" 391 TOOLCHAIN_PREFIX=${TOOLCHAIN_PREFIX%-} 392 CC="$TOOLCHAIN_PREFIX-gcc" 393 if [ -f "$CC" ]; then 394 break; 395 fi 396 done 397 EXTRA_CFLAGS= 398 fi 399 400 if [ ! -f "$CC" ]; then 401 dump "ERROR: $ARCH toolchain not installed: $CC" 402 dump "Important: Use the --minimal flag to use this script without generated system shared libraries." 403 dump "This is generally useful when you want to generate the host cross-toolchain programs." 404 exit 1 405 fi 406 echo "$CC $EXTRA_CFLAGS" 407} 408 409# $1: library name 410# $2: functions list 411# $3: variables list 412# $4: destination file 413# $5: compiler command 414gen_shared_lib () 415{ 416 local LIBRARY=$1 417 local FUNCS="$2" 418 local VARS="$3" 419 local DSTFILE="$4" 420 local CC="$5" 421 422 # Now generate a small C source file that contains similarly-named stubs 423 echo "/* Auto-generated file, do not edit */" > $TMPC 424 local func var 425 for func in $FUNCS; do 426 echo "void $func(void) {}" >> $TMPC 427 done 428 for var in $VARS; do 429 echo "int $var = 0;" >> $TMPC 430 done 431 432 # Build it with our cross-compiler. It will complain about conflicting 433 # types for built-in functions, so just shut it up. 434 COMMAND="$CC -Wl,-shared,-Bsymbolic -Wl,-soname,$LIBRARY -nostdlib -o $TMPO $TMPC" 435 echo "## COMMAND: $COMMAND" > $TMPL 436 $COMMAND 1>>$TMPL 2>&1 437 if [ $? != 0 ] ; then 438 dump "ERROR: Can't generate shared library for: $LIBNAME" 439 dump "See the content of $TMPC and $TMPL for details." 440 cat $TMPL | tail -10 441 exit 1 442 fi 443 444 # Copy to our destination now 445 local libdir=$(dirname "$DSTFILE") 446 mkdir -p "$libdir" && rm -f "$DSTFILE" && cp -f $TMPO "$DSTFILE" 447 if [ $? != 0 ] ; then 448 dump "ERROR: Can't copy shared library for: $LIBNAME" 449 dump "target location is: $DSTFILE" 450 exit 1 451 fi 452 453 if [ "$OPTION_DEBUG_LIBS" ]; then 454 cp $TMPC $DSTFILE.c 455 echo "$FUNCS" > $DSTFILE.functions.txt 456 echo "$VARS" > $DSTFILE.variables.txt 457 fi 458} 459 460# $1: Architecture 461# $2: symbol source directory (relative to $SRCDIR) 462# $3: destination directory for generated libs (relative to $DSTDIR) 463# $4: compiler flags (optional) 464gen_shared_libraries () 465{ 466 local ARCH=$1 467 local SYMDIR="$SRCDIR/$2" 468 local DSTDIR="$DSTDIR/$3" 469 local FLAGS="$4" 470 local CC funcs vars numfuncs numvars 471 472 # Let's locate the toolchain we're going to use 473 CC=$(get_default_compiler_for_arch $ARCH)" $FLAGS" 474 475 # In certain cases, the symbols directory doesn't exist, 476 # e.g. on x86 for PLATFORM < 9 477 if [ ! -d "$SYMDIR" ]; then 478 return 479 fi 480 481 # Let's list the libraries we're going to generate 482 LIBS=$( (cd $SYMDIR && 2>/dev/null ls *.functions.txt) | sort -u | sed -e 's!\.functions\.txt$!!g') 483 484 for LIB in $LIBS; do 485 funcs=$(cat "$SYMDIR/$LIB.functions.txt" 2>/dev/null) 486 vars=$(cat "$SYMDIR/$LIB.variables.txt" 2>/dev/null) 487 funcs=$(remove_unwanted_function_symbols $ARCH libgcc.a $funcs) 488 funcs=$(remove_unwanted_function_symbols $ARCH $LIB $funcs) 489 vars=$(remove_unwanted_variable_symbols $ARCH $LIB $vars) 490 numfuncs=$(echo $funcs | wc -w) 491 numvars=$(echo $vars | wc -w) 492 log "Generating $ARCH shared library for $LIB ($numfuncs functions + $numvars variables)" 493 494 gen_shared_lib $LIB "$funcs" "$vars" "$DSTDIR/$LIB" "$CC" 495 done 496} 497 498# $1: platform number 499# $2: architecture name 500# $3: common source directory (for crtbrand.c, etc) 501# $4: source directory (for *.S files) 502# $5: destination directory 503# $6: flags for compiler (optional) 504gen_crt_objects () 505{ 506 local API=$1 507 local ARCH=$2 508 local COMMON_SRC_DIR="$SRCDIR/$3" 509 local SRC_DIR="$SRCDIR/$4" 510 local DST_DIR="$DSTDIR/$5" 511 local FLAGS="$6" 512 local SRC_FILE DST_FILE 513 local CC 514 515 if [ ! -d "$SRC_DIR" ]; then 516 return 517 fi 518 519 # Let's locate the toolchain we're going to use 520 CC=$(get_default_compiler_for_arch $ARCH)" $FLAGS" 521 522 CRTBRAND_S=$DST_DIR/crtbrand.s 523 log "Generating platform $API crtbrand assembly code: $CRTBRAND_S" 524 (cd "$COMMON_SRC_DIR" && mkdir -p `dirname $CRTBRAND_S` && $CC -DPLATFORM_SDK_VERSION=$API -fpic -S -o - crtbrand.c | \ 525 sed -e '/\.note\.ABI-tag/s/progbits/note/' > "$CRTBRAND_S") 1>>$TMPL 2>&1 526 if [ $? != 0 ]; then 527 dump "ERROR: Could not generate $CRTBRAND_S from $COMMON_SRC_DIR/crtbrand.c" 528 dump "Please see the content of $TMPL for details!" 529 cat $TMPL | tail -10 530 exit 1 531 fi 532 533 for SRC_FILE in $(cd "$SRC_DIR" && ls crt*.[cS]); do 534 DST_FILE=${SRC_FILE%%.c} 535 DST_FILE=${DST_FILE%%.S}.o 536 537 case "$DST_FILE" in 538 "crtend.o") 539 # Special case: crtend.S must be compiled as crtend_android.o 540 # This is for long historical reasons, i.e. to avoid name conflicts 541 # in the past with other crtend.o files. This is hard-coded in the 542 # Android toolchain configuration, so switch the name here. 543 DST_FILE=crtend_android.o 544 ;; 545 "crtbegin_dynamic.o"|"crtbegin_static.o") 546 # Add .note.ABI-tag section 547 SRC_FILE=$SRC_FILE" $CRTBRAND_S" 548 ;; 549 "crtbegin.o") 550 # If we have a single source for both crtbegin_static.o and 551 # crtbegin_dynamic.o we generate one and make a copy later. 552 DST_FILE=crtbegin_dynamic.o 553 # Add .note.ABI-tag section 554 SRC_FILE=$SRC_FILE" $CRTBRAND_S" 555 ;; 556 esac 557 558 log "Generating $ARCH C runtime object: $DST_FILE" 559 (cd "$SRC_DIR" && $CC \ 560 -I$SRCDIR/../../bionic/libc/include \ 561 -I$SRCDIR/../../bionic/libc/arch-common/bionic \ 562 -I$SRCDIR/../../bionic/libc/arch-$ARCH/include \ 563 -DPLATFORM_SDK_VERSION=$API \ 564 -O2 -fpic -Wl,-r -nostdlib -o "$DST_DIR/$DST_FILE" $SRC_FILE) 1>>$TMPL 2>&1 565 if [ $? != 0 ]; then 566 dump "ERROR: Could not generate $DST_FILE from $SRC_DIR/$SRC_FILE" 567 dump "Please see the content of $TMPL for details!" 568 cat $TMPL | tail -10 569 exit 1 570 fi 571 if [ ! -s "$DST_DIR/crtbegin_static.o" ]; then 572 cp "$DST_DIR/crtbegin_dynamic.o" "$DST_DIR/crtbegin_static.o" 573 fi 574 done 575 rm -f "$CRTBRAND_S" 576} 577 578# $1: platform number 579# $2: architecture 580# $3: target NDK directory 581generate_api_level () 582{ 583 local API=$1 584 local ARCH=$2 585 local HEADER="platforms/android-$API/arch-$ARCH/usr/include/android/api-level.h" 586 log "Generating: $HEADER" 587 rm -f "$3/$HEADER" # Remove symlink if any. 588 589 # hack to replace 'L' with large number 590 if [ "$API" = "L" ]; then 591 API="9999 /*'L'*/" 592 fi 593 594 cat > "$3/$HEADER" <<EOF 595/* 596 * Copyright (C) 2008 The Android Open Source Project 597 * All rights reserved. 598 * 599 * Redistribution and use in source and binary forms, with or without 600 * modification, are permitted provided that the following conditions 601 * are met: 602 * * Redistributions of source code must retain the above copyright 603 * notice, this list of conditions and the following disclaimer. 604 * * Redistributions in binary form must reproduce the above copyright 605 * notice, this list of conditions and the following disclaimer in 606 * the documentation and/or other materials provided with the 607 * distribution. 608 * 609 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 610 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 611 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 612 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 613 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 614 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 615 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 616 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 617 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 618 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 619 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 620 * SUCH DAMAGE. 621 */ 622#ifndef ANDROID_API_LEVEL_H 623#define ANDROID_API_LEVEL_H 624 625#define __ANDROID_API__ $API 626 627#endif /* ANDROID_API_LEVEL_H */ 628EOF 629} 630 631# Copy platform sysroot and samples into your destination 632# 633 634# if $SRC/android-$PLATFORM/arch-$ARCH exists 635# $SRC/android-$PLATFORM/include --> $DST/android-$PLATFORM/arch-$ARCH/usr/include 636# $SRC/android-$PLATFORM/arch-$ARCH/include --> $DST/android-$PLATFORM/arch-$ARCH/usr/include 637# $SRC/android-$PLATFORM/arch-$ARCH/lib --> $DST/android-$PLATFORM/arch-$ARCH/usr/lib 638# 639if [ -z "$OPTION_OVERLAY" ]; then 640 rm -rf $DSTDIR/platforms && mkdir -p $DSTDIR/platforms 641fi 642for ARCH in $ARCHS; do 643 # Find first platform for this arch 644 PREV_SYSROOT_DST= 645 PREV_PLATFORM_SRC_ARCH= 646 LIBDIR=$(get_default_libdir_for_arch $ARCH) 647 648 for PLATFORM in $PLATFORMS; do 649 PLATFORM_DST=platforms/android-$PLATFORM # Relative to $DSTDIR 650 PLATFORM_SRC=$PLATFORM_DST # Relative to $SRCDIR 651 SYSROOT_DST=$PLATFORM_DST/arch-$ARCH/usr 652 # Skip over if there is no arch-specific file for this platform 653 # and no destination platform directory was created. This is needed 654 # because x86 and MIPS don't have files for API levels 3-8. 655 if [ -z "$PREV_SYSROOT_DST" -a \ 656 ! -d "$SRCDIR/$PLATFORM_SRC/arch-$ARCH" ]; then 657 log "Skipping: \$SRC/$PLATFORM_SRC/arch-$ARCH" 658 continue 659 fi 660 661 log "Populating \$DST/platforms/android-$PLATFORM/arch-$ARCH" 662 663 # If this is not the first destination directory, copy over, or 664 # symlink the files from the previous one now. 665 if [ "$PREV_SYSROOT_DST" ]; then 666 if [ "$OPTION_FAST_COPY" ]; then 667 log "Copying \$DST/$PREV_SYSROOT_DST to \$DST/$SYSROOT_DST" 668 copy_directory "$DSTDIR/$PREV_SYSROOT_DST" "$DSTDIR/$SYSROOT_DST" 669 else 670 log "Symlink-copying \$DST/$PREV_SYSROOT_DST to \$DST/$SYSROOT_DST" 671 symlink_src_directory $PREV_SYSROOT_DST $SYSROOT_DST 672 fi 673 fi 674 675 # If this is the first destination directory, copy the common 676 # files from previous platform directories into this one. 677 # This helps copy the common headers from android-3 to android-8 678 # into the x86 and mips android-9 directories. 679 if [ -z "$PREV_SYSROOT_DST" ]; then 680 for OLD_PLATFORM in $PLATFORMS; do 681 if [ "$OLD_PLATFORM" = "$PLATFORM" ]; then 682 break 683 fi 684 copy_src_directory platforms/android-$OLD_PLATFORM/include \ 685 $SYSROOT_DST/include \ 686 "common android-$OLD_PLATFORM headers" 687 done 688 fi 689 690 # There are two set of bionic headers: the original ones haven't been updated since 691 # gingerbread except for bug fixing, and the new ones in android-$FIRST_API64_LEVEL 692 # with 64-bit support. Before the old bionic headers are deprecated/removed, we need 693 # to remove stale old headers when createing platform = $FIRST_API64_LEVEL 694 if [ "$PLATFORM" = "$FIRST_API64_LEVEL" ]; then 695 log "Removing stale bionic headers in \$DST/$SYSROOT_DST/include" 696 nonbionic_files="android EGL GLES GLES2 GLES3 KHR media OMXAL SLES jni.h thread_db.h zconf.h zlib.h" 697 if [ -d "$DSTDIR/$SYSROOT_DST/include/" ]; then 698 files=$(cd "$DSTDIR/$SYSROOT_DST/include/" && ls) 699 for file in $files; do 700 if [ "$nonbionic_files" = "${nonbionic_files%%${file}*}" ]; then 701 rm -rf "$DSTDIR/$SYSROOT_DST/include/$file" 702 fi 703 done 704 fi 705 fi 706 707 # Now copy over all non-arch specific include files 708 copy_src_directory $PLATFORM_SRC/include $SYSROOT_DST/include "common system headers" 709 copy_src_directory $PLATFORM_SRC/arch-$ARCH/include $SYSROOT_DST/include "$ARCH system headers" 710 711 generate_api_level "$PLATFORM" "$ARCH" "$DSTDIR" 712 713 # If --minimal is not used, copy or generate binary files. 714 if [ -z "$OPTION_MINIMAL" ]; then 715 # Copy the prebuilt static libraries. We need full set for multilib compiler for some arch 716 case "$ARCH" in 717 x86_64) 718 copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib $SYSROOT_DST/lib "x86 sysroot libs" 719 copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib64 $SYSROOT_DST/lib64 "x86_64 sysroot libs" 720 copy_src_directory $PLATFORM_SRC/arch-$ARCH/libx32 $SYSROOT_DST/libx32 "x32 sysroot libs" 721 ;; 722 mips64) 723 copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib $SYSROOT_DST/lib "mips -mabi=32 sysroot libs" 724 copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib64 $SYSROOT_DST/lib64 "mips -mabi=64 sysroot libs" 725 copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib32 $SYSROOT_DST/lib32 "mips -mabi=n32 sysroot libs" 726 ;; 727 *) 728 copy_src_directory $PLATFORM_SRC/arch-$ARCH/$LIBDIR $SYSROOT_DST/$LIBDIR "$ARCH sysroot libs" 729 ;; 730 esac 731 732 # Generate C runtime object files when available 733 PLATFORM_SRC_ARCH=$PLATFORM_SRC/arch-$ARCH/src 734 if [ ! -d "$SRCDIR/$PLATFORM_SRC_ARCH" ]; then 735 PLATFORM_SRC_ARCH=$PREV_PLATFORM_SRC_ARCH 736 else 737 PREV_PLATFORM_SRC_ARCH=$PLATFORM_SRC_ARCH 738 fi 739 740 # Genreate crt objects for known archs 741 if [ "$(arch_in_unknown_archs $ARCH)" != "yes" ]; then 742 case "$ARCH" in 743 x86_64) 744 gen_crt_objects $PLATFORM $ARCH platforms/common/src $PLATFORM_SRC_ARCH $SYSROOT_DST/lib "-m32" 745 gen_crt_objects $PLATFORM $ARCH platforms/common/src $PLATFORM_SRC_ARCH $SYSROOT_DST/lib64 "-m64" 746 gen_crt_objects $PLATFORM $ARCH platforms/common/src $PLATFORM_SRC_ARCH $SYSROOT_DST/libx32 "-mx32" 747 ;; 748 mips64) 749 gen_crt_objects $PLATFORM $ARCH platforms/common/src $PLATFORM_SRC_ARCH $SYSROOT_DST/lib "-mabi=32" 750 gen_crt_objects $PLATFORM $ARCH platforms/common/src $PLATFORM_SRC_ARCH $SYSROOT_DST/lib64 "-mabi=64" 751 gen_crt_objects $PLATFORM $ARCH platforms/common/src $PLATFORM_SRC_ARCH $SYSROOT_DST/lib32 "-mabi=n32" 752 ;; 753 *) 754 gen_crt_objects $PLATFORM $ARCH platforms/common/src $PLATFORM_SRC_ARCH $SYSROOT_DST/$LIBDIR 755 ;; 756 esac 757 fi 758 759 # Generate shared libraries from symbol files 760 if [ "$(arch_in_unknown_archs $ARCH)" = "yes" ]; then 761 gen_shared_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $SYSROOT_DST/lib "-target le32-none-ndk" 762 gen_shared_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $SYSROOT_DST/lib64 "-target le64-none-ndk" 763 else 764 case "$ARCH" in 765 x86_64) 766 gen_shared_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $SYSROOT_DST/lib "-m32" 767 gen_shared_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $SYSROOT_DST/lib64 "-m64" 768 gen_shared_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $SYSROOT_DST/libx32 "-mx32" 769 ;; 770 mips64) 771 gen_shared_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $SYSROOT_DST/lib "-mabi=32" 772 gen_shared_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $SYSROOT_DST/lib64 "-mabi=64" 773 gen_shared_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $SYSROOT_DST/lib32 "-mabi=n32" 774 ;; 775 *) 776 gen_shared_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $SYSROOT_DST/$LIBDIR 777 ;; 778 esac 779 fi 780 else 781 # Copy the prebuilt binaries to bootstrap GCC 782 case "$ARCH" in 783 x86_64) 784 copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib-bootstrap/lib $SYSROOT_DST/lib "x86 sysroot libs (boostrap)" 785 copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib-bootstrap/lib64 $SYSROOT_DST/lib64 "x86_64 sysroot libs (boostrap)" 786 copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib-bootstrap/libx32 $SYSROOT_DST/libx32 "x32 sysroot libs (boostrap)" 787 ;; 788 mips64) 789 copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib-bootstrap/lib $SYSROOT_DST/lib "mips -mabi=32 sysroot libs (boostrap)" 790 copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib-bootstrap/lib64 $SYSROOT_DST/lib64 "mips -mabi=64 sysroot libs (boostrap)" 791 copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib-bootstrap/lib32 $SYSROOT_DST/lib32 "mips -mabi=n32 sysroot libs (boostrap)" 792 ;; 793 *) 794 copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib-bootstrap $SYSROOT_DST/$LIBDIR "$ARCH sysroot libs (boostrap)" 795 ;; 796 esac 797 fi 798 PREV_SYSROOT_DST=$SYSROOT_DST 799 done 800done 801 802# 803# $SRC/android-$PLATFORM/samples --> $DST/samples 804# 805if [ "$OPTION_SAMPLES" ] ; then 806 # Copy platform samples and generic samples into your destination 807 # 808 # $SRC/samples/ --> $DST/samples/ 809 # $SRC/android-$PLATFORM/samples/ --> $DST/samples 810 # 811 dump "Copying generic samples" 812 if [ -z "$OPTION_OVERLAY" ]; then 813 rm -rf $DSTDIR/samples && mkdir -p $DSTDIR/samples 814 fi 815 copy_src_directory samples samples samples 816 817 for PLATFORM in $PLATFORMS; do 818 dump "Copy android-$PLATFORM samples" 819 # $SRC/platform-$PLATFORM/samples --> $DST/samples 820 copy_src_directory platforms/android-$PLATFORM/samples samples samples 821 done 822 823 # Cleanup generated files in samples 824 rm -rf "$DSTDIR/samples/*/obj" 825 rm -rf "$DSTDIR/samples/*/libs" 826fi 827 828if [ "$PACKAGE_DIR" ]; then 829 mkdir -p "$PACKAGE_DIR" 830 fail_panic "Could not create package directory: $PACKAGE_DIR" 831 ARCHIVE=platforms.tar.bz2 832 dump "Packaging $ARCHIVE" 833 pack_archive "$PACKAGE_DIR/$ARCHIVE" "$DSTDIR" "platforms" 834 fail_panic "Could not package platforms" 835 if [ "$OPTION_SAMPLES" ]; then 836 ARCHIVE=samples.tar.bz2 837 dump "Packaging $ARCHIVE" 838 pack_archive "$PACKAGE_DIR/$ARCHIVE" "$DSTDIR" "samples" 839 fail_panic "Could not package samples" 840 fi 841fi 842 843log "Done !" 844