#!/bin/sh -e
# 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.

# cd into this script’s directory
rootdir="$(cd "${0%/*}" 2>/dev/null; echo "$PWD")"
basename=`basename $0`

PACKAGE_AUTHOR_NAME="The Apache Software Foundation"

TEST=0
WITH_CURL="false"
WITH_FAUXTON=1
WITH_DOCS=1
SKIP_DEPS=0

PREFIX=
DEFAULT_PREFIX=/usr/local
EXEC_PREFIX=
BINDIR=
LIBEXECDIR=
SYSCONFDIR=
DATAROOTDIR=
DATADIR=
LOCALSTATEDIR=
RUNSTATEDIR=
LIBDIR=

INFODIR=
MANDIR=
DOCDIR=

HTMLDIR=
PDFDIR=

DATABASEDIR=
VIEWDIR=
LOGDIR=
COUCHDB_USER=`whoami`

display_help () {
    cat << EOF
Usage: $basename [OPTION]

The $basename command is responsible for generating the build
system for Apache CouchDB.

Options:

  -h | --help                 display a short help message and exit
  -u | --user USER            set the username to run as (defaults to $COUCHDB_USER)
  --prefix=DIRECTORY          set the installation prefix (defaults to $DEFAULT_PREFIX)
  --databasedir DIRECTORY     specify the data directory (defaults to /var/lib/couchdb)
  --viewindexdir DIRECTORY    specify the view directory (defaults to /var/lib/couchdb)
  --logdir DIRECTORY          specify the log file (defaults to /var/log/couchdb.log)
  -c | --with-curl            request that couchjs is linked to cURL (default false)
  --disable-fauxton           do not build Fauxton
  --disable-docs              do not build any documentation or manpages
  --skip-deps                 do not update erlang dependencies
  --rebar=PATH                use rebar by specified path (version >=2.6.0 && <3.0 required)


  Installation directories:
    --prefix=PREFIX         install architecture-independent files in PREFIX
                            [/usr/local]
    --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                            [PREFIX]

  Fine tuning of the installation directories:
    --bindir=DIR            user executables [EPREFIX/bin]
    --libexecdir=DIR        program executables [EPREFIX/libexec]
    --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
    --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
    --libdir=DIR            object code libraries [EPREFIX/lib]
    --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
    --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
    --infodir=DIR           info documentation [DATAROOTDIR/info]
    --mandir=DIR            man documentation [DATAROOTDIR/man]
    --docdir=DIR            documentation root [DATAROOTDIR/doc/apache-couchdb]
    --htmldir=DIR           html documentation [DOCDIR]
    --pdfdir=DIR            pdf documentation [DOCDIR]
EOF
}

parse_opts() {
    while :; do
        case $1 in
            -h|--help)
                display_help
                exit
                ;;

            --test)
                TEST=1
                shift
                continue
                ;;

            --with-curl|-c)
                WITH_CURL="true"
                shift
                continue
                ;;

            --disable-fauxton)
                WITH_FAUXTON=0
                shift
                continue
                ;;

            --disable-docs)
                WITH_DOCS=0
                shift
                continue
                ;;

            --skip-deps)
                SKIP_DEPS=1
                shift
                continue
                ;;

            --rebar)
                if [ -x "$2" ]; then
                    version=`$2 --version 2> /dev/null | grep -o "2\.[6-9]\.[0-9]"`
                    if [ $? -ne 0 ]; then
                        printf 'Rebar >=2.6.0 and <3.0.0 required' >&2
                        exit 1
                    fi
                    eval REBAR=$2
                    shift 2
                    continue
                else
                    printf 'ERROR: "--rebar" requires valid path to executable.\n' >&2
                    exit 1
                fi
                ;;

            --user|-u)
                if [ -n "$2" ]; then
                    eval COUCHDB_USER=$2
                    shift 2
                    continue
                else
                    printf 'ERROR: "--user" requires a non-empty argument.\n' >&2
                    exit 1
                fi
                ;;
            --user=?*)
                eval COUCHDB_USER=${1#*=}
                ;;
            --user=)
                printf 'ERROR: "--user" requires a non-empty argument.\n' >&2
                exit 1
                ;;

            --prefix)
                if [ -n "$2" ]; then
                    eval PREFIX=$2
                    shift 2
                    continue
                else
                    printf 'ERROR: "--prefix" requires a non-empty argument.\n' >&2
                    exit 1
                fi
                ;;
            --prefix=?*)
                eval PREFIX=${1#*=}
                ;;
            --prefix=)
                printf 'ERROR: "--prefix" requires a non-empty argument.\n' >&2
                exit 1
                ;;

            --exec-prefix)
                if [ -n "$2" ]; then
                    eval EXEC_PREFIX=$2
                    shift 2
                    continue
                else
                    printf 'ERROR: "--exec-prefix" requires a non-empty argument.\n' >&2
                    exit 1
                fi
                ;;
            --exec-prefix=?*)
                eval EXEC_PREFIX=${1#*=}
                ;;
            --exec-prefix=)
                printf 'ERROR: "--exec-prefix" requires a non-empty argument.\n' >&2
                exit 1
                ;;

            --bindir)
                if [ -n "$2" ]; then
                    eval BINDIR=$2
                    shift 2
                    continue
                else
                    printf 'ERROR: "--bindir" requires a non-empty argument.\n' >&2
                    exit 1
                fi
                ;;
            --bindir=?*)
                eval BINDIR=${1#*=}
                ;;
            --bindir=)
                printf 'ERROR: "--bindir" requires a non-empty argument.\n' >&2
                exit 1
                ;;

            --libexecdir)
                if [ -n "$2" ]; then
                    eval LIBEXECDIR=$2
                    shift 2
                    continue
                else
                    printf 'ERROR: "--libexecdir" requires a non-empty argument.\n' >&2
                    exit 1
                fi
                ;;
            --libexecdir=?*)
                eval LIBEXECDIR=${1#*=}
                ;;
            --libexecdir=)
                printf 'ERROR: "--libexecdir" requires a non-empty argument.\n' >&2
                exit 1
                ;;

            --sysconfdir)
                if [ -n "$2" ]; then
                    eval SYSCONFDIR=$2
                    shift 2
                    continue
                else
                    printf 'ERROR: "--sysconfdir" requires a non-empty argument.\n' >&2
                    exit 1
                fi
                ;;
            --sysconfdir=?*)
                eval SYSCONFDIR=${1#*=}
                ;;
            --sysconfdir=)
                printf 'ERROR: "--sysconfdir" requires a non-empty argument.\n' >&2
                exit 1
                ;;

            --datarootdir)
                if [ -n "$2" ]; then
                    eval DATAROOTDIR=$2
                    shift 2
                    continue
                else
                    printf 'ERROR: "--datarootdir" requires a non-empty argument.\n' >&2
                    exit 1
                fi
                ;;
            --datarootdir=?*)
                eval DATAROOTDIR=${1#*=}
                ;;
            --datarootdir=)
                printf 'ERROR: "--datarootdir" requires a non-empty argument.\n' >&2
                exit 1
                ;;

            --datadir)
                if [ -n "$2" ]; then
                    eval DATADIR=$2
                    shift 2
                    continue
                else
                    printf 'ERROR: "--datadir" requires a non-empty argument.\n' >&2
                    exit 1
                fi
                ;;
            --datadir=?*)
                eval DATADIR=${1#*=}
                ;;
            --datadir=)
                printf 'ERROR: "--datadir" requires a non-empty argument.\n' >&2
                exit 1
                ;;

            --localstatedir)
                if [ -n "$2" ]; then
                    eval LOCALSTATEDIR=$2
                    shift 2
                    continue
                else
                    printf 'ERROR: "--localstatedir" requires a non-empty argument.\n' >&2
                    exit 1
                fi
                ;;
            --localstatedir=?*)
                eval LOCALSTATEDIR=${1#*=}
                ;;
            --localstatedir=)
                printf 'ERROR: "--localstatedir" requires a non-empty argument.\n' >&2
                exit 1
                ;;

            --runstatedir)
                if [ -n "$2" ]; then
                    eval RUNSTATEDIR=$2
                    shift 2
                    continue
                else
                    printf 'ERROR: "--runstatedir" requires a non-empty argument.\n' >&2
                    exit 1
                fi
                ;;
            --runstatedir=?*)
                eval RUNSTATEDIR=${1#*=}
                ;;
            --runstatedir=)
                printf 'ERROR: "--runstatedir" requires a non-empty argument.\n' >&2
                exit 1
                ;;

            --docdir)
                if [ -n "$2" ]; then
                    eval DOCDIR=$2
                    shift 2
                    continue
                else
                    printf 'ERROR: "--docdir" requires a non-empty argument.\n' >&2
                    exit 1
                fi
                ;;
            --docdir=?*)
                eval DOCDIR=${1#*=}
                ;;
            --docdir=)
                printf 'ERROR: "--docdir" requires a non-empty argument.\n' >&2
                exit 1
                ;;

            --mandir)
                if [ -n "$2" ]; then
                    eval MANDIR=$2
                    shift 2
                    continue
                else
                    printf 'ERROR: "--mandir" requires a non-empty argument.\n' >&2
                    exit 1
                fi
                ;;
            --mandir=?*)
                eval MANDIR=${1#*=}
                ;;
            --mandir=)
                printf 'ERROR: "--mandir" requires a non-empty argument.\n' >&2
                exit 1
                ;;

            --infodir)
                if [ -n "$2" ]; then
                    eval INFODIR=$2
                    shift 2
                    continue
                else
                    printf 'ERROR: "--infodir" requires a non-empty argument.\n' >&2
                    exit 1
                fi
                ;;
            --infodir=?*)
                eval INFODIR=${1#*=}
                ;;
            --infodir=)
                printf 'ERROR: "--infodir" requires a non-empty argument.\n' >&2
                exit 1
                ;;

            --libdir)
                if [ -n "$2" ]; then
                    eval LIBDIR=$2
                    shift 2
                    continue
                else
                    printf 'ERROR: "--libdir" requires a non-empty argument.\n' >&2
                    exit 1
                fi
                ;;
            --libdir=?*)
                eval LIBDIR=${1#*=}
                ;;
            --libdir=)
                printf 'ERROR: "--libdir" requires a non-empty argument.\n' >&2
                exit 1
                ;;

            --databasedir)
                if [ -n "$2" ]; then
                    eval DATABASEDIR=$2
                    shift 2
                    continue
                else
                    printf 'ERROR: "--databasedir" requires a non-empty argument.\n' >&2
                    exit 1
                fi
                ;;
            --databasedir=?*)
                eval DATABASEDIR=${1#*=}
                ;;
            --databasedir=)
                printf 'ERROR: "--databasedir" requires a non-empty argument.\n' >&2
                exit 1
                ;;

            --viewindexdir)
                if [ -n "$2" ]; then
                    eval VIEWDIR=$2
                    shift 2
                    continue
                else
                    printf 'ERROR: "--viewindexdir" requires a non-empty argument.\n' >&2
                    exit 1
                fi
                ;;
            --viewindexdir=?*)
                eval VIEWDIR=${1#*=}
                ;;
            --viewindexdir=)
                printf 'ERROR: "--viewindexdir" requires a non-empty argument.\n' >&2
                exit 1
                ;;

            --logdir)
                if [ -n "$2" ]; then
                    eval LOGDIR=$2
                    shift 2
                    continue
                else
                    printf 'ERROR: "--logdir" requires a non-empty argument.\n' >&2
                    exit 1
                fi
                ;;
            --logdir=?*)
                eval LOGDIR=${1#*=}
                ;;
            --logdir=)
                printf 'ERROR: "--logdir" requires a non-empty argument.\n' >&2
                exit 1
                ;;

            --htmldir)
                if [ -n "$2" ]; then
                    eval HTMLDIR=$2
                    shift 2
                    continue
                else
                    printf 'ERROR: "--htmldir" requires a non-empty argument.\n' >&2
                    exit 1
                fi
                ;;
            --htmldir=?*)
                eval HTMLDIR=${1#*=}
                ;;
            --htmldir=)
                printf 'ERROR: "--htmldir" requires a non-empty argument.\n' >&2
                exit 1
                ;;

            --pdfdir)
                if [ -n "$2" ]; then
                    eval PDFDIR=$2
                    shift 2
                    continue
                else
                    printf 'ERROR: "--pdfdir" requires a non-empty argument.\n' >&2
                    exit 1
                fi
                ;;
            --pdfdir=?*)
                eval PDFDIR=${1#*=}
                ;;
            --pdfdir=)
                printf 'ERROR: "--pdfdir" requires a non-empty argument.\n' >&2
                exit 1
                ;;

            --) # End of options
                shift
                break
                ;;
            -?*)
                echo "WARNING: Unkonwn option '$1', ignoring" >&2
                shift
                ;;
            *) # Done
                break
        esac
        shift
    done

    # defaults
    if test -z "$PREFIX"; then
        PREFIX="$DEFAULT_PREFIX";
    fi
    if test -z "$EXEC_PREFIX"; then
        EXEC_PREFIX="$PREFIX";
    fi
    if test -z "$BINDIR"; then
        BINDIR="$EXEC_PREFIX/bin";
    fi
    if test -z "$LIBEXECDIR"; then
        LIBEXECDIR="$EXEC_PREFIX/libexec";
    fi
    if test -z "$SYSCONFDIR"; then
        SYSCONFDIR="$PREFIX/etc";
    fi
    if test -z "$DATAROOTDIR"; then
        DATAROOTDIR="$PREFIX/share";
    fi
    if test -z "$DATADIR"; then
        DATADIR="$DATAROOTDIR";
    fi
    if test -z "$LOCALSTATEDIR"; then
        LOCALSTATEDIR="$PREFIX/var";
    fi
    if test -z "$RUNSTATEDIR"; then
        RUNSTATEDIR="$LOCALSTATEDIR/run";
    fi
    if test -z "$DOCDIR"; then
        DOCDIR="$DATAROOTDIR/doc/apache-couchdb";
    fi
    if test -z "$INFODIR"; then
        INFODIR="$DATAROOTDIR/info";
    fi
    if test -z "$MANDIR"; then
        MANDIR="$DATAROOTDIR/man";
    fi
    if test -z "$LIBDIR"; then
        LIBDIR="$EXEC_PREFIX/lib";
    fi
    if test -z "$DATABASEDIR"; then
        DATABASEDIR="$LOCALSTATEDIR/lib/couchdb";
    fi
    if test -z "$VIEWDIR"; then
        VIEWDIR="$LOCALSTATEDIR/lib/couchdb";
    fi
    if test -z "$LOGDIR"; then
        LOGDIR="$LOCALSTATEDIR/log";
    fi
    if test -z "$HTMLDIR"; then
        HTMLDIR="$DOCDIR/html";
    fi
    if test -z "$PDFDIR"; then
        PDFDIR="$DOCDIR/pdf";
    fi
}

parse_opts $@

# We use this for testing this script
# The test script lives in test/build/test-configure.sh
if [ "$TEST" = "1" ]; then
    echo $PREFIX $EXEC_PREFIX $BINDIR $LIBEXECDIR $SYSCONFDIR $DATAROOTDIR \
         $DATADIR $LOCALSTATEDIR $RUNSTATEDIR $DOCDIR $LIBDIR $DATABASEDIR \
         $VIEWDIR $LOGDIR $MANDIR $INFODIR $HTMLDIR $PDFDIR
    exit 0
fi

# Translate ./configure variables to CouchDB variables

INSTALLDIR=$LIBDIR/couchdb
LOG_FILE=$LOGDIR/couch.log


echo "==> configuring couchdb in rel/couchdb.config"
cat > rel/couchdb.config << EOF
% 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.
%
% The contents of this file are auto-generated by configure
%
{package_author_name, "$PACKAGE_AUTHOR_NAME"}.
{prefix, "$INSTALLDIR"}.
{data_dir, "$DATABASEDIR"}.
{view_index_dir, "$VIEWDIR"}.
{log_file, "$LOG_FILE"}.
{fauxton_root, "$DATAROOTDIR/couchdb/www"}.
{user, "$COUCHDB_USER"}.
{node_name, "-name couchdb"}.
{cluster_port, 5984}.
{backend_port, 5986}.
EOF

cat > install.mk << EOF
# 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.
#
# The contents of this file are auto-generated by configure
#
package_author_name = $PACKAGE_AUTHOR_NAME
install_dir = $INSTALLDIR

bin_dir = $BINDIR
libexec_dir = $LIBEXECDIR/couchdb
doc_dir = $DOCDIR/couchdb
sysconf_dir = $SYSCONFDIR/couchdb
data_dir = $DATADIR/couchdb

database_dir = $DATABASEDIR
view_index_dir = $VIEWDIR
log_file = $LOG_FILE

html_dir = $HTMLDIR
pdf_dir = $PDFDIR
man_dir = $MANDIR
info_dir = $INFODIR

with_fauxton = $WITH_FAUXTON
with_docs = $WITH_DOCS

user = $COUCHDB_USER
EOF

cat > $rootdir/config.erl << EOF
{with_curl, $WITH_CURL}.
{couch_log_backend, couch_log_lager}.
{couch_log_backend_apps, {list, [couch_log_lager]}}.
EOF


install_local_rebar() {
    if [ ! -x "${rootdir}/bin/rebar" ]; then
        if [ ! -d "${rootdir}/src/rebar" ]; then
            git clone --depth 1 --branch 2.6.0 https://git-wip-us.apache.org/repos/asf/couchdb-rebar.git ${rootdir}/src/rebar
        fi
        make -C ${rootdir}/src/rebar
        mv ${rootdir}/src/rebar/rebar ${rootdir}/bin/rebar
        make -C ${rootdir}/src/rebar clean
    fi
}


if [ -z "${REBAR}" ]; then
    install_local_rebar
    REBAR=${rootdir}/bin/rebar
fi


# only update dependencies, when we are not in a release tarball
if [ -d .git  -a $SKIP_DEPS -ne 1 ]; then
    echo "==> updating dependencies"
    ${REBAR} get-deps update-deps
fi
