#!/bin/sh

# simple configure script for user-friendliness

# file to put output into for cmake to read in...
OUTFILE=$(dirname $0)/Makefile.cmake.in
CMAKEOUTFILE=$(dirname $0)/CMakeOptions.txt

# --- FUNCTIONS ---

usage()
{
echo "

Hi there.  You can use this script to configure parameters used by cmake.
Currently, understood parameters are as follows:

  --prefix=PREFIX         install architecture-independent files in PREFIX
  --enable-debug=ARG      enables debug symbols (yes|no) default=no
  --enable-tests=ARG      enable test suite (yes|no) default=no
  --with-pilot-link=PATH  set prefix for pilot-link files [default=check]
  --with-mal=PATH         set path for libmal files [default=check]

  --show                  show existing configuration values

More obscure options:

  --with-simple-builddir=ARG      use 'build' instead of longer name (yes|no) default=no
  --with-pilot-link-includes=PATH set include directory for pilot-link
  --with-pilot-link-lib=PATH      set full path to libpisock.so

"
}

getvalue()
{
	KEY="$1"
	# use dynamic variable...
	eval VAL='$'$KEY

	ECHO="$2"
	
	if test -n "$VAL"
	then
		CMAKE_FLAGS="${CMAKE_FLAGS}set(${KEY} \"${VAL}\")
"
		if [ "$ECHO" = "y" ]
		then
			echo "$KEY=\"$VAL\""
		fi
	fi

}

outputCmakeValues()
{

# only include what we're passed
CMAKE_FLAGS=""

getvalue CMAKE_INSTALL_PREFIX n
getvalue CMAKE_BUILD_TYPE n
getvalue ENABLE_TESTS n
#getvalue BUILD_DIR y
getvalue PILOTLINK_BASE n
getvalue MAL_BASE n
getvalue PILOTLINK_INCLUDE_DIR n
getvalue PILOTLINK_LIBRARY n

echo "$CMAKE_FLAGS"
}

outputMakeValues()
{
getvalue BUILD_DIR y
}

# --- MAIN ---

# first, if there's no args, don't lose what we had stored (badness).
# simply show what available arguments are and exit...
if test -z "$1"; then
	usage
	exit
fi

CMAKE_BUILD_TYPE="normal"
ENABLE_TESTS="NO"
BUILD_DIR=build-`uname -sr | tr -d [:space:] | tr -Cs a-zA-Z0-9 _`

while test -n "$1"
do
	case "$1" in
		--prefix=*)
			CMAKE_INSTALL_PREFIX=$(echo $1 | cut -d "=" -f2)
			;;
		--enable-debug*)
			T=$(echo $1 | cut -d "=" -f2 | tr '[A-Z]' '[a-z]')
			if test "$T" = "$1" || test "yes" = "$T" || test "full" = "$T" ; then
				CMAKE_BUILD_TYPE=debug
			else
				CMAKE_BUILD_TYPE=normal
			fi
			;;
		--enable-test*)
			T=$(echo "$1" | cut -d = -f2 | tr '[A-Z]' '[a-z]')
			if test "$T" = "$1" || test "yes" = "$T" ; then
				ENABLE_TESTS=YES
			else
				ENABLE_TESTS=NO
			fi
			;;
		--with-simple-builddir*)
			T=$(echo "$1" | cut -d = -f2 | tr '[A-Z]' '[a-z]')
			if test "$T" = "$1" || test "yes" = "$T" ; then
				BUILD_DIR=build
			fi
			;;
		--with-pilot-link-includes=*)
			PILOTLINK_INCLUDE_DIR=$(echo $1 | cut -d = -f2)
			;;
		--with-pilot-link-lib=*)
			PILOTLINK_LIBRARY=$(echo $1 | cut -d = -f2)
			;;
		--with-pilot-link=*)
			PILOTLINK_BASE=$(echo $1 | cut -d "=" -f2)
			;;
		--with-mal=*)
			MAL_BASE=$(echo $1 | cut -d "=" -f2)
			;;
		--show)
			echo "Existing configuration values:"
			echo "-----------"
			cat "$OUTFILE" 2>/dev/null
			sed 's/^set(\([A-Z_]*\) "\(.*\)")/\1="\2"/' "$CMAKEOUTFILE" 2>/dev/null
			echo "-----------"
			exit
			;;
		*)
			usage
			exit
			;;
	esac

	shift

done

###
#
# BSD uses gmake for the GNU make which we need ...
#
if uname -s | grep BSD > /dev/null 2>&1 ; then
	MAKE=gmake
else
	MAKE=make
fi

outputCmakeValues > "$CMAKEOUTFILE.new"
outputMakeValues > "$OUTFILE.new"


###
#
# If the configure values have changed, then we should update the 
# CMakeLists.txt in order to prompt a re-run of cmake.
#
update=no
failed=no
if test -f "$CMAKEOUTFILE" ; then
	diff -q "$CMAKEOUTFILE" "$CMAKEOUTFILE.new" > /dev/null 2>&1 || update=yes
else
	update=yes
fi

if test -f "$OUTFILE" ; then
	diff -q "$OUTFILE" "$OUTFILE.new" > /dev/null 2>&1 || update=yes
else
	update=yes
fi

if test yes = "$update" ; then
	cp "$CMAKEOUTFILE.new" "$CMAKEOUTFILE"
	cp "$OUTFILE.new" "$OUTFILE"
	touch CMakeLists.txt
	$MAKE -f Makefile.cmake build-check || failed=yes
fi

rm -f "$CMAKEOUTFILE.new"
rm -f "$OUTFILE.new"
rm -f build*/CMakeCache.txt

###
#
# Inform user and create settings file.
#
echo "
Thanks.  Here are the values I will be using...

$(outputCmakeValues)

$(outputMakeValues)

To compile KPilot, now run GNU make, like so:

    $MAKE -f Makefile.cmake

"

if test "yes" = "$failed" ; then
	echo "Configuration failed, so take a good look at the build output."
fi

