#!/bin/sh
# Convenience wrapper for easily viewing/setting options that
# the project's CMake scripts will recognize
set -e
command="$0 $*"

# check for `cmake` command
type cmake > /dev/null 2>&1 || {
    echo "\
This package requires CMake, please install it first, then you may
use this configure script to access CMake equivalent functionality.\
" >&2;
    exit 1;
}

usage="\
Usage: $0 [OPTION]... [VAR=VALUE]...

  Build Directory:
    --builddir=DIR         place build files in directory [build]

  Installation Directories:
    --prefix=PREFIX        installation directory [/usr/local]
    --conf-files-dir=DIR   config files installation directory [PREFIX/etc]
    --python-install-dir   the desired installation directory for
                           broccoli python bindings (if present)
                           [PREFIX/lib/python]
    --libdir=DIR           installation directory for static and dynamic
                           libraries [PREFIX/lib]

  Optional Features:
    --enable-debug         compile in debugging mode
    --enable-ruby          build ruby bindings for broccoli
    --disable-shared       don't build shared libraries [default=no]
                           (no effect on broccoli bindings)
    --disable-static       don't build static libraries [default=no]
    --disable-python       don't try to build python bindings for broccoli
    --disable-packets      Do not support tx/rx of pcap packets
    --with-configfile=FILE use config file at location <FILE>
                           instead of the default broccoli.conf

  Required Packages in Non-Standard Locations:
    --with-openssl=PATH    path to OpenSSL install root
    --with-flex=PATH       path to flex executable
    --with-bison=PATH      path to bison executable

  Optional Packages in Non-Standard Locations:
    --with-pcap=PATH       path to libpcap install root
    --with-python=PATH     path to Python interpreter
    --with-python-lib=PATH path to Python library
    --with-python-inc=PATH path to Python headers
    --with-ruby=PATH       path to Ruby interpreter
    --with-ruby-lib=PATH   path to Ruby library
    --with-ruby-inc=PATH   path to Ruby headers
    --with-swig=PATH       path to SWIG executable

  Packaging Options (for developers):
    --binary-package       toggle special logic for binary packaging
    --ignore-dirs=PATHS    paths to ignore when creating source package
                           (semicolon delimited and quoted when multiple)
    --pkg-name-prefix=NAME use the given name as the package prefix instead
                           of the default CMake project name
    --osx-sysroot=PATH     path to the OS X SDK to compile against
    --osx-min-version=VER  minimum OS X version (the deployment target)

  Influential Environment Variables (only on first invocation
  per build directory):
    CC                     C compiler command
    CFLAGS                 C compiler flags
    CXX                    C++ compiler command
    CXXFLAGS               C++ compiler flags
"

sourcedir="$( cd "$( dirname "$0" )" && pwd )"

# Function to append a CMake cache entry definition to the
# CMakeCacheEntries variable
#   $1 is the cache entry variable name
#   $2 is the cache entry variable type
#   $3 is the cache entry variable value
append_cache_entry () {
    CMakeCacheEntries="$CMakeCacheEntries -D $1:$2=$3"
}

# set defaults
builddir=build
prefix=/usr/local
CMakeCacheEntries=""
append_cache_entry CMAKE_INSTALL_PREFIX PATH     $prefix
append_cache_entry PY_MOD_INSTALL_DIR   PATH     $prefix/lib/python
append_cache_entry INSTALL_LIB_DIR      PATH     $prefix/lib
append_cache_entry ENABLE_DEBUG         BOOL     false
append_cache_entry BRO_PCAP_SUPPORT     BOOL     true
append_cache_entry CPACK_SOURCE_IGNORE_FILES STRING
append_cache_entry DISABLE_RUBY_BINDINGS     BOOL   true

# parse arguments
while [ $# -ne 0 ]; do
    case "$1" in
        -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
        *) optarg= ;;
    esac

    case "$1" in
        --help|-h)
            echo "${usage}" 1>&2
            exit 1
            ;;
        --builddir=*)
            builddir=$optarg
            ;;
        --prefix=*)
            prefix=$optarg
            append_cache_entry CMAKE_INSTALL_PREFIX PATH   $optarg
            append_cache_entry PY_MOD_INSTALL_DIR   PATH   $optarg/lib/python
            append_cache_entry INSTALL_LIB_DIR      PATH   $optarg/lib
            ;;
        --libdir=*)
            libdir=$optarg
            append_cache_entry INSTALL_LIB_DIR      PATH   $optarg
            ;;
        --conf-files-dir=*)
            append_cache_entry BRO_ETC_INSTALL_DIR  PATH   $optarg
            user_set_conffilesdir="true"
            ;;
        --enable-debug)
            append_cache_entry ENABLE_DEBUG         BOOL   true
            ;;
        --disable-shared)
            append_cache_entry ENABLE_SHARED        BOOL   false
            ;;
        --disable-static)
            append_cache_entry ENABLE_STATIC        BOOL   false
            ;;
        --disable-python)
            append_cache_entry DISABLE_PYTHON_BINDINGS     BOOL   true
            CMakeCacheEntries=`echo $CMakeCacheEntries | sed 's/-D PY_MOD_INSTALL_DIR:PATH=[^ ]* //g'`
            ;;
        --enable-ruby)
            append_cache_entry DISABLE_RUBY_BINDINGS     BOOL   false
            ;;
        --disable-packets)
            append_cache_entry BRO_PCAP_SUPPORT     BOOL   false
            ;;
        --with-configfile=*)
            append_cache_entry BRO_SYSCONF_FILE FILEPATH $optarg
            ;;
        --python-install-dir=*)
            append_cache_entry PY_MOD_INSTALL_DIR PATH $optarg
            ;;
        --with-openssl=*)
            append_cache_entry OPENSSL_ROOT_DIR PATH $optarg
            ;;
        --with-flex=*)
            append_cache_entry FLEX_EXECUTABLE PATH $optarg
            ;;
        --with-bison=*)
            append_cache_entry BISON_EXECUTABLE PATH $optarg
            ;;
        --with-pcap=*)
            append_cache_entry PCAP_ROOT_DIR PATH $optarg
            ;;
        --with-python=*)
            append_cache_entry PYTHON_EXECUTABLE    PATH    $optarg
            ;;
        --with-python-lib=*)
            append_cache_entry PYTHON_LIBRARY       PATH    $optarg
            ;;
        --with-python-inc=*)
            append_cache_entry PYTHON_INCLUDE_DIR   PATH    $optarg
            append_cache_entry PYTHON_INCLUDE_PATH  PATH    $optarg
            ;;
        --with-ruby=*)
            append_cache_entry RUBY_EXECUTABLE    PATH    $optarg
            ;;
        --with-ruby-lib=*)
            append_cache_entry RUBY_LIBRARY       PATH    $optarg
            ;;
        --with-ruby-inc=*)
            append_cache_entry RUBY_INCLUDE_DIR   PATH    $optarg
            append_cache_entry RUBY_INCLUDE_PATH  PATH    $optarg
            ;;
        --with-swig=*)
            append_cache_entry SWIG_EXECUTABLE      PATH    $optarg
            ;;
        --binary-package)
            append_cache_entry BINARY_PACKAGING_MODE BOOL true
            ;;
        --ignore-dirs=*)
            append_cache_entry CPACK_SOURCE_IGNORE_FILES STRING $optarg
            ;;
        --pkg-name-prefix=*)
            append_cache_entry PACKAGE_NAME_PREFIX STRING $optarg
            ;;
        --osx-sysroot=*)
            append_cache_entry CMAKE_OSX_SYSROOT PATH $optarg
            ;;
        --osx-min-version=*)
            append_cache_entry CMAKE_OSX_DEPLOYMENT_TARGET STRING $optarg
            ;;
        *)
            echo "Invalid option '$1'.  Try $0 --help to see available options."
            exit 1
            ;;
    esac
    shift
done

if [ "$user_set_conffilesdir" != "true" ]; then
    append_cache_entry BRO_ETC_INSTALL_DIR PATH $prefix/etc
fi

if [ -d $builddir ]; then
    # If build directory exists, check if it has a CMake cache
    if [ -f $builddir/CMakeCache.txt ]; then
        # If the CMake cache exists, delete it so that this configuration
        # is not tainted by a previous one
        rm -f $builddir/CMakeCache.txt
    fi
else
    # Create build directory
    mkdir -p $builddir
fi

echo "Build Directory : $builddir"
echo "Source Directory: $sourcedir"
cd $builddir
cmake $CMakeCacheEntries $sourcedir

echo "# This is the command used to configure this build" > config.status
echo $command >> config.status
chmod u+x config.status
