842 lines
31 KiB
Bash
Executable file
842 lines
31 KiB
Bash
Executable file
#!/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.
|
|
#
|
|
# gen-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 shared 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..
|
|
#
|
|
|
|
PROGDIR=$(dirname "$0")
|
|
. "$PROGDIR/prebuilt-common.sh"
|
|
|
|
# Return the list of platform supported from $1/platforms
|
|
# as a single space-separated sorted list of levels. (e.g. "3 4 5 8 9 14")
|
|
# $1: source directory
|
|
extract_platforms_from ()
|
|
{
|
|
if [ -d "$1" ] ; then
|
|
(cd "$1/platforms" && ls -d android-*) | sed -e "s!android-!!" | sort -g | tr '\n' ' '
|
|
else
|
|
echo ""
|
|
fi
|
|
}
|
|
|
|
# Override tmp file to be predictable
|
|
TMPC=$TMPDIR/tmp/tests/tmp-platform.c
|
|
TMPO=$TMPDIR/tmp/tests/tmp-platform.o
|
|
TMPE=$TMPDIR/tmp/tests/tmp-platform$EXE
|
|
|
|
SRCDIR="../development/ndk"
|
|
DSTDIR="$TMPDIR"
|
|
|
|
ARCHS="$DEFAULT_ARCHS"
|
|
PLATFORMS=`extract_platforms_from "$SRCDIR"`
|
|
NDK_DIR=$ANDROID_NDK_ROOT
|
|
|
|
OPTION_HELP=no
|
|
OPTION_PLATFORMS=
|
|
OPTION_SRCDIR=
|
|
OPTION_DSTDIR=
|
|
OPTION_FAST_COPY=
|
|
OPTION_MINIMAL=
|
|
OPTION_ARCH=
|
|
OPTION_ABI=
|
|
OPTION_DEBUG_LIBS=
|
|
OPTION_OVERLAY=
|
|
OPTION_GCC_VERSION="default"
|
|
OPTION_LLVM_VERSION=$DEFAULT_LLVM_VERSION
|
|
OPTION_CASE_INSENSITIVE=no
|
|
PACKAGE_DIR=
|
|
|
|
VERBOSE=no
|
|
|
|
for opt do
|
|
optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'`
|
|
case "$opt" in
|
|
--help|-h|-\?) OPTION_HELP=yes
|
|
;;
|
|
--verbose)
|
|
VERBOSE=yes
|
|
;;
|
|
--src-dir=*)
|
|
OPTION_SRCDIR="$optarg"
|
|
;;
|
|
--dst-dir=*)
|
|
OPTION_DSTDIR="$optarg"
|
|
;;
|
|
--ndk-dir=*)
|
|
NDK_DIR=$optarg
|
|
;;
|
|
--platform=*)
|
|
OPTION_PLATFORM=$optarg
|
|
;;
|
|
--arch=*)
|
|
OPTION_ARCH=$optarg
|
|
;;
|
|
--abi=*) # We still support this for backwards-compatibility
|
|
OPTION_ABI=$optarg
|
|
;;
|
|
--fast-copy)
|
|
OPTION_FAST_COPY=yes
|
|
;;
|
|
--minimal)
|
|
OPTION_MINIMAL=yes
|
|
;;
|
|
--package-dir=*)
|
|
PACKAGE_DIR=$optarg
|
|
;;
|
|
--debug-libs)
|
|
OPTION_DEBUG_LIBS=true
|
|
;;
|
|
--overlay)
|
|
OPTION_OVERLAY=true
|
|
;;
|
|
--gcc-version=*)
|
|
OPTION_GCC_VERSION=$optarg
|
|
;;
|
|
--llvm-version=*)
|
|
OPTION_LLVM_VERSION=$optarg
|
|
;;
|
|
--case-insensitive)
|
|
OPTION_CASE_INSENSITIVE=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 " --ndk-dir=<path> Use toolchains from this NDK directory [$NDK_DIR]"
|
|
echo " --platform=<list> List of API levels [$PLATFORMS]"
|
|
echo " --arch=<list> List of CPU architectures [$ARCHS]"
|
|
echo " --minimal Ignore symlinks and generated shared libs."
|
|
echo " --fast-copy Don't create symlinks, copy files instead"
|
|
echo " --package-dir=<path> Package platforms archive in specific path."
|
|
echo " --debug-libs Also generate C source file for generated libraries."
|
|
echo ""
|
|
echo "Use the --minimal flag if you want to generate minimal sysroot directories"
|
|
echo "that will be used to generate prebuilt toolchains. Otherwise, the script"
|
|
echo "will require these toolchains to be pre-installed and will use them to"
|
|
echo "generate shared system shared libraries from the symbol list files."
|
|
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
|
|
|
|
if [ "$OPTION_MINIMAL" ]; then
|
|
OPTION_FAST_COPY=yes
|
|
fi
|
|
|
|
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")
|
|
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)"
|
|
}
|
|
|
|
# Remove unwanted symbols
|
|
# $1: symbol file (one symbol per line)
|
|
# $2+: Input symbol list
|
|
# Out: Input symbol file, without any unwanted symbol listed by $1
|
|
remove_unwanted_symbols_from ()
|
|
{
|
|
local SYMBOL_FILE="$1"
|
|
shift
|
|
if [ -f "$SYMBOL_FILE" ]; then
|
|
echo "$@" | tr ' ' '\n' | grep -v -F -x -f $SYMBOL_FILE | tr '\n' ' '
|
|
else
|
|
echo "$@"
|
|
fi
|
|
}
|
|
|
|
# Remove unwanted symbols from a library's functions list.
|
|
# $1: Architecture name
|
|
# $2: Library name (e.g. libc.so)
|
|
# $3+: Input symbol list
|
|
# Out: Input symbol list without any unwanted symbols.
|
|
remove_unwanted_function_symbols ()
|
|
{
|
|
local ARCH LIBRARY SYMBOL_FILE
|
|
ARCH=$1
|
|
LIBRARY=$2
|
|
shift; shift
|
|
SYMBOL_FILE=$PROGDIR/unwanted-symbols/$ARCH/$LIBRARY.functions.txt
|
|
remove_unwanted_symbols_from $SYMBOL_FILE "$@"
|
|
}
|
|
|
|
# Same as remove_unwanted_functions_symbols, but for variable names.
|
|
#
|
|
remove_unwanted_variable_symbols ()
|
|
{
|
|
local ARCH LIBRARY SYMBOL_FILE
|
|
ARCH=$1
|
|
LIBRARY=$2
|
|
shift; shift
|
|
SYMBOL_FILE=$PROGDIR/unwanted-symbols/$ARCH/$LIBRARY.variables.txt
|
|
remove_unwanted_symbols_from $SYMBOL_FILE "$@"
|
|
}
|
|
|
|
# $1: Architecture
|
|
# Out: compiler command
|
|
get_default_compiler_for_arch()
|
|
{
|
|
local ARCH=$1
|
|
local TOOLCHAIN_PREFIX CC GCC_VERSION
|
|
|
|
if [ -n "$OPTION_GCC_VERSION" -a "$OPTION_GCC_VERSION" != "default" ]; then
|
|
GCC_VERSION=$OPTION_GCC_VERSION
|
|
else
|
|
GCC_VERSION=$(get_default_gcc_version_for_arch $ARCH)
|
|
fi
|
|
|
|
for TAG in $HOST_TAG $HOST_TAG32; do
|
|
TOOLCHAIN_PREFIX="$ANDROID_BUILD_TOP/prebuilts/ndk/current/$(get_toolchain_binprefix_for_arch $ARCH $GCC_VERSION $TAG)"
|
|
TOOLCHAIN_PREFIX=${TOOLCHAIN_PREFIX%-}
|
|
CC="$TOOLCHAIN_PREFIX-gcc"
|
|
if [ -f "$CC" ]; then
|
|
break;
|
|
fi
|
|
done
|
|
|
|
if [ ! -f "$CC" ]; then
|
|
dump "ERROR: $ARCH toolchain not installed: $CC"
|
|
dump "Important: Use the --minimal flag to use this script without generated system shared libraries."
|
|
dump "This is generally useful when you want to generate the host cross-toolchain programs."
|
|
exit 1
|
|
fi
|
|
echo "$CC"
|
|
}
|
|
|
|
# $1: library name
|
|
# $2: functions list
|
|
# $3: variables list
|
|
# $4: destination file
|
|
# $5: compiler command
|
|
# $6: version script (optional)
|
|
gen_shared_lib ()
|
|
{
|
|
local LIBRARY=$1
|
|
local FUNCS="$2"
|
|
local VARS="$3"
|
|
local DSTFILE="$4"
|
|
local CC="$5"
|
|
local VERSION_SCRIPT="$6"
|
|
|
|
# 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 $FUNCS; do
|
|
echo "void $func(void) {}" >> $TMPC
|
|
done
|
|
for var in $VARS; do
|
|
echo "int $var = 0;" >> $TMPC
|
|
done
|
|
|
|
# Build it with our cross-compiler. It will complain about conflicting
|
|
# types for built-in functions, so just shut it up.
|
|
COMMAND="$CC -Wl,-shared,-Bsymbolic -Wl,-soname,$LIBRARY -nostdlib -o $TMPO $TMPC -Wl,--exclude-libs,libgcc.a -w"
|
|
if [ -n "$VERSION_SCRIPT" ]; then
|
|
COMMAND="$COMMAND -Wl,--version-script=$VERSION_SCRIPT -Wl,--no-undefined-version"
|
|
fi
|
|
echo "## COMMAND: $COMMAND"
|
|
$COMMAND
|
|
if [ $? != 0 ] ; then
|
|
dump "ERROR: Can't generate shared library for: $LIBRARY"
|
|
dump "See the content of $TMPC for details."
|
|
exit 1
|
|
fi
|
|
|
|
# Copy to our destination now
|
|
local libdir=$(dirname "$DSTFILE")
|
|
mkdir -p "$libdir" && rm -f "$DSTFILE" && cp -f $TMPO "$DSTFILE"
|
|
if [ $? != 0 ] ; then
|
|
dump "ERROR: Can't copy shared library for: $LIBRARY"
|
|
dump "target location is: $DSTFILE"
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$OPTION_DEBUG_LIBS" ]; then
|
|
cp $TMPC $DSTFILE.c
|
|
echo "$FUNCS" | tr ' ' '\n' > $DSTFILE.functions.txt
|
|
echo "$VARS" | tr ' ' '\n' > $DSTFILE.variables.txt
|
|
fi
|
|
}
|
|
|
|
# $1: Architecture
|
|
# $2: symbol source directory (relative to $SRCDIR)
|
|
# $3: destination directory for generated libs (relative to $DSTDIR)
|
|
# $4: compiler flags (optional)
|
|
gen_shared_libraries ()
|
|
{
|
|
local ARCH=$1
|
|
local SYMDIR="$SRCDIR/$2"
|
|
local DSTDIR="$DSTDIR/$3"
|
|
local FLAGS="$4"
|
|
local CC funcs vars numfuncs numvars
|
|
|
|
# Let's locate the toolchain we're going to use
|
|
CC=$(get_default_compiler_for_arch $ARCH)" $FLAGS"
|
|
if [ $? != 0 ]; then
|
|
echo $CC
|
|
exit 1
|
|
fi
|
|
|
|
# In certain cases, the symbols directory doesn't exist,
|
|
# e.g. on x86 for PLATFORM < 9
|
|
if [ ! -d "$SYMDIR" ]; then
|
|
return
|
|
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" 2>/dev/null)
|
|
vars=$(cat "$SYMDIR/$LIB.variables.txt" 2>/dev/null)
|
|
funcs=$(remove_unwanted_function_symbols $ARCH libgcc.a $funcs)
|
|
funcs=$(remove_unwanted_function_symbols $ARCH $LIB $funcs)
|
|
vars=$(remove_unwanted_variable_symbols $ARCH libgcc.a $vars)
|
|
vars=$(remove_unwanted_variable_symbols $ARCH $LIB $vars)
|
|
numfuncs=$(echo $funcs | wc -w)
|
|
numvars=$(echo $vars | wc -w)
|
|
version_script=""
|
|
|
|
if [ -f "$SYMDIR/$LIB.versions.txt" ]; then
|
|
version_script="$SYMDIR/$LIB.versions.txt"
|
|
fi
|
|
log "Generating $ARCH shared library for $LIB ($numfuncs functions + $numvars variables)"
|
|
|
|
gen_shared_lib $LIB "$funcs" "$vars" "$DSTDIR/$LIB" "$CC" "$version_script"
|
|
done
|
|
}
|
|
|
|
# $1: platform number
|
|
# $2: architecture name
|
|
# $3: common source directory (for crtbrand.c, etc)
|
|
# $4: source directory (for *.S files)
|
|
# $5: destination directory
|
|
# $6: flags for compiler (optional)
|
|
gen_crt_objects ()
|
|
{
|
|
local API=$1
|
|
local ARCH=$2
|
|
local COMMON_SRC_DIR="$SRCDIR/$3"
|
|
local SRC_DIR="$SRCDIR/$4"
|
|
local DST_DIR="$DSTDIR/$5"
|
|
local FLAGS="$6"
|
|
local SRC_FILE DST_FILE
|
|
local CC
|
|
|
|
if [ ! -d "$SRC_DIR" ]; then
|
|
return
|
|
fi
|
|
|
|
# Let's locate the toolchain we're going to use
|
|
CC=$(get_default_compiler_for_arch $ARCH)" $FLAGS"
|
|
if [ $? != 0 ]; then
|
|
echo $CC
|
|
exit 1
|
|
fi
|
|
|
|
CRTBRAND_S=$DST_DIR/crtbrand.s
|
|
log "Generating platform $API crtbrand assembly code: $CRTBRAND_S"
|
|
(cd "$COMMON_SRC_DIR" && mkdir -p `dirname $CRTBRAND_S` && $CC -DPLATFORM_SDK_VERSION=$API -fpic -S -o - crtbrand.c | \
|
|
sed -e '/\.note\.ABI-tag/s/progbits/note/' > "$CRTBRAND_S")
|
|
if [ $? != 0 ]; then
|
|
dump "ERROR: Could not generate $CRTBRAND_S from $COMMON_SRC_DIR/crtbrand.c"
|
|
exit 1
|
|
fi
|
|
|
|
for SRC_FILE in $(cd "$SRC_DIR" && ls crt*.[cS]); do
|
|
DST_FILE=${SRC_FILE%%.c}
|
|
DST_FILE=${DST_FILE%%.S}.o
|
|
|
|
case "$DST_FILE" in
|
|
"crtend.o")
|
|
# Special case: crtend.S must be compiled as crtend_android.o
|
|
# This is for long historical reasons, i.e. to avoid name conflicts
|
|
# in the past with other crtend.o files. This is hard-coded in the
|
|
# Android toolchain configuration, so switch the name here.
|
|
DST_FILE=crtend_android.o
|
|
;;
|
|
"crtbegin_dynamic.o"|"crtbegin_static.o")
|
|
# Add .note.ABI-tag section
|
|
SRC_FILE=$SRC_FILE" $CRTBRAND_S"
|
|
;;
|
|
"crtbegin.o")
|
|
# If we have a single source for both crtbegin_static.o and
|
|
# crtbegin_dynamic.o we generate one and make a copy later.
|
|
DST_FILE=crtbegin_dynamic.o
|
|
# Add .note.ABI-tag section
|
|
SRC_FILE=$SRC_FILE" $CRTBRAND_S"
|
|
;;
|
|
esac
|
|
|
|
log "Generating $ARCH C runtime object: $DST_FILE"
|
|
(cd "$SRC_DIR" && $CC \
|
|
-I$SRCDIR/../../bionic/libc/include \
|
|
-I$SRCDIR/../../bionic/libc/arch-common/bionic \
|
|
-I$SRCDIR/../../bionic/libc/arch-$ARCH/include \
|
|
-DPLATFORM_SDK_VERSION=$API \
|
|
-O2 -fpic -Wl,-r -nostdlib -o "$DST_DIR/$DST_FILE" $SRC_FILE)
|
|
if [ $? != 0 ]; then
|
|
dump "ERROR: Could not generate $DST_FILE from $SRC_DIR/$SRC_FILE"
|
|
exit 1
|
|
fi
|
|
if [ ! -s "$DST_DIR/crtbegin_static.o" ]; then
|
|
cp "$DST_DIR/crtbegin_dynamic.o" "$DST_DIR/crtbegin_static.o"
|
|
fi
|
|
done
|
|
rm -f "$CRTBRAND_S"
|
|
}
|
|
|
|
# $1: platform number
|
|
# $2: architecture
|
|
# $3: target NDK directory
|
|
generate_api_level ()
|
|
{
|
|
local API=$1
|
|
local ARCH=$2
|
|
local HEADER="platforms/android-$API/arch-$ARCH/usr/include/android/api-level.h"
|
|
log "Generating: $HEADER"
|
|
rm -f "$3/$HEADER" # Remove symlink if any.
|
|
cat > "$3/$HEADER" <<EOF
|
|
/*
|
|
* Copyright (C) 2008 The Android Open Source Project
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in
|
|
* the documentation and/or other materials provided with the
|
|
* distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*/
|
|
#ifndef ANDROID_API_LEVEL_H
|
|
#define ANDROID_API_LEVEL_H
|
|
|
|
#define __ANDROID_API__ $API
|
|
|
|
#endif /* ANDROID_API_LEVEL_H */
|
|
EOF
|
|
}
|
|
|
|
# Copy platform sysroot into your destination
|
|
#
|
|
|
|
# if $SRC/android-$PLATFORM/arch-$ARCH exists
|
|
# $SRC/android-$PLATFORM/include --> $DST/android-$PLATFORM/arch-$ARCH/usr/include
|
|
# $SRC/android-$PLATFORM/arch-$ARCH/include --> $DST/android-$PLATFORM/arch-$ARCH/usr/include
|
|
# $SRC/android-$PLATFORM/arch-$ARCH/lib --> $DST/android-$PLATFORM/arch-$ARCH/usr/lib
|
|
#
|
|
if [ -z "$OPTION_OVERLAY" ]; then
|
|
rm -rf $DSTDIR/platforms && mkdir -p $DSTDIR/platforms
|
|
fi
|
|
for ARCH in $ARCHS; do
|
|
echo "## Generating arch: $ARCH"
|
|
# Find first platform for this arch
|
|
PREV_SYSROOT_DST=
|
|
PREV_PLATFORM_SRC_ARCH=
|
|
LIBDIR=$(get_default_libdir_for_arch $ARCH)
|
|
|
|
for PLATFORM in $PLATFORMS; do
|
|
echo "## Generating platform: $PLATFORM"
|
|
PLATFORM_DST=platforms/android-$PLATFORM # Relative to $DSTDIR
|
|
PLATFORM_SRC=$PLATFORM_DST # Relative to $SRCDIR
|
|
SYSROOT_DST=$PLATFORM_DST/arch-$ARCH/usr
|
|
# Skip over if there is no arch-specific file for this platform
|
|
# and no destination platform directory was created. This is needed
|
|
# because x86 and MIPS don't have files for API levels 3-8.
|
|
if [ -z "$PREV_SYSROOT_DST" -a \
|
|
! -d "$SRCDIR/$PLATFORM_SRC/arch-$ARCH" ]; then
|
|
log "Skipping: \$SRC/$PLATFORM_SRC/arch-$ARCH"
|
|
continue
|
|
fi
|
|
|
|
log "Populating \$DST/platforms/android-$PLATFORM/arch-$ARCH"
|
|
|
|
# If this is not the first destination directory, copy over, or
|
|
# symlink the files from the previous one now.
|
|
if [ "$PREV_SYSROOT_DST" ]; then
|
|
if [ "$OPTION_FAST_COPY" ]; then
|
|
log "Copying \$DST/$PREV_SYSROOT_DST to \$DST/$SYSROOT_DST"
|
|
copy_directory "$DSTDIR/$PREV_SYSROOT_DST" "$DSTDIR/$SYSROOT_DST"
|
|
else
|
|
log "Symlink-copying \$DST/$PREV_SYSROOT_DST to \$DST/$SYSROOT_DST"
|
|
symlink_src_directory $PREV_SYSROOT_DST $SYSROOT_DST
|
|
fi
|
|
fi
|
|
|
|
# If this is the first destination directory, copy the common
|
|
# files from previous platform directories into this one.
|
|
# This helps copy the common headers from android-3 to android-8
|
|
# into the x86 and mips android-9 directories.
|
|
if [ -z "$PREV_SYSROOT_DST" ]; then
|
|
for OLD_PLATFORM in $PLATFORMS; do
|
|
if [ "$OLD_PLATFORM" = "$PLATFORM" ]; then
|
|
break
|
|
fi
|
|
copy_src_directory platforms/android-$OLD_PLATFORM/include \
|
|
$SYSROOT_DST/include \
|
|
"common android-$OLD_PLATFORM headers"
|
|
done
|
|
fi
|
|
|
|
# There are two set of bionic headers: the original ones haven't been updated since
|
|
# gingerbread except for bug fixing, and the new ones in android-$FIRST_API64_LEVEL
|
|
# with 64-bit support. Before the old bionic headers are deprecated/removed, we need
|
|
# to remove stale old headers when createing platform = $FIRST_API64_LEVEL
|
|
if [ "$PLATFORM" = "$FIRST_API64_LEVEL" ]; then
|
|
log "Removing stale bionic headers in \$DST/$SYSROOT_DST/include"
|
|
nonbionic_files="android EGL GLES GLES2 GLES3 KHR media OMXAL SLES jni.h thread_db.h zconf.h zlib.h"
|
|
if [ -d "$DSTDIR/$SYSROOT_DST/include/" ]; then
|
|
files=$(cd "$DSTDIR/$SYSROOT_DST/include/" && ls)
|
|
for file in $files; do
|
|
if [ "$nonbionic_files" = "${nonbionic_files%%${file}*}" ]; then
|
|
rm -rf "$DSTDIR/$SYSROOT_DST/include/$file"
|
|
fi
|
|
done
|
|
fi
|
|
fi
|
|
|
|
# Now copy over all non-arch specific include files
|
|
copy_src_directory $PLATFORM_SRC/include $SYSROOT_DST/include "common system headers"
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/include $SYSROOT_DST/include "$ARCH system headers"
|
|
|
|
generate_api_level "$PLATFORM" "$ARCH" "$DSTDIR"
|
|
|
|
# If --minimal is not used, copy or generate binary files.
|
|
if [ -z "$OPTION_MINIMAL" ]; then
|
|
# Copy the prebuilt static libraries. We need full set for multilib compiler for some arch
|
|
case "$ARCH" in
|
|
x86_64)
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib $SYSROOT_DST/lib "x86 sysroot libs"
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib64 $SYSROOT_DST/lib64 "x86_64 sysroot libs"
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/libx32 $SYSROOT_DST/libx32 "x32 sysroot libs"
|
|
;;
|
|
mips64)
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib $SYSROOT_DST/lib "mips -mabi=32 -mips32 sysroot libs"
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/libr2 $SYSROOT_DST/libr2 "mips -mabi=32 -mips32r2 sysroot libs"
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/libr6 $SYSROOT_DST/libr6 "mips -mabi=32 -mips32r6 sysroot libs"
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib64r2 $SYSROOT_DST/lib64r2 "mips -mabi=64 -mips64r2 sysroot libs"
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib64 $SYSROOT_DST/lib64 "mips -mabi=64 -mips64r6 sysroot libs"
|
|
;;
|
|
mips)
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib $SYSROOT_DST/lib "mips -mabi=32 -mips32 sysroot libs"
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/libr2 $SYSROOT_DST/libr2 "mips -mabi=32 -mips32r2 sysroot libs"
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/libr6 $SYSROOT_DST/libr6 "mips -mabi=32 -mips32r6 sysroot libs"
|
|
;;
|
|
*)
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/$LIBDIR $SYSROOT_DST/$LIBDIR "$ARCH sysroot libs"
|
|
;;
|
|
esac
|
|
|
|
# Generate C runtime object files when available
|
|
PLATFORM_SRC_ARCH=$PLATFORM_SRC/arch-$ARCH/src
|
|
if [ ! -d "$SRCDIR/$PLATFORM_SRC_ARCH" ]; then
|
|
PLATFORM_SRC_ARCH=$PREV_PLATFORM_SRC_ARCH
|
|
else
|
|
PREV_PLATFORM_SRC_ARCH=$PLATFORM_SRC_ARCH
|
|
fi
|
|
|
|
# Genreate crt objects
|
|
case "$ARCH" in
|
|
x86_64)
|
|
gen_crt_objects $PLATFORM $ARCH platforms/common/src $PLATFORM_SRC_ARCH $SYSROOT_DST/lib "-m32"
|
|
gen_crt_objects $PLATFORM $ARCH platforms/common/src $PLATFORM_SRC_ARCH $SYSROOT_DST/lib64 "-m64"
|
|
gen_crt_objects $PLATFORM $ARCH platforms/common/src $PLATFORM_SRC_ARCH $SYSROOT_DST/libx32 "-mx32"
|
|
;;
|
|
mips64)
|
|
gen_crt_objects $PLATFORM $ARCH platforms/common/src $PLATFORM_SRC_ARCH $SYSROOT_DST/lib "-mabi=32 -mips32"
|
|
gen_crt_objects $PLATFORM $ARCH platforms/common/src $PLATFORM_SRC_ARCH $SYSROOT_DST/libr2 "-mabi=32 -mips32r2"
|
|
gen_crt_objects $PLATFORM $ARCH platforms/common/src $PLATFORM_SRC_ARCH $SYSROOT_DST/libr6 "-mabi=32 -mips32r6"
|
|
gen_crt_objects $PLATFORM $ARCH platforms/common/src $PLATFORM_SRC_ARCH $SYSROOT_DST/lib64r2 "-mabi=64 -mips64r2"
|
|
gen_crt_objects $PLATFORM $ARCH platforms/common/src $PLATFORM_SRC_ARCH $SYSROOT_DST/lib64 "-mabi=64 -mips64r6"
|
|
;;
|
|
mips)
|
|
gen_crt_objects $PLATFORM $ARCH platforms/common/src $PLATFORM_SRC_ARCH $SYSROOT_DST/lib "-mabi=32 -mips32"
|
|
gen_crt_objects $PLATFORM $ARCH platforms/common/src $PLATFORM_SRC_ARCH $SYSROOT_DST/libr2 "-mabi=32 -mips32r2"
|
|
gen_crt_objects $PLATFORM $ARCH platforms/common/src $PLATFORM_SRC_ARCH $SYSROOT_DST/libr6 "-mabi=32 -mips32r6"
|
|
;;
|
|
*)
|
|
gen_crt_objects $PLATFORM $ARCH platforms/common/src $PLATFORM_SRC_ARCH $SYSROOT_DST/$LIBDIR
|
|
;;
|
|
esac
|
|
|
|
# Generate shared libraries from symbol files
|
|
case "$ARCH" in
|
|
x86_64)
|
|
gen_shared_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $SYSROOT_DST/lib "-m32"
|
|
gen_shared_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $SYSROOT_DST/lib64 "-m64"
|
|
gen_shared_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $SYSROOT_DST/libx32 "-mx32"
|
|
;;
|
|
mips64)
|
|
gen_shared_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $SYSROOT_DST/lib "-mabi=32 -mips32"
|
|
gen_shared_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $SYSROOT_DST/libr2 "-mabi=32 -mips32r2"
|
|
gen_shared_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $SYSROOT_DST/libr6 "-mabi=32 -mips32r6"
|
|
gen_shared_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $SYSROOT_DST/lib64r2 "-mabi=64 -mips64r2"
|
|
gen_shared_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $SYSROOT_DST/lib64 "-mabi=64 -mips64r6"
|
|
;;
|
|
mips)
|
|
gen_shared_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $SYSROOT_DST/lib "-mabi=32 -mips32"
|
|
gen_shared_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $SYSROOT_DST/libr2 "-mabi=32 -mips32r2"
|
|
gen_shared_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $SYSROOT_DST/libr6 "-mabi=32 -mips32r6"
|
|
;;
|
|
*)
|
|
gen_shared_libraries $ARCH $PLATFORM_SRC/arch-$ARCH/symbols $SYSROOT_DST/$LIBDIR
|
|
;;
|
|
esac
|
|
else
|
|
# Copy the prebuilt binaries to bootstrap GCC
|
|
case "$ARCH" in
|
|
x86_64)
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib-bootstrap/lib $SYSROOT_DST/lib "x86 sysroot libs (boostrap)"
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib-bootstrap/lib64 $SYSROOT_DST/lib64 "x86_64 sysroot libs (boostrap)"
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib-bootstrap/libx32 $SYSROOT_DST/libx32 "x32 sysroot libs (boostrap)"
|
|
;;
|
|
mips64)
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib-bootstrap/lib $SYSROOT_DST/lib "mips -mabi=32 -mips32 sysroot libs (boostrap)"
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib-bootstrap/libr2 $SYSROOT_DST/libr2 "mips -mabi=32 -mips32r2 sysroot libs (boostrap)"
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib-bootstrap/libr6 $SYSROOT_DST/libr6 "mips -mabi=32 -mips32r6 sysroot libs (boostrap)"
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib-bootstrap/lib64r2 $SYSROOT_DST/lib64r2 "mips -mabi=64 -mips64r2 sysroot libs (boostrap)"
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib-bootstrap/lib64 $SYSROOT_DST/lib64 "mips -mabi=64 -mips64r6 sysroot libs (boostrap)"
|
|
;;
|
|
mips)
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib-bootstrap/lib $SYSROOT_DST/lib "mips -mabi=32 -mips32 sysroot libs (boostrap)"
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib-bootstrap/libr2 $SYSROOT_DST/libr2 "mips -mabi=32 -mips32r2 sysroot libs (boostrap)"
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib-bootstrap/libr6 $SYSROOT_DST/libr6 "mips -mabi=32 -mips32r6 sysroot libs (boostrap)"
|
|
;;
|
|
*)
|
|
copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib-bootstrap $SYSROOT_DST/$LIBDIR "$ARCH sysroot libs (boostrap)"
|
|
;;
|
|
esac
|
|
fi
|
|
PREV_SYSROOT_DST=$SYSROOT_DST
|
|
done
|
|
done
|
|
|
|
if [ "$PACKAGE_DIR" ]; then
|
|
# Remove "duplicate" files for case-insensitive platforms.
|
|
if [ "$OPTION_CASE_INSENSITIVE" = "yes" ]; then
|
|
find "$DSTDIR/platforms" | sort -f | uniq -di | xargs rm
|
|
fi
|
|
|
|
for PLATFORM in $PLATFORMS; do
|
|
PLATFORM_NAME="android-$PLATFORM"
|
|
make_repo_prop "$DSTDIR/platforms/$PLATFORM_NAME"
|
|
|
|
NOTICE="$DSTDIR/platforms/$PLATFORM_NAME/NOTICE"
|
|
cp "$ANDROID_BUILD_TOP/bionic/libc/NOTICE" $NOTICE
|
|
echo >> $NOTICE
|
|
cp "$ANDROID_BUILD_TOP/bionic/libm/NOTICE" $NOTICE
|
|
echo >> $NOTICE
|
|
cp "$ANDROID_BUILD_TOP/bionic/libdl/NOTICE" $NOTICE
|
|
echo >> $NOTICE
|
|
cp "$ANDROID_BUILD_TOP/bionic/libstdc++/NOTICE" $NOTICE
|
|
|
|
mkdir -p "$PACKAGE_DIR"
|
|
fail_panic "Could not create package directory: $PACKAGE_DIR"
|
|
ARCHIVE=platform-$PLATFORM.zip
|
|
dump "Packaging $ARCHIVE"
|
|
pack_archive "$PACKAGE_DIR/$ARCHIVE" "$DSTDIR/platforms" "$PLATFORM_NAME"
|
|
fail_panic "Could not package platform-$PLATFORM"
|
|
done
|
|
fi
|
|
|
|
log "Done !"
|