#!/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:
    --build-dir=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-tcmalloc       link against tcmalloc (requires gperftools)
    --enable-asan           enable AddressSanitizer (Clang x86_64 only)

  Required packages in non-standard locations:
    --with-editline=PATH    path to editline install root

  Optional packages in non-standard locations:
    --with-doxygen=PATH     path to Doxygen install root
"


# 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 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
            ;;
        --build-dir=*)
            builddir=$optarg
            ;;
        --generator=*)
            CMakeGenerator="$optarg"
            ;;
        --prefix=*)
            append_cache_entry SASH_PREFIX PATH $optarg
            append_cache_entry CMAKE_INSTALL_PREFIX PATH $optarg
            ;;
        --enable-debug)
            append_cache_entry ENABLE_DEBUG BOOL true
            ;;
        --enable-asan)
            append_cache_entry ENABLE_ADDRESS_SANITIZER BOOL true
            ;;
        --with-doxygen=*)
            append_cache_entry Doxygen_ROOT_DIR PATH $optarg
            ;;
        --with-editline=*)
            append_cache_entry EDITLINE_ROOT_DIR 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

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
if [ -n "$CXXFLAGS" ]; then
  printf "CXXFLAGS=%s" $CXXFLAGS >> config.status
  printf ' ' >> config.status
fi
echo $command >> config.status
chmod u+x config.status

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

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 test install uninstall clean distclean
EOT
)

echo "$makefile" >> $sourcedir/Makefile
