| #!/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!" |