Home | History | Annotate | Download | only in tools
      1 #!/bin/sh
      2 #
      3 # Copyright (C) 2011 The Android Open Source Project
      4 #
      5 # Licensed under the Apache License, Version 2.0 (the "License");
      6 # you may not use this file except in compliance with the License.
      7 # You may obtain a copy of the License at
      8 #
      9 #      http://www.apache.org/licenses/LICENSE-2.0
     10 #
     11 # Unless required by applicable law or agreed to in writing, software
     12 # distributed under the License is distributed on an "AS IS" BASIS,
     13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 # See the License for the specific language governing permissions and
     15 # limitations under the License.
     16 #
     17 #
     18 # This script is used internally to re-build the toolchains and NDK.
     19 # This is an engineer's tool... definitely not a production tool. Don't expect it to be
     20 # flawelss... at least at this revision.
     21 
     22 # Revamp of the 'ndk-buil.sh' based on feedback and NDK build
     23 # processes used by Google to generate the NDK>
     24 
     25 # Comment out the remote Mac OS X builds as it is currently
     26 # non-functional due to a change in AOSP
     27 # 3592767ce5ca9431eea728370c99d97aadb0800e
     28 
     29 # include common function and variable definitions
     30 . `dirname $0`/prebuilt-common.sh
     31 PROGDIR=`dirname $0`
     32 PROGDIR=`cd $PROGDIR && pwd`
     33 
     34 
     35 # Name of this NDK release
     36 OPTION_NDK_RELEASE="r6x-eng"
     37 register_var_option "--release=<rel_name>" OPTION_NDK_RELEASE "Version of release"
     38 
     39 # Should we only Build for Linux platform?
     40 OPTION_QUICK_BUILD="no"
     41 register_var_option "--quick" OPTION_QUICK_BUILD "Only build the Linux basics"
     42 
     43 # List of toolchains to package
     44 OPTION_TOOLCHAINS="$DEFAULT_ARCH_TOOLCHAIN_NAME_arm,$DEFAULT_ARCH_TOOLCHAIN_NAME_x86,$DEFAULT_ARCH_TOOLCHAIN_NAME_mips"
     45 register_var_option "--toolchains=<toolchain[,toolchain]>" OPTION_TOOLCHAINS "Toolchain(s) to package"
     46 
     47 # # Name of the Mac OS Build host
     48 # MAC_BUILD_HOST="macdroid"
     49 # register_var_option "--mac-host=<name>" MAC_BUILD_HOST "Hostname of the Mac OS X system"
     50 
     51 PROGRAM_PARAMETERS=""
     52 PROGRAM_DESCRIPTION=\
     53 "Generate the NDK toolchain package."
     54 
     55 extract_parameters "$@"
     56 
     57 TOP=$PWD
     58 TODAY=`date '+%Y%m%d'`
     59 PACKAGE_DIR=$TOP/ndk-release-$TODAY
     60 HOST_OS=`uname -s | tr '[:upper:]' '[:lower:]'`
     61 # Set the list of Build Targets based on this Host OS
     62 case "$HOST_OS" in
     63 linux )
     64     # Build for Local Linux and Cross-compile for Windows (MINGW)
     65     BUILD_TARGET_PLATFORMS="linux-x86 windows"
     66     ;;
     67 darwin )
     68     # Build for Local Mac OS X
     69     BUILD_TARGET_PLATFORMS="darwin-x86"
     70     ;;
     71 esac
     72 
     73 #export ANDROID_NDK_ROOT=$TOP/ndk
     74 #export PATH=$PATH:$ANDROID_NDK_ROOT/build/tools
     75 export VERBOSE=--verbose
     76 
     77 # If BUILD_NUM_CPUS is not already defined in your environment,
     78 # define it as the double of HOST_NUM_CPUS. This is used to
     79 # run make commands in parallel, as in 'make -j$BUILD_NUM_CPUS'
     80 #
     81 if [ -z "$BUILD_NUM_CPUS" ] ; then
     82     if [ -e /proc/cpuinfo ] ; then
     83         HOST_NUM_CPUS=`cat /proc/cpuinfo | grep -c processor`
     84         export BUILD_NUM_CPUS=$(($HOST_NUM_CPUS * 2 * 8 / 10))
     85     elif [ -e /usr/sbin/sysctl ] ; then
     86         HOST_NUM_CPUS=`/usr/sbin/sysctl -n hw.ncpu`
     87         export BUILD_NUM_CPUS=$(($HOST_NUM_CPUS * 2 * 8 / 10))
     88     else
     89         export BUILD_NUM_CPUS=1
     90         echo "WARNING: Could not find Host Number CPUs; defaulting to BUILD_NUM_CPUS=${BUILD_NUM_CPUS}"
     91     fi
     92 fi
     93 
     94 # CLEAN
     95 rm -rf /tmp/ndk-$USER/{build,tmp}
     96 
     97 
     98 #######################################
     99 # Get the Toolchain sources
    100 #######################################
    101 
    102 # Create a sha1 for any additional patches
    103 PATCHES_SHA1=""
    104 if [ -d "$PROGDIR/toolchain-patches" ]
    105 then
    106     PATCHES_SHA1=`( find $PROGDIR/toolchain-patches -type f -print ) | \
    107         sort -f | xargs cat | git hash-object --stdin | cut -c1-7`
    108     PATCHES_SHA1="+${PATCHES_SHA1}"
    109 fi
    110 
    111 echo
    112 echo "Checking for Toolchain sources"
    113 NDK_SRC_DIR=/tmp/ndk-$USER/src/android-ndk-src-${TOOLCHAIN_GIT_DATE}${PATCHES_SHA1}
    114 if [ ! -d $NDK_SRC_DIR ]
    115 then
    116     echo "  Downloading Toolchain sources"
    117     mkdir -p `dirname $NDK_SRC_DIR`
    118     logfile="$TOP/download-toolchain-sources.log"
    119     rotate_log $logfile
    120     $PROGDIR/download-toolchain-sources.sh $NDK_SRC_DIR \
    121         > $logfile 2>&1
    122     fail_panic "Could not download toolchain sources!"
    123 else
    124     echo "  Found existing $NDK_SRC_DIR"
    125 fi
    126 
    127 
    128 ALL_ARCH=""
    129 for ARCH in arm x86 mips
    130 do
    131     # Collect all Arch types for packaging
    132     ALL_ARCH="${ALL_ARCH} $ARCH"
    133 
    134     # Set the Arch specific variables
    135     case "$ARCH" in
    136     arm )
    137         PRODUCT=generic
    138 
    139         unset MPFR_VERSION
    140         unset GDB_VERSION
    141         unset BINUTILS_VERSION
    142         ;;
    143     x86|mips )
    144         PRODUCT=generic_$ARCH
    145         ;;
    146     esac
    147 
    148 
    149     # Ensure we have a Product output for the NDK build
    150     export ANDROID_PRODUCT_OUT=$TOP/out/target/product/$PRODUCT
    151     if [ ! -d $ANDROID_PRODUCT_OUT ]; then
    152         echo >&2 Rebuild for $PRODUCT first... or change PRODUCT in $0.
    153         exit 1
    154     fi
    155 
    156     # Build the platform
    157     echo
    158     echo "$ARCH: Build the ndk/platforms directory"
    159     logfile="$TOP/$ARCH.build-platforms.log"
    160     rotate_log $logfile
    161     $PROGDIR/build-platforms.sh \
    162         $VERBOSE \
    163         --arch=$ARCH --no-symlinks --no-samples > $logfile 2>&1
    164     fail_panic "build-platforms.sh failed. Logfile in $logfile"
    165 
    166 
    167     logfile="$TOP/$ARCH.rebuild-all.log"
    168     rotate_log $logfile
    169 
    170     # Rebuild all prebuilts for the arch type and platforms
    171     for TARGET_PLATFORM in ${BUILD_TARGET_PLATFORMS}
    172     do
    173         # Set the Arch specific variables
    174         case "$TARGET_PLATFORM" in
    175         linux-x86 )
    176             TARGET_PLATFORM_OS="Linux"
    177             TARGET_PLATFORM_FLAGS=""
    178             ;;
    179         windows )
    180             TARGET_PLATFORM_OS="Windows"
    181             TARGET_PLATFORM_FLAGS="--mingw"
    182             # Skip this Target Platform in Quick Build Mode
    183             if [ "$OPTION_QUICK_BUILD" = "yes" ]; then break ; fi
    184             ;;
    185         darwin-x86 )
    186             TARGET_PLATFORM_OS="Mac OS X"
    187             TARGET_PLATFORM_FLAGS=""
    188 #            TARGET_PLATFORM_FLAGS="--darwin-ssh=$MAC_BUILD_HOST"
    189 #            # Skip this Target Platform in Quick Build Mode
    190 #            if [ "$OPTION_QUICK_BUILD" = "yes" ]; then break ; fi
    191             ;;
    192         esac
    193 
    194         # Rebuilt all prebuilts for the arch type
    195         echo
    196         echo "$ARCH: Rebuilding the toolchain and prebuilt tarballs for $TARGET_PLATFORM_OS"
    197         cd $TOP
    198         $PROGDIR/rebuild-all-prebuilt.sh \
    199             --arch=$ARCH \
    200             --package-dir=$PACKAGE_DIR \
    201             $MPFR_VERSION $GDB_VERSION $BINUTILS_VERSION \
    202             $TARGET_PLATFORM_FLAGS \
    203             $VERBOSE \
    204             $NDK_SRC_DIR >> $logfile 2>&1
    205         fail_panic "rebuild-all-prebuilt.sh failed. Logfile in $logfile"
    206     done # with TARGET_PLATFORM
    207 done # with ARCH
    208 
    209 ALL_ARCH=`echo $ALL_ARCH`
    210 ALL_SYSTEMS=`echo ${BUILD_TARGET_PLATFORMS}`
    211 
    212 echo
    213 echo "Building the NDK release"
    214 cd $TOP
    215 logfile="$TOP/package-release.log"
    216 rotate_log $logfile
    217 $PROGDIR/package-release.sh \
    218     --prebuilt-dir=$PACKAGE_DIR \
    219     --systems="$ALL_SYSTEMS" \
    220     --out-dir=$PACKAGE_DIR \
    221     --arch="$ALL_ARCH" \
    222     --toolchains="${OPTION_TOOLCHAINS}" \
    223     --prefix=android-ndk-${OPTION_NDK_RELEASE} \
    224     --no-git \
    225     $VERBOSE > $logfile 2>&1
    226 fail_panic "package-release.sh failed. Logfile in $logfile"
    227 
    228 echo
    229 echo "Packaging the NDK Toolchain sources"
    230 NDK_TOOLCHAIN_PKG=${PACKAGE_DIR}/toolchain-src.tar.bz2
    231 (cd $NDK_SRC_DIR && tar cjf $NDK_TOOLCHAIN_PKG .)
    232 fail_panic "Could not package NDK Toolchain sources!"
    233 
    234 exit 0
    235 
    236