#!/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;
}

# check for `ruby` command
type ruby > /dev/null 2>&1 || {
    # TODO: check for Ruby 1.8
    echo "This package requires Ruby 1.8, please install it first." >&2;
}

site_packages=`ruby -e 'print $:[0]'`
site_arch_packages=`ruby -r rbconfig -e 'print $:[0] + "/" + Config::CONFIG["arch"]'`
rbver=`ruby -e 'printf("%s.%s", *RUBY_VERSION.split("."))'`

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

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

  Installation Directories:
    --prefix=PREFIX        installs to [PREFIX/lib/ruby/site_ruby/${rbver}]
    --home=PATH            installs to [PATH/lib/ruby]

  Optional Features:
    --enable-debug         compile in debugging mode

  Required Packages in Non-Standard Locations:
    --with-broccoli=PATH   path to Broccoli install root
    --with-ruby=PATH       path to Ruby interpreter
    --with-ruby-lib=PATH   path to libruby
    --with-ruby-inc=PATH   path to Ruby headers
    --with-swig=PATH       path to SWIG executable

  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
CMakeCacheEntries=""
append_cache_entry RB_INSTALL_DIR           PATH     $site_packages
append_cache_entry RB_ARCH_INSTALL_DIR      PATH     $site_arch_packages
append_cache_entry ENABLE_DEBUG             BOOL     false
append_cache_entry RUBY_EXECUTABLE          PATH     `which ruby`

# 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=*)
            append_cache_entry RB_INSTALL_DIR   PATH    $optarg/lib/ruby/site_ruby/${rbver}
            append_cache_entry RB_ARCH_INSTALL_DIR   PATH    $optarg/lib/ruby/site_ruby/${rbver}
            ;;
        --home=*)
            append_cache_entry RB_INSTALL_DIR   PATH    $optarg/lib/ruby
            append_cache_entry RB_ARCH_INSTALL_DIR   PATH    $optarg/lib/ruby
            ;;
        --enable-debug)
            append_cache_entry ENABLE_DEBUG         BOOL    true
            ;;
        --with-broccoli=*)
            append_cache_entry Broccoli_ROOT_DIR    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
            ;;
        *)
            echo "Invalid option '$1'.  Try $0 --help to see available options."
            exit 1
            ;;
    esac
    shift
done

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
