#!/bin/sh
# Convenience wrapper for easily viewing/setting options that
# the project's CMake scripts will recognize

command="$0 $*"
sourcedir="$( cd "$( dirname "$0" )" && pwd )"
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 Options:
    --builddir=DIR         place build files in directory [build]
    --generator=GENERATOR  CMake generator to use (see cmake --help)

  Installation Directories:
    --prefix=PREFIX        installation directory [/usr/local]

  Optional Features:
    --enable-debug         compile in debugging mode
    --enable-perftools     use Google perftools

  Required Packages in Non-Standard Locations:
    --with-boost=PATH      path to Boost install root

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

# Appends 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 CMAKE_INSTALL_PREFIX PATH   /usr/local
append_cache_entry ENABLE_DEBUG         BOOL   false

# 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
            ;;
        --generator=*)
            CMakeGenerator="$optarg"
            ;;
        --prefix=*)
            append_cache_entry CMAKE_INSTALL_PREFIX PATH   $optarg
            ;;
        --enable-debug)
            append_cache_entry ENABLE_DEBUG         BOOL   true
            ;;
        --with-boost=*)
            append_cache_entry BOOST_ROOT PATH $optarg
            ;;
        *)
            echo "Invalid option '$1'.  Try $0 --help to see available options."
            exit 1
            ;;
    esac
    shift
done

if [ -d $builddir ]; then
    if [ -f $builddir/CMakeCache.txt ]; then
        rm -f $builddir/CMakeCache.txt
    fi
else
    mkdir -p $builddir
fi

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

if [ -n "$CMakeGenerator" ]; then
    cmake -G "$CMakeGenerator" $CMakeCacheEntries $sourcedir
else
    cmake $CMakeCacheEntries $sourcedir
fi

echo "# This is the command used to configure this build" > config.status
if [ -n "$CC" ]; then
  printf "CC=%s" $CC >> config.status
  printf ' ' >> config.status
fi
if [ -n "$CXX" ]; then
  printf "CXX=%s" $CXX >> config.status
  printf ' ' >> config.status
fi
echo $command >> config.status
chmod u+x config.status

cd ..

printf "DIRS := %s\n\n" $builddir > $sourcedir/Makefile
makefile=$(cat <<'EOT'
all:
	@for i in $(DIRS); do $(MAKE) -C $$i $@; done

doc:
	$(MAKE) -C $@

test:
	@for i in $(DIRS); do $(MAKE) -C $$i $@; done

install:
	@for i in $(DIRS); do $(MAKE) -C $$i $@; done

uninstall:
	@for i in $(DIRS); do $(MAKE) -C $$i $@; done

clean:
	@for i in $(DIRS); do $(MAKE) -C $$i $@; done

distclean:
	rm -rf $(DIRS) Makefile

.PHONY: all doc test install uninstall clean distclean
EOT
)

echo "$makefile" >> $sourcedir/Makefile
