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

# List of toolchains to package
OPTION_TOOLCHAINS="$DEFAULT_ARCH_TOOLCHAIN_NAME_arm,$DEFAULT_ARCH_TOOLCHAIN_NAME_x86,$DEFAULT_ARCH_TOOLCHAIN_NAME_mips"
register_var_option "--toolchains=<toolchain[,toolchain]>" OPTION_TOOLCHAINS "Toolchain(s) to package"

# # 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 "$@"

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"
NDK_SRC_DIR=/tmp/ndk-$USER/src/android-ndk-src-${TOOLCHAIN_GIT_DATE}${PATCHES_SHA1}
if [ ! -d $NDK_SRC_DIR ]
then
    echo "  Downloading Toolchain sources"
    mkdir -p `dirname $NDK_SRC_DIR`
    logfile="$TOP/download-toolchain-sources.log"
    rotate_log $logfile
    $PROGDIR/download-toolchain-sources.sh $NDK_SRC_DIR \
        > $logfile 2>&1
    fail_panic "Could not download toolchain sources!"
else
    echo "  Found existing $NDK_SRC_DIR"
fi


ARCHS="arm x86 mips"
for ARCH in $ARCHS
do
    # Set the Arch specific variables
    case "$ARCH" in
    arm )
        PRODUCT=generic

        unset MPFR_VERSION
        unset GDB_VERSION
        unset BINUTILS_VERSION
        ;;
    x86|mips )
        PRODUCT=generic_$ARCH
        ;;
    esac


    # Ensure we have a Product output for the NDK build
    export ANDROID_PRODUCT_OUT=$TOP/out/target/product/$PRODUCT
    if [ ! -d $ANDROID_PRODUCT_OUT ]; then
        echo >&2 Rebuild for $PRODUCT first... or change PRODUCT in $0.
        exit 1
    fi
done # with ARCH

# Build the platform
echo
echo "Build the ndk/platforms directory"
logfile="$TOP/build-platforms.log"
rotate_log $logfile
$PROGDIR/gen-platforms.sh \
    $VERBOSE \
    --arch=$(spaces_to_commas $ARCHS)  \
    --minimal \
    --fast-copy > $logfile 2>&1
fail_panic "build-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 \
        $MPFR_VERSION $GDB_VERSION $BINUTILS_VERSION \
        $TARGET_PLATFORM_FLAGS \
        $VERBOSE \
        $NDK_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)  \
    --prefix=android-ndk-${OPTION_NDK_RELEASE} \
    --no-git \
    $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 $NDK_SRC_DIR && tar cjf $NDK_TOOLCHAIN_PKG .)
fail_panic "Could not package NDK Toolchain sources!"

exit 0

