| #!/bin/sh |
| # |
| # Copyright (C) 2009-2010 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. |
| # |
| # This script is used to package complete Android NDK release packages. |
| # |
| # You will need prebuilt toolchain binary tarballs or a previous |
| # NDK release package to do that. |
| # |
| # See make-release.sh if you want to make a new release completely from |
| # scratch. |
| # |
| |
| . `dirname $0`/prebuilt-common.sh |
| |
| NDK_ROOT_DIR="$ANDROID_NDK_ROOT" |
| |
| # the list of platforms / API levels we want to package in |
| # this release. This can be overriden with the --platforms |
| # option, see below. |
| # |
| PLATFORMS="$API_LEVELS" |
| |
| # the default release name (use today's date) |
| RELEASE=`date +%Y%m%d` |
| register_var_option "--release=<name>" RELEASE "Specify release name" |
| |
| # the directory containing all prebuilts |
| PREBUILT_DIR= |
| register_var_option "--prebuilt-dir=<path>" PREBUILT_DIR "Specify prebuilt directory" |
| |
| # a prebuilt NDK archive (.zip file). empty means don't use any |
| PREBUILT_NDK= |
| register_var_option "--prebuilt-ndk=<file>" PREBUILT_NDK "Specify prebuilt ndk package" |
| |
| # the list of supported host development systems |
| SYSTEMS="linux-x86 darwin-x86 windows" |
| register_var_option "--systems=<list>" SYSTEMS "Specify host systems" |
| |
| # set to 'yes' if we should use 'git ls-files' to list the files to |
| # be copied into the archive. |
| NO_GIT=no |
| register_var_option "--no-git" NO_GIT "Don't use git to list input files, take all of them." |
| |
| # set of toolchain prebuilts we need to package |
| TOOLCHAINS="arm-eabi-4.4.0 arm-linux-androideabi-4.4.3" |
| register_var_option "--toolchains=<list>" TOOLCHAINS "Specify list of toolchains." |
| |
| # set of platforms to package (all by default) |
| register_var_option "--platforms=<list>" PLATFORMS "Specify API levels" |
| |
| # the package prefix |
| PREFIX=android-ndk |
| register_var_option "--prefix=<name>" PREFIX "Specify package prefix" |
| |
| # default location for generated packages |
| OUT_DIR=/tmp/ndk-release |
| OPTION_OUT_DIR= |
| register_var_option "--out-dir=<path>" OPTION_OUT_DIR "Specify output package directory" "$OUT_DIR" |
| |
| # Find the location of the platforms root directory |
| DEVELOPMENT_ROOT=`dirname $ANDROID_NDK_ROOT`/development/ndk |
| register_var_option "--development-root=<path>" DEVELOPMENT_ROOT "Specify platforms/samples directory" |
| |
| PROGRAM_PARAMETERS= |
| PROGRAM_DESCRIPTION=\ |
| "Package a new set of release packages for the Android NDK. |
| |
| You will need to have generated one or more prebuilt binary tarballs |
| with the build/tools/rebuild-all-prebuilts.sh script. These files should |
| be named like <toolname>-<system>.tar.bz2, where <toolname> is an arbitrary |
| tool name, and <system> is one of: $SYSTEMS |
| |
| Use the --prebuilt-dir=<path> option to build release packages from the |
| binary tarballs stored in <path>. |
| |
| Alternatively, you can use --prebuilt-ndk=<file> where <file> is the path |
| to a previous NDK release package. It will be used to extract the toolchain |
| binaries and copy them to your new release. Only use this for experimental |
| package releases. |
| |
| The generated release packages will be stored in a temporary directory that |
| will be printed at the end of the generation process. |
| " |
| |
| extract_parameters "$@" |
| |
| # Check the prebuilt path |
| # |
| if [ -n "$PREBUILT_NDK" -a -n "$PREBUILT_DIR" ] ; then |
| echo "ERROR: You cannot use both --prebuilt-ndk and --prebuilt-dir at the same time." |
| exit 1 |
| fi |
| |
| if [ -z "$PREBUILT_DIR" -a -z "$PREBUILT_NDK" ] ; then |
| echo "ERROR: You must use one of --prebuilt-dir or --prebuilt-ndk. See --help for details." |
| exit 1 |
| fi |
| |
| # Check the option directory. |
| if [ -n "$OPTION_OUT_DIR" ] ; then |
| OUT_DIR="$OPTION_OUT_DIR" |
| mkdir -p $OUT_DIR |
| if [ $? != 0 ] ; then |
| echo "ERROR: Could not create output directory: $OUT_DIR" |
| exit 1 |
| fi |
| else |
| rm -rf $OUT_DIR && mkdir -p $OUT_DIR |
| fi |
| |
| # Handle the prebuilt binaries now |
| # |
| if [ -n "$PREBUILT_DIR" ] ; then |
| if [ ! -d "$PREBUILT_DIR" ] ; then |
| echo "ERROR: the --prebuilt-dir argument is not a directory: $PREBUILT_DIR" |
| exit 1 |
| fi |
| if [ -z "$SYSTEMS" ] ; then |
| echo "ERROR: Your systems list is empty, use --systems=LIST to specify a different one." |
| exit 1 |
| fi |
| # Check the toolchain prebuilts |
| # |
| for TC in $TOOLCHAINS; do |
| for SYS in $SYSTEMS; do |
| if [ ! -f "$PREBUILT_DIR/$TC-$SYS.tar.bz2" ] ; then |
| echo "ERROR: Missing prebuilt file $TC-$SYS.tar.bz2 in: $PREBUILT_DIR" |
| exit 1 |
| fi |
| done |
| if [ ! -f "$PREBUILT_DIR/$TC-gdbserver.tar.bz2" ] ; then |
| echo "ERROR: Missing prebuilt file $TC-gdbserver.tar.bz2 in: $PREBUILT_DIR" |
| exit 1 |
| fi |
| done |
| else |
| if [ ! -f "$PREBUILT_NDK" ] ; then |
| echo "ERROR: the --prebuilt-ndk argument is not a file: $PREBUILT_NDK" |
| exit 1 |
| fi |
| # Check that the name ends with the proper host tag |
| HOST_NDK_SUFFIX="$HOST_TAG.zip" |
| echo "$PREBUILT_NDK" | grep -q "$HOST_NDK_SUFFIX" |
| fail_panic "The name of the prebuilt NDK must end in $HOST_NDK_SUFFIX" |
| SYSTEMS=$HOST_TAG |
| fi |
| |
| # The list of git files to copy into the archives |
| if [ "$NO_GIT" != "yes" ] ; then |
| echo "Collecting sources from git (use --no-git to copy all files instead)." |
| GIT_FILES=`cd $NDK_ROOT_DIR && git ls-files` |
| else |
| echo "Collecting all sources files under tree." |
| # Cleanup everything that is likely to not be part of the final NDK |
| # i.e. generated files... |
| rm -rf $NDK_ROOT_DIR/samples/*/obj |
| rm -rf $NDK_ROOT_DIR/samples/*/libs |
| # Get all files under the NDK root |
| GIT_FILES=`cd $NDK_ROOT_DIR && find .` |
| GIT_FILES=`echo $GIT_FILES | sed -e "s!\./!!g"` |
| fi |
| |
| # temporary directory used for packaging |
| TMPDIR=/tmp/ndk-release |
| |
| RELEASE_PREFIX=$PREFIX-$RELEASE |
| |
| # ensure that the generated files are ug+rx |
| umask 0022 |
| |
| rm -rf $TMPDIR && mkdir -p $TMPDIR |
| |
| echo "$TOOLCHAINS" | tr ' ' '\n' | grep -q x86 |
| if [ $? = 0 ] ; then |
| TRY_X86=yes |
| else |
| TRY_X86=no |
| fi |
| |
| # first create the reference ndk directory from the git reference |
| echo "Creating reference from source files" |
| REFERENCE=$TMPDIR/reference && rm -rf $REFERENCE/* && |
| copy_file_list "$NDK_ROOT_DIR" "$REFERENCE" "$GIT_FILES" && |
| rm -f $REFERENCE/Android.mk |
| fail_panic "Could not create reference. Aborting." |
| |
| # copy platform and sample files |
| echo "Copying platform and sample files" |
| FLAGS="--src-dir=$DEVELOPMENT_ROOT --dst-dir=$REFERENCE" |
| if [ "$VERBOSE2" = "yes" ] ; then |
| FLAGS="$FLAGS --verbose" |
| fi |
| PLATFORM_FLAGS= |
| if [ -n "$PLATFORMS" ] ; then |
| $NDK_ROOT_DIR/build/tools/build-platforms.sh $FLAGS --platform="$PLATFORMS" |
| else |
| $NDK_ROOT_DIR/build/tools/build-platforms.sh $FLAGS $PLATFORM_FLAGS |
| fi |
| fail_panic "Could not copy platform files. Aborting." |
| |
| # Remove leftovers, just in case... |
| rm -rf $REFERENCE/samples/*/{obj,libs,build.xml,local.properties,Android.mk} && |
| rm -rf $REFERENCE/tests/build/*/{obj,libs} && |
| rm -rf $REFERENCE/tests/device/*/{obj,libs} |
| |
| # copy sources files |
| if [ -d $DEVELOPMENT_ROOT/sources ] ; then |
| echo "Copying NDK sources files" |
| copy_file_list "$DEVELOPMENT_ROOT" "$REFERENCE" "sources" |
| fail_panic "Could not copy sources. Aborting." |
| fi |
| |
| # create a release file named 'RELEASE.TXT' containing the release |
| # name. This is used by the build script to detect whether you're |
| # invoking the NDK from a release package or from the development |
| # tree. |
| # |
| echo "$RELEASE" > $REFERENCE/RELEASE.TXT |
| |
| # Remove un-needed files |
| rm -f $REFERENCE/CleanSpec.mk |
| |
| # Unpack a prebuilt into the destination directory ($DSTDIR) |
| # $1: prebuilt name, relative to $PREBUILT_DIR |
| unpack_prebuilt () |
| { |
| local PREBUILT=$1 |
| echo "Unpacking $PREBUILT" |
| if [ -f "$PREBUILT_DIR/$PREBUILT" ] ; then |
| unpack_archive "$PREBUILT_DIR/$PREBUILT" "$DSTDIR" |
| fail_panic "Could not unpack prebuilt $PREBUILT. Aborting." |
| else |
| echo "WARNING: Could not find $PREBUILT in $PREBUILT_DIR" |
| fi |
| } |
| |
| # Special handling for libsupcxx, that's because the files are |
| # stored under toolchains/<name>/prebuilt/linux-x86/arm-linux-androideabi/ |
| # and we need to unpack them under toolchains/<name>/prebuilt/<system>/arm-linux-androideabi/ |
| # if we are not on linux-x86 |
| # $1: prebuilt name, relative to $PREBUILT_DIR |
| unpack_libsupcxx () |
| { |
| if [ $SYSTEM = linux-x86 ] ; then |
| unpack_prebuilt $1 |
| return |
| fi |
| local PREBUILT=$1 |
| echo "Unpacking $PREBUILT" |
| if [ -f "$PREBUILT_DIR/$PREBUILT" ] ; then |
| TMPUNPACKDIR=`random_temp_directory` |
| unpack_archive "$PREBUILT_DIR/$PREBUILT" "$TMPUNPACKDIR" |
| fail_panic "Could not unpack prebuilt $PREBUILT. Aborting." |
| (cd $TMPUNPACKDIR/toolchains/*/prebuilt && mv linux-x86 $SYSTEM) |
| fail_panic "Could not rename temp directory to $SYSTEM" |
| copy_directory $TMPUNPACKDIR "$DSTDIR" |
| rm -rf $TMPUNPACKDIR |
| else |
| echo "WARNING: Could not find $PREBUILT in $PREBUILT_DIR" |
| fi |
| } |
| |
| # $1: Source directory relative to |
| copy_prebuilt () |
| { |
| local SUBDIR="$1" |
| if [ -d "$1" ] ; then |
| echo "Copying: $SUBDIR" |
| copy_directory "$SUBDIR" "$DSTDIR/$2" |
| else |
| echo "Ignored: $SUBDIR" |
| fi |
| } |
| |
| # now, for each system, create a package |
| # |
| for SYSTEM in $SYSTEMS; do |
| echo "Preparing package for system $SYSTEM." |
| BIN_RELEASE=$RELEASE_PREFIX-$SYSTEM |
| DSTDIR=$TMPDIR/$RELEASE_PREFIX |
| rm -rf $DSTDIR && |
| copy_file_list "$REFERENCE" "$DSTDIR" "*" |
| fail_panic "Could not copy reference. Aborting." |
| |
| if [ -n "$PREBUILT_NDK" ] ; then |
| echo "Unpacking prebuilt toolchains from $PREBUILT_NDK" |
| UNZIP_DIR=$TMPDIR/prev-ndk |
| rm -rf $UNZIP_DIR && mkdir -p $UNZIP_DIR |
| fail_panic "Could not create temporary directory: $UNZIP_DIR" |
| unpack_archive "$PREBUILT_NDK" "$UNZIP_DIR" |
| fail_panic "Could not unzip NDK package $PREBUILT_NDK" |
| cd $UNZIP_DIR/android-ndk-* && cp -rP toolchains/* $DSTDIR/toolchains/ |
| fail_panic "Could not copy toolchain files from $PREBUILT_NDK" |
| |
| if [ -d "$DSTDIR/$STLPORT_SUBDIR" ] ; then |
| STLPORT_ABIS="armeabi armeabi-v7a x86" |
| cd $UNZIP_DIR/android-ndk-* |
| for STL_ABI in $STLPORT_ABIS; do |
| copy_prebuilt "$STLPORT_SUBDIR/libs/$STL_ABI" "$STLPORT_SUBDIR/libs" |
| done |
| copy_prebuilt "$GNUSTL_SUBDIR/include" "$GNUSTL_SUBDIR" |
| for STL_ABI in $STLPORT_ABIS; do |
| copy_prebuilt "$GNUSTL_SUBDIR/libs/$STL_ABI" "$GNUSTL_SUBDIR/libs" |
| done |
| else |
| echo "WARNING: Could not find STLport source tree!" |
| fi |
| else |
| for TC in $TOOLCHAINS; do |
| unpack_prebuilt $TC-$SYSTEM.tar.bz2 |
| echo "Removing sysroot for $TC" |
| rm -rf $DSTDIR/toolchains/$TC/prebuilt/$SYSTEM/sysroot |
| unpack_prebuilt $TC-gdbserver.tar.bz2 |
| done |
| unpack_libsupcxx gnu-libsupc++-armeabi.tar.bz2 |
| unpack_libsupcxx gnu-libsupc++-armeabi-v7a.tar.bz2 |
| if [ "$TRY_X86" = "yes" ] ; then |
| unpack_libsupcxx gnu-libsupc++-x86.tar.bz2 |
| fi |
| unpack_prebuilt stlport-libs-armeabi.tar.bz2 |
| unpack_prebuilt stlport-libs-armeabi-v7a.tar.bz2 |
| if [ "$TRY_X86" = "yes" ] ; then |
| unpack_prebuilt stlport-prebuilt-x86.tar.bz2 |
| fi |
| unpack_prebuilt gnu-libstdc++-headers.tar.bz2 |
| unpack_prebuilt gnu-libstdc++-libs-armeabi.tar.bz2 |
| unpack_prebuilt gnu-libstdc++-libs-armeabi-v7a.tar.bz2 |
| if [ "$TRY_X86" = "yes" ] ; then |
| unpack_prebuilt gnu-libstdc++-libs-x86.tar.bz2 |
| fi |
| fi |
| |
| # Create an archive for the final package. Extension depends on the |
| # host system. |
| case "$SYSTEM" in |
| windows) |
| ARCHIVE="$BIN_RELEASE.zip" |
| ;; |
| *) |
| ARCHIVE="$BIN_RELEASE.tar.bz2" |
| ;; |
| esac |
| echo "Creating $ARCHIVE" |
| pack_archive "$OUT_DIR/$ARCHIVE" "$TMPDIR" "$RELEASE_PREFIX" |
| fail_panic "Could not create archive: $OUT_DIR/$ARCHIVE" |
| # chmod a+r $TMPDIR/$ARCHIVE |
| done |
| |
| echo "Cleaning up." |
| rm -rf $TMPDIR/reference |
| rm -rf $TMPDIR/prev-ndk |
| |
| echo "Done, please see packages in $OUT_DIR:" |
| ls -l $OUT_DIR |