#!/usr/bin/env bash

# Autotools-style (./configure) wrapper for CMake
# <https://github.com/nemequ/configure-cmake>
#
#   *** IMPORTANT ***
#
#   You must include the GNUInstallDirs module (which comes with
#   CMake) in your project.  Just put "include (GNUInstallDirs)" in
#   you CMakeLists.txt and you should be good.
#
# This script was originally written for Squash
# <https://quixdb.github.io/squash/> by Evan Nemerson
# <evan@nemerson.com>, but has been spun off into a separate
# repository.  Please feel free to copy it into your own repository,
# though I would appreciate it if you would post improvements, bugs,
# feature requests, etc. to the issue tracker at
# <https://github.com/nemequ/configure-cmake/issues>.
#
# To the extent possible under law, the author(s) hereby waive all
# copyright and related or neighboring rights to this work.  For
# details, see <https://creativecommons.org/publicdomain/zero/1.0/>

TOP_SRCDIR="$(dirname $0)"

if [ "${CMAKE_CMD}" = "" ]; then
    CMAKE_CMD="cmake"
fi

BUILD_TYPE="Debug"
PREFIX=/usr/local
LIBDIR=
CMAKE_ARGS=

if [ -e "${TOP_SRCDIR}/.configure-custom.sh" ]; then
    . "${TOP_SRCDIR}/.configure-custom.sh"
fi

quote() {
    echo "$1" | sed -e "s|'|'\\\\''|g; 1s/^/'/; \$s/\$/'/"
}

extract_var_string() {
    VAR_NAME=$1
    VAR_NAME=$(echo $1 | sed -e 's/[ \t]*$//')
    if [ "x$2" != "x" ]; then
        VAR_VALUE=$2
    else
        VAR_VALUE=yes
    fi

    if [ "x$3" != "x" ]; then
        VAR_UC_NAME=$3
    else
        VAR_UC_NAME=$(echo "$1" | tr '[:lower:]' '[:upper:]' | tr -c '[:alnum:]' '_' | sed 's/_$//g')
    fi
}

set_config_var() {
    is_with=n
    case "$1" in
        "--enable-"*)
            name="${1#--enable-}"
            cfg="${ENABLE_VARS}"
            ;;
        "--disable-"*)
            name="${1#--disable-}";
            cfg="${DISABLE_VARS}";
            ;;
        "--with-"*)
            # IFS="=" read -ra WITHARGS <<< "${1}"
            name="${1#--with-}"
            cfg="${WITH_VARS}"
            is_with=y
            ;;
    esac

    found=n
    for varstring in $cfg; do
        extract_var_string $(echo "${varstring}" | tr '|' ' ')
        if [ "x$VAR_NAME" = "x$name" ]; then
            found=y
            break;
        fi
    done

    if [ "$found" = "y" ]; then
        if [ "x$is_with" = "xy" ]; then
            CMAKE_ARGS="$CMAKE_ARGS -D${VAR_UC_NAME}=$(quote "$2")"
        else
            CMAKE_ARGS="$CMAKE_ARGS -D${VAR_UC_NAME}=$(quote "${VAR_VALUE}")"
        fi
    else
        echo "Unknown parameter: ${1}"
        exit 1
    fi
}

prefix_to_offset() {
    expr $(echo "${1}" | awk '{ print length }') + 1
}

print_help() {
    cat <<EOF >&2
  -h, --help              display this help and exit
  --disable-debug         disable debugging mode
  --pass-thru             pass remaining arguments through to CMake

  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [$PREFIX]
  --bindir=DIR            user executables [PREFIX/bin]
  --sbindir=DIR           system admin executables [PREFIX/sbin]
  --libexecdir=DIR        program executables [PREFIX/libexec]
  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
  --libdir=DIR            object code libraries [PREFIX/lib]
  --includedir=DIR        C header files [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
  --infodir=DIR           info documentation [DATAROOTDIR/info]
  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
  --mandir=DIR            man documentation [DATAROOTDIR/man]
  --docdir=DIR            documentation root [DATAROOTDIR/doc/PROJECT_NAME]
EOF

    first=y
    for varstring in ${ENABLE_VARS}; do
        if [ $first = 'y' ]; then
            echo ""
            first=n
        fi
        extract_var_string $(echo "${varstring}" | tr '|' ' ')
        var_doc_name="ENABLE_${VAR_UC_NAME}_DOC"
        eval "docstring=\$$var_doc_name"
        if [ "x${docstring}" = "x" ]; then
            printf "  --enable-%-14s enable %s support\n" "${VAR_NAME}" "$(echo -n "${VAR_NAME}" | tr '-' ' ')"
        else
            printf "  --enable-%-14s %s\n" "${VAR_NAME}" "$docstring"
        fi
    done

    first=y
    for varstring in ${DISABLE_VARS}; do
        if [ $first = 'y' ]; then
            echo ""
            first=n
        fi
        extract_var_string $(echo "${varstring}" | tr '|' ' ')
        var_doc_name="DISABLE_${VAR_UC_NAME}_DOC"
        eval "docstring=\$$var_doc_name"
        if [ "x${docstring}" = "x" ]; then
            printf "  --disable-%-13s disable %s support\n" "${VAR_NAME}" "$(echo -n "${VAR_NAME}" | tr '-' ' ')"
        else
            printf "  --disable-%-13s %s\n" "${VAR_NAME}" "$docstring"
        fi
    done

    first=y
    for varstring in ${WITH_VARS}; do
        if [ $first = 'y' ]; then
            echo ""
            first=n
        fi
        extract_var_string $(echo "${varstring}" | tr '|' ' ')
        var_doc_name="WITH_${VAR_UC_NAME}_DOC"
        eval "docstring=\$$var_doc_name"
        paraminfo="${VAR_NAME}=${VAR_VALUE}"
        if [ "x${docstring}" = "x" ]; then
            printf "  --with-%-16s enable %s support\n" "$paraminfo" "$(echo -n "${VAR_NAME}" | tr '-' ' ')"
        else
            printf "  --with-%-16s %s\n" "$paraminfo" "$docstring"
        fi
    done

    exit 0
}

while [ $# != 0 ]; do
    case "$1" in
        "--prefix="*)
            PREFIX="${1#*=}";;
        "--prefix")
            PREFIX="${2}"; shift;;
        "--bindir="*)
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_BINDIR=$(quote "${1#*=}")";;
        "--bindir")
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_BINDIR=$(quote "$2")"; shift;;
        "--sbindir="*)
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SBINDIR=$(quote "${1#*=}")";;
        "--sbindir")
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SBINDIR=$(quote "$2")"; shift;;
        "--libexecdir="*)
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LIBEXECDIR=$(quote "${1#*=}")";;
        "--libexecdir")
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LIBEXECDIR=$(quote "$2")"; shift;;
        "--sysconfdir="*)
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SYSCONFDIR=$(quote "${1#*=}")";;
        "--sysconfdir")
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SYSCONFDIR=$(quote "$2")"; shift;;
        "--sharedstatedir="*)
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SHAREDSTATEDIR=$(quote "${1#*=}")";;
        "--sharedstatedir")
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SHAREDSTATEDIR=$(quote "$2")"; shift;;
        "--localstatedir="*)
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LOCALSTATEDIR=$(quote "${1#*=}")";;
        "--localstatedir")
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LOCALSTATEDIR=$(quote "$2")"; shift;;
        "--libdir="*)
            LIBDIR="${1#*=}";;
        "--libdir")
            LIBDIR="${2}"; shift;;
        "--includedir="*)
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_INCLUDEDIR=$(quote "${1#*=}")";;
        "--includedir")
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_INCLUDEDIR=$(quote "$2")"; shift;;
        "--oldincludedir="*)
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_OLDINCLUDEDIR=$(quote "${1#*=}")";;
        "--oldincludedir")
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_OLDINCLUDEDIR=$(quote "$2")"; shift;;
        "--datarootdir="*)
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DATAROOTDIR=$(quote "${1#*=}")";;
        "--datarootdir")
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DATAROOTDIR=$(quote "$2")"; shift;;
        "--datadir="*)
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DATADIR=$(quote "${1#*=}")";;
        "--datadir")
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DATADIR=$(quote "$2")"; shift;;
        "--infodir="*)
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_INFODIR=$(quote "${1#*=}")";;
        "--infodir")
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_INFODIR=$(quote "$2")"; shift;;
        "--localedir="*)
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LOCALEDIR=$(quote "${1#*=}")";;
        "--localedir")
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LOCALEDIR=$(quote "$2")"; shift;;
        "--mandir="*)
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_MANDIR=$(quote "${1#*=}")";;
        "--mandir")
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_MANDIR=$(quote "$2")"; shift;;
        "--docdir="*)
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DOCDIR=$(quote "${1#*=}")";;
        "--docdir")
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DOCDIR=$(quote "$2")"; shift;;

        "CC="*)
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_C_COMPILER=$(quote "${1#*=}")";;
        "CXX="*)
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_CXX_COMPILER=$(quote "${1#*=}")";;
        "CFLAGS="*)
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_C_FLAGS=$(quote "${1#*=}")";;
        "CXXFLAGS="*)
            CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_CXX_FLAGS=$(quote "${1#*=}")";;
        "LDFLAGS="*)
            LDFLAGS="$LDFLAGS ${1#*=}";;

        "--help")
            print_help;;
        "-h")
            print_help;;

        # This flag is the only one which may be a bit surprising to
        # people.  Autotools always builds with debugging symbols enabled
        # (AFAIK), but for cmake you have to do -DCMAKE_BUILD_TYPE=Debug.
        # Unfortunately this can change other things as well, so although
        # I realize there is no --disable-debug flag I thought it would be
        # prudent to support one here.
        "--disable-debug")
            BUILD_TYPE="Release";;

        "--pass-thru")
            shift;
            while [ $# != 0 ]; do
                CMAKE_ARGS="$CMAKE_ARGS $(quote "${1}")";
                shift;
            done;;

        "--enable-"*)
            set_config_var "$1"
            ;;

        "--disable-"*)
            set_config_var "$1"
            ;;

        "--with-"*)
            name=$(echo "${1#--with-}" | awk '{split($1,v,"="); print v[1]}')
            case "${1}" in
                "--with-${name}="*)
                    set_config_var "--with-${name}" "${1#--with-${name}=}";;
                "--with-${name}")
                    set_config_var "$1" "$2";
                    shift;;
            esac
            ;;

        *)
            echo "$0: error: unrecognized option: \`$1'" >&2
            echo "Try \`$0 --help' for more information" >&2
            exit -1
    esac;
    shift
done

if [ "x${LIBDIR}" = "x" ]; then
    LIBDIR="${PREFIX}/lib"
fi

# Unlike CFLAGS/CXXFLAGS/CC/CXX, LDFLAGS isn't handled by CMake, so we
# need to parse it here.
if [ "x${LDFLAGS}" != "x" ]; then
    for varname in EXE MODULE SHARED STATIC; do
        CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_${varname}_LINKER_FLAGS=$(quote "$LDFLAGS")"
    done
fi

eval "${CMAKE_CMD}" "${TOP_SRCDIR}" -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" -DCMAKE_INSTALL_PREFIX="${PREFIX}" -DCMAKE_INSTALL_LIBDIR="${LIBDIR}" ${CMAKE_ARGS}
