#!/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. # # # This script is used internally to re-build the toolchains and NDK. # This is an engineer's tool... definitely not a production tool. Don't expect it to be # flawelss... at least at this revision. # Revamp of the 'ndk-buil.sh' based on feedback and NDK build # processes used by Google to generate the NDK> # Comment out the remote Mac OS X builds as it is currently # non-functional due to a change in AOSP # 3592767ce5ca9431eea728370c99d97aadb0800e # include common function and variable definitions . `dirname $0`/prebuilt-common.sh PROGDIR=`dirname $0` PROGDIR=`cd $PROGDIR && pwd` # Name of this NDK release OPTION_NDK_RELEASE=`date +%Y%m%d` register_var_option "--release=<rel_name>" OPTION_NDK_RELEASE "Version of release" # Should we only Build for Linux platform? OPTION_QUICK_BUILD="no" register_var_option "--quick" OPTION_QUICK_BUILD "Only build the Linux basics" ARCHS=$(find_ndk_unknown_archs) ARCHS="$DEFAULT_ARCHS $ARCHS" register_var_option "--arch=<arch>" ARCHS "Specify target architectures" # List of toolchains to package GCC_VERSION_LIST="default" # it's arch defined by default so use default keyword register_var_option "--gcc-version-list=<vers>" GCC_VERSION_LIST "List of GCC release versions" LLVM_VERSION_LIST=$DEFAULT_LLVM_VERSION_LIST register_var_option "--llvm-version-list=<vers>" LLVM_VERSION_LIST "List of LLVM release versions" OPTION_SRC_DIR= register_var_option "--toolchain-src-dir=<path>" OPTION_SRC_DIR "Select toolchain source directory" OPTION_TRY_64= register_try64_option OPTION_ALSO_64= register_option "--also-64" do_ALSO_64 "Also build 64-bit host toolchain" do_ALSO_64 () { OPTION_ALSO_64=" --also-64"; } OPTION_SEPARATE_64= register_option "--separate-64" do_SEPARATE_64 "Separate 64-bit host toolchain to its own package" do_SEPARATE_64 () { if [ "$TRY64" = "yes" ]; then echo "ERROR: You cannot use both --try-64 and --separate-64 at the same time." exit 1 fi OPTION_SEPARATE_64=" --separate-64"; } # # Name of the Mac OS Build host # MAC_BUILD_HOST="macdroid" # register_var_option "--mac-host=<name>" MAC_BUILD_HOST "Hostname of the Mac OS X system" PROGRAM_PARAMETERS="" PROGRAM_DESCRIPTION=\ "Generate the NDK toolchain package." extract_parameters "$@" if [ "$TRY64" = "yes" ]; then OPTION_TRY_64=" --try-64" fi TOP=$PWD TODAY=`date '+%Y%m%d'` PACKAGE_DIR=$TOP/ndk-release-$TODAY HOST_OS=`uname -s | tr '[:upper:]' '[:lower:]'` # Set the list of Build Targets based on this Host OS case "$HOST_OS" in linux ) # Build for Local Linux and Cross-compile for Windows (MINGW) if [ "$OPTION_QUICK_BUILD" = "yes" ]; then BUILD_TARGET_PLATFORMS="linux-x86" else BUILD_TARGET_PLATFORMS="linux-x86 windows" fi ;; darwin ) # Build for Local Mac OS X BUILD_TARGET_PLATFORMS="darwin-x86" ;; esac #export ANDROID_NDK_ROOT=$TOP/ndk #export PATH=$PATH:$ANDROID_NDK_ROOT/build/tools export VERBOSE=--verbose # If BUILD_NUM_CPUS is not already defined in your environment, # define it as the double of HOST_NUM_CPUS. This is used to # run make commands in parallel, as in 'make -j$BUILD_NUM_CPUS' # if [ -z "$BUILD_NUM_CPUS" ] ; then if [ -e /proc/cpuinfo ] ; then HOST_NUM_CPUS=`cat /proc/cpuinfo | grep -c processor` export BUILD_NUM_CPUS=$(($HOST_NUM_CPUS * 2 * 8 / 10)) elif [ -e /usr/sbin/sysctl ] ; then HOST_NUM_CPUS=`/usr/sbin/sysctl -n hw.ncpu` export BUILD_NUM_CPUS=$(($HOST_NUM_CPUS * 2 * 8 / 10)) else export BUILD_NUM_CPUS=1 echo "WARNING: Could not find Host Number CPUs; defaulting to BUILD_NUM_CPUS=${BUILD_NUM_CPUS}" fi fi # CLEAN rm -rf /tmp/ndk-$USER/{build,tmp} ####################################### # Get the Toolchain sources ####################################### # Create a sha1 for any additional patches PATCHES_SHA1="" if [ -d "$PROGDIR/toolchain-patches" ] then PATCHES_SHA1=`( find $PROGDIR/toolchain-patches -type f -print ) | \ sort -f | xargs cat | git hash-object --stdin | cut -c1-7` PATCHES_SHA1="+${PATCHES_SHA1}" fi echo echo "Checking for Toolchain sources" if [ -z "$OPTION_SRC_DIR" ] then OPTION_SRC_DIR=/tmp/ndk-$USER/src/android-ndk-src-${TOOLCHAIN_GIT_DATE}${PATCHES_SHA1} fi if [ ! -d $OPTION_SRC_DIR ] then echo " Downloading Toolchain sources" mkdir -p `dirname $OPTION_SRC_DIR` logfile="$TOP/download-toolchain-sources.log" rotate_log $logfile $PROGDIR/download-toolchain-sources.sh $OPTION_SRC_DIR \ > $logfile 2>&1 fail_panic "Could not download toolchain sources!" else echo " Found existing $OPTION_SRC_DIR" fi # Build the platform echo echo "Build the ndk/platforms directory" logfile="$TOP/gen-platforms.log" rotate_log $logfile $PROGDIR/gen-platforms.sh \ $VERBOSE \ --arch=$(spaces_to_commas $ARCHS) \ --minimal \ --fast-copy > $logfile 2>&1 fail_panic "gen-platforms.sh failed. Logfile in $logfile" logfile="$TOP/rebuild-all.log" rotate_log $logfile # Rebuild all prebuilts for archs and platforms for TARGET_PLATFORM in ${BUILD_TARGET_PLATFORMS} do # Set the Arch specific variables case "$TARGET_PLATFORM" in linux-x86 ) TARGET_PLATFORM_OS="Linux" TARGET_PLATFORM_FLAGS="--systems=$TARGET_PLATFORM" ;; windows ) TARGET_PLATFORM_OS="Windows" TARGET_PLATFORM_FLAGS="--systems=$TARGET_PLATFORM" # Skip this Target Platform in Quick Build Mode if [ "$OPTION_QUICK_BUILD" = "yes" ]; then break ; fi ;; darwin-x86 ) TARGET_PLATFORM_OS="Mac OS X" TARGET_PLATFORM_FLAGS="" # TARGET_PLATFORM_FLAGS="--darwin-ssh=$MAC_BUILD_HOST" # # Skip this Target Platform in Quick Build Mode # if [ "$OPTION_QUICK_BUILD" = "yes" ]; then break ; fi ;; esac # Rebuilt all prebuilts for the arch type echo echo "Rebuilding the toolchain and prebuilt tarballs for $TARGET_PLATFORM_OS" cd $TOP $PROGDIR/rebuild-all-prebuilt.sh \ --arch=$(spaces_to_commas $ARCHS) \ --package-dir=$PACKAGE_DIR \ --gcc-version-list="$GCC_VERSION_LIST" \ --llvm-version-list="$LLVM_VERSION_LIST" \ $MPFR_VERSION $GDB_VERSION $BINUTILS_VERSION \ $TARGET_PLATFORM_FLAGS \ $VERBOSE \ $OPTION_TRY_64 \ $OPTION_ALSO_64 \ $OPTION_SRC_DIR >> $logfile 2>&1 fail_panic "rebuild-all-prebuilt.sh failed. Logfile in $logfile" done # with TARGET_PLATFORM ALL_SYSTEMS=`echo ${BUILD_TARGET_PLATFORMS}` echo echo "Building the NDK release" cd $TOP logfile="$TOP/package-release.log" rotate_log $logfile $PROGDIR/package-release.sh \ --prebuilt-dir=$PACKAGE_DIR \ --systems="$ALL_SYSTEMS" \ --out-dir=$PACKAGE_DIR \ --arch=$(spaces_to_commas $ARCHS) \ --gcc-version-list="$GCC_VERSION_LIST" \ --llvm-version-list="$LLVM_VERSION_LIST" \ --prefix=android-ndk-${OPTION_NDK_RELEASE} \ $OPTION_TRY_64 \ $OPTION_SEPARATE_64 \ $VERBOSE > $logfile 2>&1 fail_panic "package-release.sh failed. Logfile in $logfile" echo echo "Packaging the NDK Toolchain sources" NDK_TOOLCHAIN_PKG=${PACKAGE_DIR}/toolchain-src.tar.bz2 (cd $OPTION_SRC_DIR && tar cjf $NDK_TOOLCHAIN_PKG .) fail_panic "Could not package NDK Toolchain sources!" exit 0