#!/bin/sh # # This script is used to rebuild the x86 toolchain Linux # (i686-android-linux-4.4.3) completely from scratch. # # CURRENTLY UNTESTED ON OSX!! # # You need to have a recent AOSP workspace, and have ANDROID_BUILD_TOP # point to it. Usually, this variable is defined in your environment after # you call "lunch <product>-<variant>" # PRODUCT_NAME=full_x86 ARCH=x86 GCC_VERSION=4.4.3 TOOLCHAIN_INSTALL_NAME=i686-android-linux-$GCC_VERSION TOOLCHAIN_BIN_PREFIX=i686-android-linux- TOOLCHAIN_BUILD_NAME=$ARCH-$GCC_VERSION PLATFORM=android-9 MPFR_VERSION=2.4.1 GDB_VERSION=6.6 BINUTILS_VERSION=2.20.1 GIT_DATE=20110303 HOST_OS=`uname -s` case "$HOST_OS" in Darwin) HOST_OS=darwin HOST_TAG=darwin-x86 BUILD_NUM_CPUS=$(sysctl -n hw.ncpu) ;; Linux) # note that building 32-bit binaries on x86_64 is handled later HOST_OS=linux HOST_TAG=linux-x86 BUILD_NUM_CPUS=$(grep -c processor /proc/cpuinfo) ;; *) echo "ERROR: Unsupported OS: $HOST_OS" exit 1 esac PREBUILT_INSTALL_DIR=prebuilt/$HOST_TAG/toolchain/$TOOLCHAIN_INSTALL_NAME #PREBUILT_INSTALL_DIR=/tmp/zoo PREBUILT_GDB_DIR=prebuilt/android-$ARCH/gdbserver # If if [ -z "$ANDROID_BUILD_TOP" ]; then if [ ! -f build/envsetup.sh ]; then echo "Please run this script from the top of a valid AOSP platform source tree" echo "or define ANDROID_BUILD_TOP in your environment to point to it. Note that" echo "this variable is typically defined by running 'lunch <name>' too." exit 1 fi ANDROID_BUILD_TOP=. fi # Today's date, ISO format, only used to determine the temporary directory. TODAY=`date '+%Y%m%d'` VERBOSE_FLAG= : ${V:=0} if [ "$V" -gt 0 ]; then VERBOSE_FLAG="--verbose" fi # A few useful functions # fail_panic () { if [ $? != 0 ]; then echo "PANIC: $@" exit 1 fi } run () { echo "### $@" $@ } # Compute the number of parallel build jobs # JOBS=$(( $BUILD_NUM_CPUS * 2 )) # Temporary directory where we're going to store every intermediate file. # # Normally, none of the generated executables should embed/use this path # but select something complex to avoid problems if this is not the case # TMPDIR=/tmp/$TOOLCHAIN_INSTALL_NAME-$TODAY mkdir -p $TMPDIR fail_panic "Can't create temporary directory: $TMPDIR" # System libraries needed to bootstrap the toolchain SYSTEM_LIBS="libc libm libdl libstdc++" # Where to download the toolchain sources from android.git.kernel.org TOOLCHAIN_SRC_DIR=$TMPDIR/toolchain-sources # Where to build the toolchain binaries TOOLCHAIN_BUILD_DIR=$TMPDIR/toolchain-build # Directory where we will copy the content of development/ndk # and update it with the freshest libraries from the system. DEVELOPMENT_DIR=$TMPDIR/devel # Where to place the installed binaries (NDK installation-like) TOOLCHAIN_INSTALL_DIR=$TMPDIR/ndk-install build_system_libraries () { echo "Building $PRODUCT_NAME system libraries: $SYSTEM_LIBS" cd $ANDROID_BUILD_TOP && make $SYSTEM_LIBS -j$JOBS fail_panic "Could not build $PRODUCT_NAME system libraries!" } download_toolchain_sources () { # We don't use ndk/build/tools/download-toolchain-sources.sh here # because it removes all .info files, which breaks the ToT source # build as of 2011-03-03 # echo "Download toolchain patches to: $TOOLCHAIN_SRC_DIR" GIT_PREFIX=git://android.git.kernel.org/toolchain for PROJECT in build binutils gcc gdb mpfr gmp gold; do PROJECT_DIR="$TOOLCHAIN_SRC_DIR/$PROJECT" PROJECT_GIT="$GIT_PREFIX/$PROJECT.git" echo "$PROJECT: Cleaning" rm -rf $PROJECT_DIR echo "$PROJECT: Downloading sources from: $PROJECT_GIT" (git clone $PROJECT_GIT $PROJECT_DIR) > /dev/null 2>&1 fail_panic "$PROJECT: Could not git clone!!" if [ -n "$GIT_DATE" ] ; then echo "$PROJECT: Switching to sources for date '$GIT_DATE'" (cd $PROJECT_DIR && REVISION=`git rev-list -n 1 --until="$GIT_DATE" HEAD` && run git checkout $REVISION) > /dev/null 2>&1 fail_panic "$PROJECT: Could not checkout?" fi done fail_panic "Could not download toolchain sources!" } build_development_dir () { echo "Copy development/ndk to: $DEVELOPMENT_DIR" rm -rf $DEVELOPMENT_DIR cp -rf $ANDROID_BUILD_TOP/development/ndk $DEVELOPMENT_DIR fail_panic "Could not copy development/ndk!" } build_sysroot () { echo "Generate platform files into: $TOOLCHAIN_INSTALL_DIR" ndk/build/tools/build-platforms.sh \ --abi=$ARCH --no-symlinks --no-samples \ --src-dir=$DEVELOPMENT_DIR \ --dst-dir=$TOOLCHAIN_INSTALL_DIR fail_panic "Could not generate build sysroot" echo "Copying system files into: $TOOLCHAIN_INSTALL_DIR/sysroot" cp -r $TOOLCHAIN_INSTALL_DIR/platforms/$PLATFORM/arch-$ARCH $TOOLCHAIN_INSTALL_DIR/sysroot fail_panic "Could not copy files to: $TOOLCHAIN_INSTALL_DIR/sysroot" rm -rf $TOOLCHAIN_INSTALL_DIR/sysroot/usr/lib } build_gcc () { echo "Building $TOOLCHAIN_INSTALL_NAME now (this can be long)." mkdir -p $TOOLCHAIN_BUILD_DIR && rm -rf $TOOLCHAIN_BUILD_DIR/* run ndk/build/tools/build-gcc.sh \ --sysroot=$TOOLCHAIN_INSTALL_DIR/sysroot \ --build-out=$TOOLCHAIN_BUILD_DIR \ --mpfr-version=$MPFR_VERSION \ --gdb-version=$GDB_VERSION \ --binutils-version=$BINUTILS_VERSION \ "$TOOLCHAIN_SRC_DIR" "$TOOLCHAIN_INSTALL_DIR" $TOOLCHAIN_BUILD_NAME fail_panic "Could not build compiler!" } install_gcc () { echo "Installing toolchain to $PREBUILT_INSTALL_DIR" SRCDIR=$TOOLCHAIN_INSTALL_DIR/toolchains/$TOOLCHAIN_BUILD_NAME/prebuilt/$HOST_TAG mkdir -p $PREBUILT_INSTALL_DIR && rm -rf $PREBUILT_INSTALL_DIR/* && (cd $SRCDIR && tar cf - --exclude=sysroot *) | tar xf - -C $PREBUILT_INSTALL_DIR fail_panic "Can't install!" # Copy toolchain license files too # Plus this script as well! cp ndk/build/tools/toolchain-licenses/* $PREBUILT_INSTALL_DIR && cp $0 $PREBUILT_INSTALL_DIR } download_toolchain_sources build_development_dir build_sysroot build_gcc install_gcc echo "Done!"