#!/usr/bin/env bash
#
# Copyright 2016 Software Freedom Conservancy Inc.
#
# This software is licensed under the GNU LGPL (version 2.1 or later).
# See the COPYING file in this distribution. 

srcdir=$(cd $(dirname $0) && pwd)

DEFAULT_PREFIX="/usr/local"

PREFIX=$DEFAULT_PREFIX

configure_help() {
    cat <<- EOT
    Usage:
      ./configure [OPTIONS]...

    Options:
      -h, --help            Print this help and exit.
      --prefix=PREFIX       Prepend PREFIX to program installation paths.
                            [$DEFAULT_PREFIX]
      --debug               Build for debugging.

      --disable-fatal-warnings
                            Disable Vala fatal warnings when compiling.
      --enable-ref-tracking
                            Enable reference tracking which is dumped to stdout when the program exits.
      --disable-schemas-compile
                            Disable compiling the GSettings schema.
      --disable-desktop-update
                            Disable desktop database update.
      --disable-desktop-validate
                            Disable checking for errors in generated desktop file.
      --disable-icon-update
                            Disable icon cache update.
      --disable-documentation
                            Disable generating and installing translated help documentation.
      --disable-contractor
                            Disable installing Contractor files.
      --disable-poodle-ssl3
                            Disable POODLE SSLv3 GnuTLS priority fix. (Not recommended.)

	Some influential environment variables:
      PKG_CONFIG_PATH       Adds directories to pkg-config's search path.
      PKG_CONFIG_LIBDIR     Overrides pkg-config's built-in search path.

      VALAC                 Name of the vala compiler to use, e.g. "valac-0.18".
      VALADOC               Name of the valadoc executable to use, e.g. "valadoc-0.18".

EOT
}

abort() {
    printf "%s: Invalid argument %s\n" $0 $1
    configure_help
    exit 1
}

while [ $# != 0 ]
do
    if [[ "$1" = *=* ]]
    then
        option=${1%%=*}
        value=${1#*=}
    else
        option=$1
        value=
    fi

    case $option in
        -h | --help)        configure_help
                            exit 0
                            ;;

        --prefix)           if [ -z "$value" ]; then
                                # handle jhbuild's use of "--prefix /path"
                                value="$2"
                                shift
                            fi
                            [ ! "$value" ] && abort $1
                            CMDLINE="${CMDLINE} -DCMAKE_INSTALL_PREFIX=${value}"
                            ;;

        # ignored for autotools compatibility
        --bindir | --libdir | --sbindir | --datadir | --localstatedir | \
        --includedir | --infodir | --sysconfdir |  --mandir | --libexecdir)
                            if [ -z "$value" ]; then
                                # handle jhbuild's use of "--option /path"
                                value="$2"
                                shift
                            fi
                            ;;
        --build | --host | --target) ;;
        --disable-gtk-doc | --disable-silent-rules | --disable-static ) ;;

        --debug)
                            CMDLINE="${CMDLINE} -DCMAKE_BUILD_TYPE=Debug"
                            ;;

        --disable-fatal-warnings)
                            CMDLINE="${CMDLINE} -DNO_FATAL_WARNINGS=ON"
                            ;;

        --enable-ref-tracking)
                            CMDLINE="${CMDLINE} -DREF_TRACKING=ON"
                            ;;

        --disable-schemas-compile)
                            CMDLINE="${CMDLINE} -DGSETTINGS_COMPILE=OFF"
                            CMDLINE="${CMDLINE} -DGSETTINGS_COMPILE_IN_PLACE=OFF"
                            ;;

        --disable-icon-update)
                            CMDLINE="${CMDLINE} -DICON_UPDATE=OFF"
                            ;;

        --disable-desktop-update)
                            CMDLINE="${CMDLINE} -DDESKTOP_UPDATE=OFF"
                            ;;

        --disable-desktop-validate)
                            CMDLINE="${CMDLINE} -DDESKTOP_VALIDATE=OFF"
                            ;;

        --disable-documentation)
                            CMDLINE="${CMDLINE} -DTRANSLATE_HELP=OFF"
                            ;;

        --disable-contractor)
                            CMDLINE="${CMDLINE} -DDISABLE_CONTRACT=ON"
                            ;;

        --disable-poodle-ssl3)
                            CMDLINE="${CMDLINE} -DDISABLE_POODLE=ON"
                            ;;

        VALAC)              [ ! $value ] && abort $1
                            VALAC=$value
                            ;;

        *)                  abort $option
                            ;;
    esac

    shift
done

# Verify use supplied vala executable
if [ -n "$VALAC" ]
then
    VALA_EXECUTABLE=`type -p "$VALAC"`

    if [ -z "$VALA_EXECUTABLE" ]
    then
        printf "$VALAC is not an executable program.\n"
        exit 1
    fi

    CMDLINE="${CMDLINE} -DVALA_EXECUTABLE='$VALA_EXECUTABLE'"
fi

# Verify use supplied valadoc executable
if [ -n "$VALADOC" ]
then
    VALADOC_EXECUTABLE=`type -p "$VALADOC"`

    if [ -z "$VALADOC_EXECUTABLE" ]
    then
        printf "$VALADOC is not an executable program.\n"
        exit 1
    fi

    CMDLINE="${CMDLINE} -DVALADOC_EXECUTABLE='$VALADOC_EXECUTABLE'"
fi


# Verify cmake is installed
# TODO: Check for minimum version number
if ! cmake --version
then
    printf "cmake must be installed to configure and build.\n"
    exit 1
fi

using_srcdir_ne_builddir=false
# Simple check to verify this script is running in the root of the source tree
if [ -e Makefile.in ]
then
    using_srcdir_ne_builddir=true
    # Remove existing Makefile so it's not left around if configure fails
    rm -f Makefile

    # Remove the build folder to force Cmake to update its cache.
    rm -fr build

     if ! mkdir -p build
     then
         printf "Unable to create build directory.\n"
         exit 1
     fi

     cd build
fi

if ! (cmake $CMDLINE ${srcdir})
then
    printf "Unable to prepare build directory.\n"
    exit 1
fi

if ${using_srcdir_ne_builddir}
then
    cd ..

    if ! cp -f ${srcdir}/Makefile.in Makefile
    then
        printf "Unable to prepare Makefile.\n"
        exit 1
    fi
fi

printf "Configured.  Type 'make' to build, 'make install' to install.\n"
