#!/bin/sh
#
# Copyright (C) 2009 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 to build complete Android NDK release packages
# from the git repository and a set of prebuilt cross-toolchain tarballs
#

# location of the root ndk directory. we assume this script is under build/tools
NDK_ROOT_DIR=`dirname $0`/../..
NDK_ROOT_DIR=`cd $NDK_ROOT_DIR && pwd`

. $NDK_ROOT_DIR/build/core/ndk-common.sh
force_32bit_binaries

# the default release name (use today's date)
RELEASE=`date +%Y%m%d`

# the package prefix
PREFIX=android-ndk

# the directory containing the prebuilt toolchain tarballs
PREBUILT_DIR=

# the prefix of prebuilt toolchain tarballs in $PREBUILT_DIR
PREBUILT_PREFIX=android-ndk-prebuilt-20090323

# the list of supported host development systems
PREBUILT_SYSTEMS="linux-x86 darwin-x86 windows"

# a prebuilt NDK archive (.zip file). empty means don't use any
PREBUILT_NDK=

# set to 'yes' if we should use 'git ls-files' to list the files to
# be copied into the archive.
USE_GIT_FILES=yes

OPTION_HELP=no

for opt do
  optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'`
  case "$opt" in
  --help|-h|-\?) OPTION_HELP=yes
  ;;
  --verbose)
    if [ "$VERBOSE" = "yes" ] ; then
        VERBOSE2=yes
    else
        VERBOSE=yes
    fi
  ;;
  --release=*) RELEASE=$optarg
  ;;
  --prefix=*) PREFIX=$optarg
  ;;
  --prebuilt-ndk=*) PREBUILT_NDK=$optarg
  ;;
  --prebuilt-prefix=*) PREBUILT_PREFIX=$optarg
  ;;
  --prebuilt-path=*) PREBUILT_DIR=$optarg
  ;;
  --systems=*) PREBUILT_SYSTEMS=$optarg
  ;;
  --no-git) USE_GIT_FILES=no
  ;;
  *)
    echo "unknown option '$opt', use --help"
    exit 1
  esac
done

if [ $OPTION_HELP = yes ] ; then
    echo "Usage: make-release.sh [options]"
    echo ""
    echo "Package a new set of release packages for the Android NDK."
    echo "You will need to specify the path of a directory containing"
    echo "prebuilt toolchain tarballs with the --prebuilt-path option."
    echo ""
    echo "Alternatively, you can specify an existing NDK release package"
    echo "with the --prebuilt-ndk option."
    echo ""
    echo "Options: [defaults in brackets after descriptions]"
    echo ""
    echo "  --help                    Print this help message"
    echo "  --prefix=PREFIX           Package prefix name [$PREFIX]"
    echo "  --release=NAME            Specify release name [$RELEASE]"
    echo "  --systems=SYSTEMS         List of host system packages [$PREBUILT_SYSTEMS]"
    echo "  --prebuilt-ndk=FILE       Specify a previous NDK package [$PREBUILT_NDK]"
    echo "  --prebuilt-path=PATH      Location of prebuilt binary tarballs [$PREBUILT_DIR]"
    echo "  --prebuilt-prefix=PREFIX  Prefix of prebuilt binary tarballs [$PREBUILT_PREFIX]"
    echo "  --no-git                  Don't use git to list input files, take all of them."
    echo ""
    exit 1
fi

# Check the prebuilt path
#
if [ -n "$PREBUILD_NDK" -a -n "$PREBUILT_DIR" ] ; then
    echo "ERROR: You cannot use both --prebuilt-ndk and --prebuilt-path at the same time."
    exit 1
fi

if [ -z "$PREBUILT_DIR" -a -z "$PREBUILT_NDK" ] ; then
    echo "ERROR: You must use --prebuilt-path=PATH to specify the path of prebuilt binary tarballs."
    echo "       Or --prebuilt-ndk=FILE to specify an existing NDK release archive."
    exit 1
fi

if [ -n "$PREBUILT_DIR" ] ; then
    if [ ! -d "$PREBUILT_DIR" ] ; then
        echo "ERROR: the --prebuilt-path argument is not a directory path: $PREBUILT_DIR"
        exit 1
    fi
    if [ -z "$PREBUILT_PREFIX" ] ; then
        echo "ERROR: Your prebuilt prefix is empty; use --prebuilt-prefix=PREFIX."
        exit 1
    fi
    if [ -z "$PREBUILT_SYSTEMS" ] ; then
        echo "ERROR: Your systems list is empty, use --system=LIST to specify a different one."
        exit 1
    fi
    # Check the systems
    #
    for SYS in $PREBUILT_SYSTEMS; do
        if [ ! -f $PREBUILT_DIR/$PREBUILT_PREFIX-$SYS.tar.bz2 ] ; then
            echo "ERROR: It seems there is no prebuilt binary tarball for the '$SYS' system"
            echo "Please check the content of $PREBUILT_DIR for a file named $PREBUILT_PREFIX-$SYS.tar.bz2."
            exit 1
        fi
    done
else
    if [ ! -f "$PREBUILT_NDK" ] ; then
        echo "ERROR: the --prebuilt-ndk argument is not a file: $PREBUILT_NDK"
        exit 1
    fi
    # Check that the name ends with the proper host tag
    HOST_NDK_SUFFIX="$HOST_TAG.zip"
    echo "$PREBUILT_NDK" | grep -q "$HOST_NDK_SUFFIX"
    if [ $? != 0 ] ; then
        echo "ERROR: the name of the prebuilt NDK must end in $HOST_NDK_SUFFIX"
        exit 1
    fi
    PREBUILT_SYSTEMS=$HOST_TAG
fi

# The list of git files to copy into the archives
if [ "$USE_GIT_FILES" = "yes" ] ; then
    echo "Collecting sources from git (use --no-git to copy all files instead)."
    GIT_FILES=`cd $NDK_ROOT_DIR && git ls-files`
else
    echo "Collecting all sources files under tree."
    # Cleanup everything that is likely to not be part of the final NDK
    # i.e. generated files...
    rm -rf $NDK_ROOT_DIR/out
    rm -rf $NDK_ROOT_DIR/apps/*/project/libs/armeabi
    # Get all files under the NDK root
    GIT_FILES=`cd $NDK_ROOT_DIR && find .`
    GIT_FILES=`echo $GIT_FILES | sed -e "s!\./!!g"`
fi

# temporary directory used for packaging
TMPDIR=/tmp/ndk-release

RELEASE_PREFIX=$PREFIX-$RELEASE

rm -rf $TMPDIR && mkdir -p $TMPDIR

# first create the reference ndk directory from the git reference
echo "Creating reference from source files"
REFERENCE=$TMPDIR/reference &&
mkdir -p $REFERENCE &&
(cd $NDK_ROOT_DIR && tar cf - $GIT_FILES) | (cd $REFERENCE && tar xf -) &&
rm -f $REFERENCE/Android.mk
if [ $? != 0 ] ; then
    echo "Could not create reference. Aborting."
    exit 2
fi

# now, for each system, create a package
#
for SYSTEM in $PREBUILT_SYSTEMS; do
    echo "Preparing package for system $SYSTEM."
    BIN_RELEASE=$RELEASE_PREFIX-$SYSTEM
    PREBUILT=$PREBUILT_DIR/$PREBUILT_PREFIX-$SYSTEM
    DSTDIR=$TMPDIR/$RELEASE_PREFIX
    rm -rf $DSTDIR && mkdir -p $DSTDIR &&
    cp -rp $REFERENCE/* $DSTDIR
    if [ $? != 0 ] ; then
        echo "Could not copy reference. Aborting."
        exit 2
    fi

    if [ -n "$PREBUILT_NDK" ] ; then
        echo "Unpacking prebuilt toolchain from $PREBUILT_NDK"
        UNZIP_DIR=$TMPDIR/prev-ndk
        rm -rf $UNZIP_DIR && mkdir -p $UNZIP_DIR
        if [ $? != 0 ] ; then
            echo "Could not create temporary directory: $UNZIP_DIR"
            exit 1
        fi
        cd $UNZIP_DIR && unzip -q $PREBUILT_NDK 1>/dev/null 2>&1
        if [ $? != 0 ] ; then
            echo "ERROR: Could not unzip NDK package $PREBUILT_NDK"
            exit 1
        fi
        cd android-ndk-* && cp -rP build/prebuilt $DSTDIR/build
    else
        echo "Unpacking $PREBUILT.tar.bz2"
        (cd $DSTDIR && tar xjf $PREBUILT.tar.bz2) 2>/dev/null 1>&2
        if [ $? != 0 ] ; then
            echo "Could not unpack prebuilt for system $SYSTEM. Aborting."
            exit 1
        fi
    fi

    ARCHIVE=$BIN_RELEASE.zip
    echo "Creating $ARCHIVE"
    (cd $TMPDIR && zip -9qr $ARCHIVE $RELEASE_PREFIX && rm -rf $DSTDIR) 2>/dev/null 1>&2
    if [ $? != 0 ] ; then
        echo "Could not create zip archive. Aborting."
        exit 1
    fi

    chmod a+r $TMPDIR/$ARCHIVE
done

echo "Cleaning up."
rm -rf $TMPDIR/reference
rm -rf $TMPDIR/prev-ndk

echo "Done, please see packages in $TMPDIR:"
ls -l $TMPDIR
