| #!/bin/sh |
| # |
| # Copyright (C) 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. |
| # |
| |
| # Download and rebuild all prebuilt binaries for the Android NDK |
| # This includes: |
| # - cross toolchains (gcc, ld, gdb, etc...) |
| # - target-specific gdbserver |
| # - host ccache |
| # |
| |
| . `dirname $0`/prebuilt-common.sh |
| PROGDIR=`dirname $0` |
| |
| NDK_DIR= |
| register_var_option "--ndk-dir=<path>" NDK_DIR "Don't package, copy binaries to target NDK directory" |
| |
| BUILD_DIR=`random_temp_directory` |
| register_var_option "--build-dir=<path>" BUILD_DIR "Specify temporary build directory" "/tmp/<random>" |
| |
| GDB_VERSION=6.6 |
| register_var_option "--gdb-version=<version>" GDB_VERSION "Specify gdb version" |
| |
| OPTION_TOOLCHAIN_SRC_PKG= |
| register_var_option "--toolchain-src-pkg=<file>" OPTION_TOOLCHAIN_SRC_PKG "Use toolchain source package." |
| |
| OPTION_TOOLCHAIN_SRC_DIR= |
| register_var_option "--toolchain-src-dir=<path>" OPTION_TOOLCHAIN_SRC_DIR "Use toolchain source directory." |
| |
| RELEASE=`date +%Y%m%d` |
| PACKAGE_DIR=/tmp/ndk-prebuilt/prebuilt-$RELEASE |
| register_var_option "--package-dir=<path>" PACKAGE_DIR "Put prebuilt tarballs into <path>." |
| |
| OPTION_TRY_X86=no |
| register_var_option "--try-x86" OPTION_TRY_X86 "Build experimental x86 toolchain too." |
| |
| OPTION_GIT_HTTP=no |
| register_var_option "--git-http" OPTION_GIT_HTTP "Download sources with http." |
| |
| DARWIN_SSH= |
| if [ "$HOST_OS" = "linux" ] ; then |
| register_var_option "--darwin-ssh=<hostname>" DARWIN_SSH "Specify Darwin hostname to ssh to for the build." |
| fi |
| |
| register_mingw_option |
| |
| PROGRAM_PARAMETERS= |
| PROGRAM_DESCRIPTION=\ |
| "Download and rebuild from scratch all prebuilt binaries for the Android NDK. |
| By default, this will create prebuilt binary tarballs in: $PACKAGE_DIR |
| |
| You can however use --ndk-dir=<path> to instead copy the binaries directly |
| to an existing NDK installation. |
| |
| By default, the script will download the toolchain sources from the Internet, |
| but you can override this using either --toolchain-src-dir or |
| --toolchain-src-pkg. |
| |
| Please read docs/DEVELOPMENT.TXT for more usage information about this |
| script. |
| " |
| |
| extract_parameters "$@" |
| |
| # Needed to set HOST_TAG to windows if --mingw is used. |
| prepare_host_flags |
| |
| if [ -n "$PACKAGE_DIR" -a -n "$NDK_DIR" ] ; then |
| echo "ERROR: You cannot use both --package-dir and --ndk-dir at the same time!" |
| exit 1 |
| fi |
| |
| if [ -z "$NDK_DIR" ] ; then |
| mkdir -p "$PACKAGE_DIR" |
| fail_panic "Could not create directory: $PACKAGE_DIR" |
| NDK_DIR=/tmp/ndk-toolchain/ndk-prebuilt-$$ |
| mkdir -p $NDK_DIR |
| else |
| if [ ! -d "$NDK_DIR" ] ; then |
| echo "ERROR: NDK directory does not exists: $NDK_DIR" |
| exit 1 |
| fi |
| PACKAGE_DIR= |
| fi |
| |
| if [ -n "$PARAMETERS" ]; then |
| dump "ERROR: Too many parameters. See --help for proper usage." |
| exit 1 |
| fi |
| |
| mkdir -p $BUILD_DIR |
| if [ $? != 0 ] ; then |
| dump "ERROR: Could not create build directory: $BUILD_DIR" |
| exit 1 |
| fi |
| setup_default_log_file "$BUILD_DIR/log.txt" |
| |
| if [ -n "$OPTION_TOOLCHAIN_SRC_DIR" ] ; then |
| if [ -n "$OPTION_TOOLCHAIN_SRC_PKG" ] ; then |
| dump "ERROR: You can't use both --toolchain-src-dir and --toolchain-src-pkg" |
| exi t1 |
| fi |
| SRC_DIR="$OPTION_TOOLCHAIN_SRC_DIR" |
| if [ ! -d "$SRC_DIR/gcc" ] ; then |
| dump "ERROR: Invalid toolchain source directory: $SRC_DIR" |
| exit 1 |
| fi |
| else |
| SRC_DIR="$BUILD_DIR/src" |
| mkdir -p "$SRC_DIR" |
| fi |
| |
| FLAGS="" |
| if [ $VERBOSE = yes ] ; then |
| FLAGS="--verbose" |
| fi |
| if [ "$MINGW" = "yes" ] ; then |
| FLAGS="$FLAGS --mingw" |
| fi |
| |
| if [ -z "$OPTION_TOOLCHAIN_SRC_DIR" ] ; then |
| if [ -n "$OPTION_TOOLCHAIN_SRC_PKG" ] ; then |
| # Unpack the toolchain sources |
| if [ ! -f "$OPTION_TOOLCHAIN_SRC_PKG" ] ; then |
| dump "ERROR: Invalid toolchain source package: $OPTION_TOOLCHAIN_SRC_PKG" |
| exit 1 |
| fi |
| unpack_archive "$OPTION_TOOLCHAIN_SRC_PKG" "$SRC_DIR" |
| fail_panic "Could not unpack toolchain sources!" |
| else |
| # Download the toolchain sources |
| dump "Download sources from android.git.kernel.org" |
| DOWNLOAD_FLAGS="$FLAGS" |
| if [ $OPTION_GIT_HTTP = "yes" ] ; then |
| DOWNLOAD_FLAGS="$DOWNLOAD_FLAGS --git-http" |
| fi |
| $PROGDIR/download-toolchain-sources.sh $DOWNLOAD_FLAGS $SRC_DIR |
| fail_panic "Could not download toolchain sources!" |
| fi |
| fi # ! $TOOLCHAIN_SRC_DIR |
| |
| # Special treatment when building remotely on a Darwin machine through ssh |
| # For now, we will have to prompt the user several times. |
| # |
| if [ -n "$DARWIN_SSH" ] ; then |
| # 1/ Copy the NDK toolchain build scripts |
| # 2/ Copy the toolchain sources/package |
| # 3/ Ssh to unpack the build scripts, and run them |
| # 4/ Copy back the generated prebuilt binaries |
| # |
| dump "Preparing remote build on $DARWIN_SSH..." |
| dump "Creating remote temp directory" |
| TMPREMOTE=/tmp/ndk-darwin-prebuild |
| run ssh $DARWIN_SSH "mkdir -p $TMPREMOTE && rm -rf $TMPREMOTE/*" |
| TMPDARWIN=`random_temp_directory` # Where we're going to package stuff |
| log "Using temporary work directory: $TMPDARWIN" |
| dump "Prepare NDK build scripts" |
| copy_directory "$ANDROID_NDK_ROOT/build" "$TMPDARWIN/ndk/build" |
| copy_file_list "$ANDROID_NDK_ROOT" "$TMPDARWIN/ndk" sources/android/libthread_db |
| copy_file_list "$ANDROID_NDK_ROOT" "$TMPDARWIN/ndk" "$STLPORT_SUBDIR" |
| dump "Prepare platforms files" |
| `dirname $0`/build-platforms.sh --no-samples --dst-dir="$TMPDARWIN/ndk" |
| dump "Copying NDK build scripts and platform files to remote..." |
| (cd "$TMPDARWIN" && tar czf - ndk) | (ssh $DARWIN_SSH tar xzf - -C $TMPREMOTE) |
| fail_panic "Could not copy!" |
| rm -rf $TMPDARWIN |
| dump "Copy toolchain sources to remote" |
| ssh $DARWIN_SSH mkdir -p $TMPREMOTE/toolchain && |
| (cd "$SRC_DIR" && tar czf - .) | (ssh $DARWIN_SSH tar xzf - -C $TMPREMOTE/toolchain) |
| fail_panic "Could not copy toolchain!" |
| dump "Running remote build..." |
| run ssh $DARWIN_SSH "$TMPREMOTE/ndk/build/tools/rebuild-all-prebuilt.sh --toolchain-src-dir=$TMPREMOTE/toolchain --package-dir=$TMPREMOTE/packages" |
| fail_panic "Could not build prebuilt packages on Darwin!" |
| dump "Copying back Darwin prebuilt packages..." |
| run scp $DARWIN_SSH:$TMPREMOTE/packages/*-darwin-* $PACKAGE_DIR/ |
| fail_panic "Could not grab Darwin packages!" |
| dump "Cleaning up remote machine..." |
| run ssh $DARWIN_SSH rm -rf $TMPREMOTE |
| exit 0 |
| fi |
| |
| # Package a directory in a .tar.bz2 archive |
| # |
| # $1: textual description |
| # $2: final package name (without .tar.bz2 suffix) |
| # $3: relative root path from $NDK_DIR |
| # |
| package_it () |
| { |
| if [ -n "$PACKAGE_DIR" ] ; then |
| dump "Packaging $1 ($2.tar.bz2) ..." |
| PREBUILT_PACKAGE="$PACKAGE_DIR/$2".tar.bz2 |
| (cd $NDK_DIR && tar cjf $PREBUILT_PACKAGE $3) |
| fail_panic "Could not package $1!" |
| fi |
| } |
| |
| # Build the toolchain from sources |
| # $1: toolchain name (e.g. arm-linux-androideabi-4.4.3) |
| # $2: extra flags, if needed |
| build_toolchain () |
| { |
| dump "Building $1 toolchain... (this can be long)" |
| run $PROGDIR/build-gcc.sh $FLAGS $2 --build-out=$BUILD_DIR/toolchain-$1 $SRC_DIR $NDK_DIR $1 |
| fail_panic "Could bot build $1 toolchain!" |
| package_it "$1 toolchain" "$1-$HOST_TAG" "toolchains/$1/prebuilt/$HOST_TAG" |
| } |
| |
| build_gdbserver () |
| { |
| if [ "$MINGW" = yes ] ; then |
| dump "Skipping gdbserver build (--mingw option being used)." |
| return |
| fi |
| dump "Build $1 gdbserver..." |
| $PROGDIR/build-gdbserver.sh $FLAGS --build-out=$BUILD_DIR/gdbserver-$1 --gdb-version=$GDB_VERSION $SRC_DIR $NDK_DIR $1 |
| fail_panic "Could not build $1 gdbserver!" |
| package_it "$1 gdbserver" "$1-gdbserver" "toolchains/$1/prebuilt/gdbserver" |
| } |
| |
| build_toolchain arm-eabi-4.4.0 |
| build_gdbserver arm-eabi-4.4.0 |
| |
| build_toolchain arm-linux-androideabi-4.4.3 --copy-libstdcxx |
| build_gdbserver arm-linux-androideabi-4.4.3 |
| |
| # We need to package the libsupc++ binaries on Linux since the GCC build |
| # scripts cannot build them with --mingw option. |
| if [ "$HOST_OS" = "linux" ] ; then |
| LIBSUPC_DIR="toolchains/arm-linux-androideabi-4.4.3/prebuilt/$HOST_TAG/arm-linux-androideabi/lib" |
| package_it "GNU libsupc++ armeabi libs" "gnu-libsupc++-armeabi" "$LIBSUPC_DIR/libsupc++.a $LIBSUPC_DIR/thumb/libsupc++.a" |
| package_it "GNU libsupc++ armeabi-v7a libs" "gnu-libsupc++-armeabi-v7a" "$LIBSUPC_DIR/armv7-a/libsupc++.a $LIBSUPC_DIR/armv7-a/thumb/libsupc++.a" |
| fi |
| |
| if [ "$MINGW" != "yes" ] ; then |
| package_it "GNU libstdc++ headers" "gnu-libstdc++-headers" "sources/cxx-stl/gnu-libstdc++/include" |
| package_it "GNU libstdc++ armeabi libs" "gnu-libstdc++-libs-armeabi" "sources/cxx-stl/gnu-libstdc++/libs/armeabi" |
| package_it "GNU libstdc++ armeabi-v7a libs" "gnu-libstdc++-libs-armeabi-v7a" "sources/cxx-stl/gnu-libstdc++/libs/armeabi-v7a" |
| if [ "$OPTION_TRY_X86" = "yes" ] ; then |
| package_it "GNU libstdc++ x86 libs" "gnu-libstdc++-libs-x86" "sources/cxx-stl/gnu-libstdc++/libs/x86" |
| fi |
| fi |
| |
| if [ "$OPTION_TRY_X86" = "yes" ] ; then |
| build_toolchain x86-4.2.1 |
| build_gdbserver x86-4.2.1 |
| fi |
| |
| # Rebuild prebuilt libraries |
| if [ "$MINGW" != "yes" ] ; then |
| if [ -z "$PACKAGE_DIR" ] ; then |
| BUILD_STLPORT_FLAGS="--ndk-dir=\"$NDK_DIR\"" |
| TOOLCHAIN_FLAGS= |
| else |
| BUILD_STLPORT_FLAGS="--package-dir=\"$PACKAGE_DIR\"" |
| TOOLCHAIN_FLAGS="--toolchain-pkg=\"$PACKAGE_DIR/arm-linux-androideabi-4.4.3-$HOST_TAG.tar.bz2\"" |
| fi |
| $ANDROID_NDK_ROOT/build/tools/build-stlport.sh $BUILD_STLPORT_FLAGS $TOOLCHAIN_FLAGS |
| if [ "$OPTION_TRY_X86" = "yes" ]; then |
| if [ -n "$PACKAGE_DIR" ] ; then |
| TOOLCHAIN_FLAGS="--toolchain-pkg=\"$PACKAGE_DIR/x86-4.2.1-$HOST_TAG.tar.bz2\"" |
| fi |
| $ANDROID_NDK_ROOT/build/tools/build-stlport.sh $BUILD_STLPORT_FLAGS--abis=x86 $TOOLCHAIN_FLAGS |
| fi |
| else |
| dump "Skipping STLport binaries build (--mingw option being used)" |
| fi |
| |
| # XXX: NOT YET NEEDED! |
| # |
| #dump "Building host ccache binary..." |
| #$PROGDIR/build-ccache.sh $FLAGS --build-out=$BUILD_DIR/ccache $NDK_DIR |
| #if [ $? != 0 ] ; then |
| # dump "ERROR: Could not build host ccache binary!" |
| # exit 1 |
| #fi |
| |
| if [ -n "$PACKAGE_DIR" ] ; then |
| dump "Done! See $PACKAGE_DIR" |
| else |
| dump "Done! See $NDK_DIR/toolchains" |
| fi |