aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid 'Digit' Turner <digit@google.com>2011-10-01 00:48:55 +0200
committerDavid 'Digit' Turner <digit@google.com>2011-10-01 00:48:55 +0200
commit180419b33328baff48967e59600ff6fad7740dc0 (patch)
tree88d2dafc49e23a034f8aac8c13fb5f840f2c9de1
parent0528f4d870022e4c3ee4e32714a7ef88908e310f (diff)
downloadndk-180419b33328baff48967e59600ff6fad7740dc0.tar.gz
gen-platforms.sh: new development script
This patch adds a new script named 'gen-platforms.sh', used like 'build-platforms.sh' to generate final platform sysroot directories. They take the same parameters. The difference between these two scripts is that gen-platforms.sh does generate shared libraries from functions/variables list files found in development/ndk/platforms/android-$PLATFORM/arch-$ARCH/symbols/ built-platforms.sh instead copies the files from .../lib directory instead. In a future patch, we're going to remove all prebuilt shared libraries from development/ndk, and replace them with symbol files. We will also remove build-platforms.sh and replace its usage by gen-platforms.sh Change-Id: I2720095f0fcbbbfb5e1374cd1fdaac898ec53393
-rwxr-xr-xbuild/tools/gen-platforms.sh417
1 files changed, 417 insertions, 0 deletions
diff --git a/build/tools/gen-platforms.sh b/build/tools/gen-platforms.sh
new file mode 100755
index 000000000..0fae2653c
--- /dev/null
+++ b/build/tools/gen-platforms.sh
@@ -0,0 +1,417 @@
+#!/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.
+#
+# build-platforms.sh
+#
+# This tool is used when packaging a new release, or when developing
+# the NDK itself. It will populate DST ($NDK/platforms by default)
+# with the content of SRC ($NDK/../development/ndk/platforms/ by default).
+#
+# 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
+#
+# Also, we generate on-the-fly shell dynamic libraries from list of symbols:
+#
+# $SRC/android-N/arch-A/symbols --> $DST/android-N/arch-A/usr/lib
+#
+# Repeat after that for N+1, N+2, etc..
+#
+
+. `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 ()
+{
+ if [ -d "$1" ] ; then
+ (cd "$1/platforms" && ls -d android-*) | sed -e "s!android-!!" | tr '\n' ' '
+ else
+ echo ""
+ fi
+}
+
+SRCDIR="../development/ndk"
+DSTDIR="$ANDROID_NDK_ROOT"
+
+ARCHS="arm"
+PLATFORMS=`extract_platforms_from "$SRCDIR"`
+
+OPTION_HELP=no
+OPTION_PLATFORMS=
+OPTION_SRCDIR=
+OPTION_DSTDIR=
+OPTION_NO_SAMPLES=no
+OPTION_NO_SYMLINKS=no
+OPTION_ARCH=
+OPTION_ABI=
+
+VERBOSE=no
+VERBOSE2=no
+
+for opt do
+ optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'`
+ case "$opt" in
+ --help|-h|-\?) OPTION_HELP=yes
+ ;;
+ --verbose)
+ if [ "$VERBOSE" = "yes" ] ; then
+ VERBOSE2=yes
+ else
+ VERBOSE=yes
+ fi
+ ;;
+ --src-dir=*)
+ OPTION_SRCDIR="$optarg"
+ ;;
+ --dst-dir=*)
+ OPTION_DSTDIR="$optarg"
+ ;;
+ --platform=*)
+ OPTION_PLATFORM=$optarg
+ ;;
+ --arch=*)
+ OPTION_ARCH=$optarg
+ ;;
+ --abi=*) # We still support this for backwards-compatibility
+ OPTION_ABI=$optarg
+ ;;
+ --no-samples)
+ OPTION_NO_SAMPLES=yes
+ ;;
+ --no-symlinks)
+ OPTION_NO_SYMLINKS=yes
+ ;;
+ *)
+ echo "unknown option '$opt', use --help"
+ exit 1
+ esac
+done
+
+if [ $OPTION_HELP = "yes" ] ; then
+ echo "Collect files from an Android NDK development tree and assemble"
+ echo "the platform files appropriately into a final release structure."
+ echo ""
+ echo "options:"
+ echo ""
+ echo " --help Print this message"
+ echo " --verbose Enable verbose messages"
+ echo " --src-dir=<path> Source directory for development platform files [$SRCDIR]"
+ echo " --dst-dir=<path> Destination directory [$DSTDIR]"
+ echo " --platform=<list> List of API levels [$PLATFORMS]"
+ echo " --arch=<list> List of CPU architectures [$ARCHS]"
+ echo " --no-samples Ignore samples"
+ echo " --no-symlinks Don't create symlinks, copy files instead"
+ echo ""
+ exit 0
+fi
+
+if [ -n "$OPTION_SRCDIR" ] ; then
+ SRCDIR="$OPTION_SRCDIR";
+ if [ ! -d "$SRCDIR" ] ; then
+ echo "ERROR: Source directory $SRCDIR does not exist !"
+ exit 1
+ fi
+ if [ ! -d "$SRCDIR/platforms/android-3" ] ; then
+ echo "ERROR: Invalid source directory: $SRCDIR"
+ echo "Please make sure it contains platforms/android-3 etc..."
+ exit 1
+ fi
+else
+ SRCDIR=`dirname $ANDROID_NDK_ROOT`/development/ndk
+ log "Using source directory: $SRCDIR"
+fi
+
+if [ -n "$OPTION_PLATFORM" ] ; then
+ PLATFORMS=$(commas_to_spaces $OPTION_PLATFORM)
+else
+ # Build the list from the content of SRCDIR
+ PLATFORMS=`extract_platforms_from "$SRCDIR"`
+ log "Using platforms: $PLATFORMS"
+fi
+
+# Remove the android- prefix of any platform name
+PLATFORMS=$(echo $PLATFORMS | tr ' ' '\n' | sed -e 's!^android-!!g' | tr '\n' ' ')
+
+if [ -n "$OPTION_DSTDIR" ] ; then
+ DSTDIR="$OPTION_DSTDIR"
+else
+ log "Using destination directory: $DSTDIR"
+fi
+
+# 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
+
+if [ -n "$OPTION_ARCH" ] ; then
+ ARCHS="$OPTION_ARCH"
+fi
+log "Using architectures: $(commas_to_spaces $ARCHS)"
+
+log "Checking source platforms."
+for PLATFORM in $PLATFORMS; do
+ DIR="$SRCDIR/platforms/android-$PLATFORM"
+ if [ ! -d $DIR ] ; then
+ echo "ERROR: Directory missing: $DIR"
+ echo "Please check your --platform=<list> option and try again."
+ exit 2
+ else
+ log " $DIR"
+ fi
+done
+
+log "Checking source platform architectures."
+BAD_ARCHS=
+for ARCH in $ARCHS; do
+ eval CHECK_$ARCH=no
+done
+for PLATFORM in $PLATFORMS; do
+ for ARCH in $ARCHS; do
+ DIR="$SRCDIR/platforms/android-$PLATFORM/arch-$ARCH"
+ if [ -d $DIR ] ; then
+ log " $DIR"
+ eval CHECK_$ARCH=yes
+ fi
+ done
+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
+
+# $1: source directory (relative to $SRCDIR)
+# $2: destination directory (relative to $DSTDIR)
+# $3: description of directory contents (e.g. "sysroot" or "samples")
+copy_src_directory ()
+{
+ local SDIR="$SRCDIR/$1"
+ local DDIR="$DSTDIR/$2"
+ if [ -d "$SDIR" ] ; then
+ log "Copying $3 from \$SRC/$1 to \$DST/$2."
+ mkdir -p "$DDIR" && (cd "$SDIR" && 2>/dev/null tar chf - *) | (tar xf - -C "$DDIR")
+ if [ $? != 0 ] ; then
+ echo "ERROR: Could not copy $3 directory $SDIR into $DDIR !"
+ exit 5
+ fi
+ fi
+}
+
+# $1: source dir
+# $2: destination dir
+# $3: reverse path
+#
+symlink_src_directory_inner ()
+{
+ local files file subdir rev
+ mkdir -p "$DSTDIR/$2"
+ rev=$3
+ files=$(cd $DSTDIR/$1 && ls -1p)
+ for file in $files; do
+ if [ "$file" = "${file%%/}" ]; then
+ log "Link \$DST/$2/$file --> $rev/$1/$file"
+ ln -s $rev/$1/$file $DSTDIR/$2/$file
+ else
+ file=${file%%/}
+ symlink_src_directory_inner "$1/$file" "$2/$file" "$rev/.."
+ fi
+ done
+}
+# Create a symlink-copy of directory $1 into $2
+# This function is recursive.
+#
+# $1: source directory (relative to $SRCDIR)
+# $2: destination directory (relative to $DSTDIR)
+symlink_src_directory ()
+{
+ symlink_src_directory_inner "$1" "$2" "$(reverse_path $1)"
+}
+
+# $1: library name
+# $2: functions list
+# $3: variables list
+# $4: destination file
+# $5: toolchain binprefix
+gen_shell_lib ()
+{
+ # Now generate a small C source file that contains similarly-named stubs
+ echo "/* Auto-generated file, do not edit */" > $TMPC
+ local func var
+ for func in $2; do
+ echo "void $func(void) {}" >> $TMPC
+ done
+ for var in $3; do
+ echo "int $var;" >> $TMPC
+ done
+
+ # Build it with our cross-compiler. It will complain about conflicting
+ # types for built-in functions, so just shut it up.
+ $5-gcc -Wl,-shared,-Bsymbolic -nostdlib -o $TMPO $TMPC 1>/dev/null 2>&1
+ if [ $? != 0 ] ; then
+ dump "ERROR: Can't generate shell library for: $1"
+ dump "See the content of $TMPC for details."
+ exit 1
+ fi
+
+ # Copy to our destination now
+ local libdir=$(dirname "$4")
+ mkdir -p "$libdir" && cp -f $TMPO "$4"
+ if [ $? != 0 ] ; then
+ dump "ERROR: Can't copy shell library for: $1"
+ dump "target location is: $4"
+ exit 1
+ fi
+}
+
+# $1: Architecture
+# $2: symbol source directory (relative to $SRCDIR)
+# $3: destination directory for generated libs (relative to $DSTDIR)
+gen_shell_libraries ()
+{
+ local ARCH=$1
+ local SYMDIR="$SRCDIR/$2"
+ local DSTDIR="$DSTDIR/$3"
+ local TOOLCHAIN_PREFIX funcs vars numfuncs numvars
+
+ # Let's locate the toolchain we're going to use
+ local TOOLCHAIN_PREFIX="$ANDROID_NDK_ROOT/$(get_default_toolchain_binprefix_for_arch $1)"
+ TOOLCHAIN_PREFIX=${TOOLCHAIN_PREFIX%-}
+ if [ ! -f "$TOOLCHAIN_PREFIX-readelf" ]; then
+ dump "ERROR: $ARCH toolchain not installed: $TOOLCHAIN_PREFIX-gcc"
+ exit 1
+ fi
+
+ # Let's list the libraries we're going to generate
+ LIBS=$((cd $SYMDIR && 2>/dev/null ls *.functions.txt) | sort -u | sed -e 's!\.functions\.txt$!!g')
+
+ for LIB in $LIBS; do
+ funcs=$(cat "$SYMDIR/$LIB.functions.txt")
+ vars=
+ if [ -f "$SYMDIR/$LIB.variables.txt" ]; then
+ vars=$(cat "$SYMDIR/$LIB.variables.txt")
+ fi
+ numfuncs=$(echo $funcs | wc -w)
+ numvars=$(echo $vars | wc -w)
+ log "Generating shell library for $LIB ($numfuncs functions + $numvars variables)"
+
+ gen_shell_lib $LIB "$funcs" "$vars" "$DSTDIR/$LIB" "$TOOLCHAIN_PREFIX"
+ done
+}
+
+# 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
+#
+rm -rf $DSTDIR/platforms && mkdir -p $DSTDIR/platforms
+PREV_PLATFORM_DST=
+for PLATFORM in $PLATFORMS; do
+ NEW_PLATFORM=platforms/android-$PLATFORM
+ PLATFORM_SRC=$NEW_PLATFORM
+ PLATFORM_DST=$NEW_PLATFORM
+ dump "Copying android-$PLATFORM platform files"
+ if [ -n "$PREV_PLATFORM_DST" ] ; then
+ if [ "$OPTION_NO_SYMLINKS" = "yes" ] ; then
+ log "Copying \$DST/$PREV_PLATFORM_DST to \$DST/$PLATFORM_DST"
+ #cp -r $DSTDIR/$PREV_PLATFORM_DST $DSTDIR/$PLATFORM_DST
+ copy_directory "$DSTDIR/$PREV_PLATFORM_DST" "$DSTDIR/$PLATFORM_DST"
+ else
+ log "Symlink-copying \$DST/$PREV_PLATFORM_DST to \$DST/$PLATFORM_DST"
+ symlink_src_directory $PREV_PLATFORM_DST $PLATFORM_DST
+ fi
+ if [ $? != 0 ] ; then
+ echo "ERROR: Could not copy previous sysroot to $DSTDIR/$NEW_PLATFORM"
+ exit 4
+ fi
+ fi
+ for ARCH in $ARCHS; do
+ SYSROOT=arch-$ARCH/usr
+ log "Copy $ARCH sysroot files from \$SRC/android-$PLATFORM over \$DST/android-$PLATFORM/arch-$ARCH"
+ copy_src_directory $PLATFORM_SRC/include $PLATFORM_DST/$SYSROOT/include "sysroot headers"
+ copy_src_directory $PLATFORM_SRC/arch-$ARCH/include $PLATFORM_DST/$SYSROOT/include "sysroot headers"
+ copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib $PLATFORM_DST/$SYSROOT/lib "sysroot libs"
+ copy_src_directory $PLATFORM_SRC/$SYSROOT $PLATFORM_DST/$SYSROOT "sysroot"
+
+ # Generate shell libraries from symbol files
+ gen_shell_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $PLATFORM_DST/$SYSROOT/lib
+ done
+ PREV_PLATFORM_DST=$PLATFORM_DST
+done
+
+if [ "$OPTION_NO_SAMPLES" = no ] ; then
+ # Copy platform samples and generic samples into your destination
+ #
+ # $SRC/samples/ --> $DST/samples/
+ # $SRC/android-$PLATFORM/samples/ --> $DST/samples
+ #
+ dump "Copying generic samples"
+ rm -rf $DSTDIR/samples && mkdir -p $DSTDIR/samples
+ copy_src_directory samples samples samples
+
+ for PLATFORM in $PLATFORMS; do
+ dump "Copy android-$PLATFORM samples"
+ # $SRC/platform-$PLATFORM/samples --> $DST/samples
+ copy_src_directory platforms/android-$PLATFORM/samples samples samples
+ done
+
+ # Cleanup generated files in samples
+ rm -rf "$DSTDIR/samples/*/obj"
+ rm -rf "$DSTDIR/samples/*/libs"
+fi
+
+log "Done !"