#!/bin/sh
#
# Copyright (C) 2010 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 shell script is used to rebuild the prebuilt STLport binaries from
#  their sources. It requires a working NDK installation.
#

# include common function and variable definitions
. `dirname $0`/prebuilt-common.sh

# Location of the  test project we use to force the rebuild.
# This is relative to the current NDK directory.
PROJECT_SUBDIR=tests/build/prebuild-stlport

PROGRAM_PARAMETERS=""

PROGRAM_DESCRIPTION=\
"Rebuild the prebuilt STLport binaries for the Android NDK.

This script is called when packaging a new NDK release. It will simply
rebuild the STLport static and shared libraries from sources by using
the dummy project under $PROJECT_SUBDIR and a valid NDK installation.

By default, this will try with the current NDK directory, unless
you use the --ndk-dir=<path> option.

The output will be placed in appropriate sub-directories of
<ndk>/$STLPORT_SUBDIR, but you can override this with the --out-dir=<path>
option.
"

RELEASE=`date +%Y%m%d`
PACKAGE_DIR=/tmp/ndk-prebuilt/prebuilt-$RELEASE
register_var_option "--package-dir=<path>" PACKAGE_DIR "Put prebuilt tarballs into <path>."

NDK_DIR=
register_var_option "--ndk-dir=<path>" NDK_DIR "Don't package, put the files in target NDK dir."

TOOLCHAIN_PKG=
register_var_option "--toolchain-pkg=<path>" TOOLCHAIN_PKG "Use specific toolchain prebuilt package."

BUILD_DIR=
OPTION_BUILD_DIR=
register_var_option "--build-dir=<path>" OPTION_BUILD_DIR "Specify temporary build dir."

OUT_DIR=
register_var_option "--out-dir=<path>" OUT_DIR "Specify output directory directly."

ABIS="$STLPORT_ABIS"
register_var_option "--abis=<list>" ABIS "Specify list of target ABIs."

extract_parameters "$@"

if [ -n "$PACKAGE_DIR" -a -n "$NDK_DIR" ] ; then
    echo "ERROR: You cannot use both --package-dir and --ndk-dir at the same time!"
    exit 1
fi

if [ -n "$TOOLCHAIN_PKG" ] ; then
    if [ ! -f "$TOOLCHAIN_PKG" ] ; then
        dump "ERROR: Your toolchain package does not exist: $TOOLCHAIN_PKG"
        exit 1
    fi
    case "$TOOLCHAIN_PKG" in
        *.tar.bz2)
            ;;
        *)
            dump "ERROR: Toolchain package is not .tar.bz2 archive: $TOOLCHAIN_PKG"
            exit 1
    esac
fi

if [ -z "$NDK_DIR" ] ; then
    mkdir -p "$PACKAGE_DIR"
    if [ $? != 0 ] ; then
        echo "ERROR: Could not create directory: $PACKAGE_DIR"
        exit 1
    fi
    NDK_DIR=/tmp/ndk-toolchain/ndk-prebuilt-$$
    mkdir -p $NDK_DIR &&
    dump "Copying NDK files to temporary dir: $NDK_DIR"
    run cp -rf $ANDROID_NDK_ROOT/* $NDK_DIR/
    if [ -n "$TOOLCHAIN_PKG" ] ; then
        dump "Extracting prebuilt toolchain binaries."
        unpack_archive "$TOOLCHAIN_PKG" "$NDK_DIR"
    fi
else
    if [ ! -d "$NDK_DIR" ] ; then
        echo "ERROR: NDK directory does not exists: $NDK_DIR"
        exit 1
    fi
    PACKAGE_DIR=
fi

#
# Setup our paths
#
log "Using NDK root: $NDK_DIR"

BUILD_DIR="$OPTION_BUILD_DIR"
if [ -n "$BUILD_DIR" ] ; then
    log "Using temporary build dir: $BUILD_DIR"
else
    BUILD_DIR=`random_temp_directory`
    log "Using random build dir: $BUILD_DIR"
fi
mkdir -p "$BUILD_DIR"

if [ -z "$OUT_DIR" ] ; then
    OUT_DIR=$NDK_DIR/$STLPORT_SUBDIR
    log "Using default output dir: $OUT_DIR"
else
    log "Using usr output dir: $OUT_DIR"
fi

#
# Now build the fake project
#
# NOTE: We take the build project from this NDK's tree, not from
#        the alternative one specified with --ndk=<dir>
#
PROJECT_DIR="$ANDROID_NDK_ROOT/$PROJECT_SUBDIR"
if [ ! -d $PROJECT_DIR ] ; then
    dump "ERROR: Missing required project: $PROJECT_SUBDIR"
    exit 1
fi

# cleanup required to avoid problems with stale dependency files
rm -rf "$PROJECT_DIR/libs"
rm -rf "$PROJECT_DIR/obj"

LIBRARIES="libstlport_static.a libstlport_shared.so"

for ABI in $ABIS; do
    dump "Building $ABI STLport binaries..."
    (run cd "$PROJECT_SUBDIR" && run "$NDK_DIR"/ndk-build -B APP_ABI=$ABI -j$BUILD_JOBS STLPORT_FORCE_REBUILD=true)
    if [ $? != 0 ] ; then
        dump "ERROR: Could not build $ABI STLport binaries!!"
        exit 1
    fi

    if [ -z "$PACKAGE_DIR" ] ; then
       # Copy files to target NDK
        SRCDIR="$PROJECT_SUBDIR/obj/local/$ABI"
        DSTDIR="$OUT_DIR/libs/$ABI"
        copy_file_list "$SRCDIR" "$DSTDIR" "$LIBRARIES"
    fi
done

# If needed, package files into tarballs
if [ -n "$PACKAGE_DIR" ] ; then
    for ABI in $ABIS; do
        FILES=""
        for LIB in $LIBRARIES; do
            SRCDIR="$PROJECT_SUBDIR/obj/local/$ABI"
            DSTDIR="$STLPORT_SUBDIR/libs/$ABI"
            copy_file_list "$SRCDIR" "$NDK_DIR/$DSTDIR" "$LIB"
            log "Installing: $DSTDIR/$LIB"
            FILES="$FILES $DSTDIR/$LIB"
        done
        PACKAGE="$PACKAGE_DIR/stlport-libs-$ABI.tar.bz2"
        pack_archive "$PACKAGE" "$NDK_DIR" "$FILES"
        fail_panic "Could not package $ABI STLport binaries!"
        dump "Packaging: $PACKAGE"
    done
fi

if [ -n "$PACKAGE_DIR" ] ; then
    dump "Cleaning up..."
    rm -rf $NDK_DIR
fi

dump "Done!"