#!/bin/sh

#
#    Copyright 2014-2017 Nest Labs Inc. All Rights Reserved.
#
#    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.
#

#
#    Description:
#      This file is a convenience script that will bootstrap the GNU
#      autotools system for a project after any build system changes.
#

#
# usage
#
# Display program usage.
#
usage() {
    name=`basename $0`

    echo "Usage: ${name} [ options ] [ -w <what> ]"

    if [ $1 -ne 0 ]; then
        echo "Try '${name} -h' for more information."
    fi

    if [ $1 -ne 1 ]; then
        echo ""
        echo "  -h, --help       Print this help, then exit."
        echo "  -I DIR           Specify directory DIR as the root of the "
        echo "                   nlbuild-autotools repository."
        echo "  -v, --verbose    Verbosely report bootstrap progress."
        echo "  -w, --what WHAT  Specify what part of the package should be "
        echo "                   bootstrapped: all, config, make, or none "
        echo "                   (default: all)."
        echo ""
    fi

    exit $1
}

#
# removetmp
#
# Remove temporary files and directories used during the run of this
# script.
#
removetmp() {
    if [ -n "${LIBTOOLIZE}"  ] && [ "${LIBTOOLIZE}" = "${BOOTSTRAP_TMPDIR}/libtoolize" ]; then
        rm -f "${LIBTOOLIZE}"
    fi

    if [ -n "${AUTOM4TE_CFG}" ]; then
        rm -f "${AUTOM4TE_CFG}"
    fi

    rm -r -f "${BOOTSTRAP_TMPDIR}"
}

what="all"
verbose=
nlbuild_autotools_dir=

# Parse out any command line options

while [ ${#} -gt 0 ]; do
    case ${1} in
    -h|--help)
        usage 0
        ;;

    -I)
        nlbuild_autotools_dir="${2}"
        shift 2
        ;;

    -v|--verbose)
        verbose="--verbose"
        shift 1
        ;;

    -w|--what)
        case "${2}" in
        all|make*|conf*|none)
            what="${2}"
            shift 2
            ;;

        *)
	    echo "Unknown what value '${2}'."
            usage 1
            ;;

        esac
        ;;

    *)
        usage 1
        ;;

    esac
done

# Check to ensure that the location of the nlbuild-autotools directory
# is sane.

if [ -z "${nlbuild_autotools_dir}" ]; then
    echo "$0: No -I option specified. Please provide the location of the nlbuild-autotools directory."
    exit 1

elif [ ! -d "${nlbuild_autotools_dir}" ]; then
    echo "$0: No such directory: ${nlbuild_autotools_dir}. Please provide a valid path to the nlbuild-autotools directory."
    exit 1

fi

# Establish some key directories

srcdir=`dirname ${0}`
abs_srcdir=`pwd`
abs_top_srcdir="${abs_srcdir}"

abs_top_hostdir="${nlbuild_autotools_dir}/tools/host"

# Figure out what sort of build host we are running on, stripping off
# any trailing version number information typically included on Darwin
# / Mac OS X.

host=`${nlbuild_autotools_dir}/autoconf/config.guess | sed -e 's/[[:digit:].]*$//g'`

# If possible, attempt to be self-sufficient, relying on GNU autotools
# executables installed along with the SDK itself.

if [ -d "${abs_top_hostdir}/${host}/bin" ]; then
    export PATH="${abs_top_hostdir}/${host}/bin:${PATH}"
fi

if [ -d "${abs_top_hostdir}/bin" ]; then
    export PATH="${abs_top_hostdir}/bin:${PATH}"
fi

export ACLOCAL=`which aclocal`
export AUTOCONF="`which autoconf`"
export AUTOHEADER="`which autoheader`"
export AUTOM4TE="`which autom4te`"
export AUTOMAKE="`which automake`"
export LIBTOOLIZE="`which libtoolize || which glibtoolize`"
export M4=`which m4`

# Establish, if necessary, some SDK-specific directories needed to
# override various paths in GNU autotools that otherwise expect to be
# absolute (e.g. /usr/share, etc.).

if [ -d "${abs_top_hostdir}/share" ]; then
    if [ -d "${abs_top_hostdir}/share/autoconf" ]; then
        export AC_MACRODIR="${abs_top_hostdir}/share/autoconf"

        export autom4te_perllibdir="${abs_top_hostdir}/share/autoconf"
    fi

    if [ -d "${abs_top_hostdir}/share/automake-1.14" ]; then
        export PERL5LIB="${abs_top_hostdir}/share/automake-1.14:${PERL5LIB}"

	make_action_options="--libdir ${abs_top_hostdir}/share/automake-1.14"
    fi

    if [ -d "${abs_top_hostdir}/share/aclocal-1.14" ]; then
        local_action_options="--automake-acdir=${abs_top_hostdir}/share/aclocal-1.14 ${local_action_options}"
    fi

    if [ -d "${abs_top_hostdir}/share/aclocal" ]; then
        local_action_options="--system-acdir=${abs_top_hostdir}/share/aclocal ${local_action_options}"
    fi
fi

# Both autom4te.cfg and libtoolize, as installed from source, want to
# use absolute file system paths that cannot be
# overridden. Consequently, we create temporary, local versions of
# these, patched up with SDK-specific paths.

BOOTSTRAP_TMPDIR="`mktemp -d /tmp/tmp.bootstrapXXXXXX`"

trap "removetmp" 1 2 3 9 15

#
# Generate any temporary files that need to be patched at run time
# with the location of the SDK tree, including:
#
#   -  The autom4te configuration file
#   -  The libtoolize executable script
#

if [ -r "${abs_top_hostdir}/share/autoconf/autom4te.cfg" ]; then
    export AUTOM4TE_CFG="${BOOTSTRAP_TMPDIR}/autom4te.cfg"

    sed -e "s,//share/autoconf,${abs_top_hostdir}/share/autoconf,g" < "${abs_top_hostdir}/share/autoconf/autom4te.cfg" > "${AUTOM4TE_CFG}"
fi

if [ -r "${abs_top_hostdir}/${host}/bin/libtoolize" ]; then
    export LIBTOOLIZE="${BOOTSTRAP_TMPDIR}/libtoolize"

    sed -e "s,//share/libtool,${abs_top_hostdir}/share/libtool,g" -e "s,//share/aclocal,${abs_top_hostdir}/share/aclocal,g" < "${abs_top_hostdir}/${host}/bin/libtoolize" > "${LIBTOOLIZE}"

    chmod 775 "${LIBTOOLIZE}"
fi

if [ -n "${verbose}" ]; then
    echo PATH="${PATH}"

    echo ACLOCAL="${ACLOCAL}"
    echo AUTOCONF="${AUTOCONF}"
    echo AUTOHEADER="${AUTOHEADER}"
    echo AUTOM4TE="${AUTOM4TE}"
    echo AUTOMAKE="${AUTOMAKE}"
    echo LIBTOOLIZE="${LIBTOOLIZE}"
    echo M4="${M4}"

    echo AC_MACRODIR="${AC_MACRODIR}"
    echo AUTOM4TE_CFG="${AUTOM4TE_CFG}"
    echo PERL5LIB="${PERL5LIB}"
    echo autom4te_perllibdir="${autom4te_perllibdir}"

    echo local_action_options="${local_action_options}"
    echo make_action_options="${make_action_options}"
fi

# Set up the default actions for each bootstrap stage.

local_action="${ACLOCAL} ${verbose} ${local_action_options}"
header_action="${AUTOHEADER} ${verbose}"
tool_action="${LIBTOOLIZE} ${verbose} --automake --copy --force"
make_action="${AUTOMAKE} ${verbose} ${make_action_options} --add-missing --copy"
config_action="${AUTOCONF} ${verbose}"

# Determine what needs to be short-circuited based on the
# user-specified "what".

case "${what}" in

    all)
        ;;

    conf*)
        local_action=true
        header_action=true
        tool_action=true
        make_action=true
        ;;

    make*)
        local_action=true
        header_action=true
        config_action=true
        ;;

    none)
        local_action=true
        header_action=true
        tool_action=true
        make_action=true
        config_action=true
        ;;

esac

# Bootstrap the package.

${local_action} && ${tool_action} && ${header_action} && ${make_action} && ${config_action}

# Clean up any temporary files created.

removetmp
