#!/bin/sh
# Configure script helper functions
# M.Tyler 2013-2-9


APP_NAME=
BIN_NAME=
LIB_NAME=
DATA_NAME=
MAKE_DIRS="src"
ENABLE_MAN_PAGE=


UNDERLINE_TEXT()
{
	LINES=$(echo "$1" | sed 's/./-/g' )

	echo
	echo $LINES
	echo "$1"
	echo $LINES
	echo
}


MTCF_MAKEFILE_CLEANUP()
{
	# On error exit
	set -e

	find . -name Makefile.gnulinux |
	while read FNAME
	do
		ONAME=$(echo $FNAME | sed 's/\.gnulinux$//')
		mv "$FNAME" "$ONAME"
	done

	# On error don't exit
	set +e
}

MTCF_MAKEFILE_SETUP()
{
	# Revert to original Makefile's
	MTCF_MAKEFILE_CLEANUP

	# On error exit
	set -e

	find . -name Makefile |
	while read FNAME
	do
		# Only move current Makefile if preferred alternative exists
		if [ -f "$FNAME.$1" ]
		then
			mv "$FNAME" "$FNAME.gnulinux"
			cp "$FNAME.$1" "$FNAME"
		fi
	done

	# On error don't exit
	set +e
}


MTCF_INIT()
{
	CWD=$(pwd)

	VERNUM=$(basename "$CWD" | awk -F "-" '{print $NF}')

	if [ "$(basename "$CWD")" = "$VERNUM" ]
	then
		VERNUM=$(cat $CWD/../VERSION)
	fi

	MT_VERSION="$APP_NAME $VERNUM"

	CONF_FILE=_conf.txt
	DEBUG=NO
	unset BIN_SUFFIX
	unset HELP
	unset PKGCONFIG

	# GNU/Linux
	CC=${CC:-gcc}
	CXX=${CXX:-g++}
	BIN_FLAGS=${BIN_FLAGS:--fPIC}
	PREFIX="/usr"

	BIN_INSTALL="$PREFIX/bin"
	HEAD_INSTALL="$PREFIX/include"
	LIB_INSTALL="$PREFIX/lib"
	DATA_INSTALL="$PREFIX/share"

	MAN_INSTALL="/usr/share/man/man1"
}


MTCF_PARSE_ARG1()
{
	case "$1" in

	"flush" )	echo Clearing out directory to original state
			echo
			make clean
			echo
			rm $CONF_FILE
			MTCF_MAKEFILE_CLEANUP
			exit
			;;

	"debug" )	DEBUG=YES
			;;

	"debugold" )	DEBUG=OLD
			;;

	"pack" )	./configure flush
			PKNAME=$(basename $(pwd))
			ARNAME=$PKNAME.tar.xz
			if [ -e ~/$ARNAME ]
			then
				echo
				echo "File already exists: ~/$ARNAME"
				echo
				exit
			fi
			cd ..
			tar cJvf ~/$ARNAME $PKNAME
			exit
			;;

	"wc" )		wc $(find ./src -name \*.c -o -name \*.h -o -name \*.yy -o -name \*.cpp)
			exit
			;;

	"--help" )	HELP=1
			;;

	"--prefix="* )	MT_PREFIX=$(echo "$A" | sed "s/--prefix=//")
			BIN_INSTALL="$MT_PREFIX/bin"
			LIB_INSTALL="$MT_PREFIX/lib"
			HEAD_INSTALL="$MT_PREFIX/include"
			DATA_INSTALL="$MT_PREFIX/share"
			;;

	"--bindir="* )	BIN_INSTALL=$(echo "$A" | sed "s/--bindir=//")
			;;

	"--datadir="* )	DATA_INSTALL=$(echo "$A" | sed "s/--datadir=//")
			;;

	"--includedir="* )
			HEAD_INSTALL=$(echo "$A" | sed "s/--includedir=//")
			;;

	"--libdir="* )	LIB_INSTALL=$(echo "$A" | sed "s/--libdir=//")
			;;

	"--mandir="* )	MAN_INSTALL=$(echo "$A" | sed "s/--mandir=//")
			;;

	"--disable-man" )
			ENABLE_MAN_PAGE=
			;;

	* )		echo ERROR - Unknown command \"$A\"
			exit 1
			;;
	esac
}



MTCF_PARSE_ARGS()
{
for A in "$@"
do
	case "$A" in
	* )		MTCF_PARSE_ARG1 "$A"
			;;
	esac
done
}


MTCF_PRINT_HELP()
{
if [ "$HELP" = 1 ]
then
cat << EOF
Usage: ./configure [OPTION] ...

Options:

flush ........... Flush directories to initial state
debug ........... Include debugging info in binary c11 c++14
debugold ........ Include debugging info in binary c99 c++03
wc .............. Count size of source files

--prefix=DIR .......... DIR = prefix location of all installs (default=/usr)
--bindir=DIR .......... DIR = location of binary installs (default=/usr/bin)
--libdir=DIR .......... DIR = location of library installs (default=/usr/lib)
--includedir=DIR ...... DIR = location of header installs (default=/usr/include)
--datadir=DIR ......... DIR = location of data installs (default=/usr/share)
--mandir=DIR .......... DIR = location of man page installs (default=/usr/share/man/man1)
--disable-man ......... Disable man page build and install

EOF

	if [ "$1" != "" ]
	then
		$1
	fi

	exit
fi
}


MTCF_PRE_CONF()
{
	UNDERLINE_TEXT "$MT_VERSION"
	DEBUG_I_EX="-pedantic -Wall -Wextra -D_FORTIFY_SOURCE=2 -O1 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -ffunction-sections -fdata-sections -Wdouble-promotion -Wsign-conversion -Wconversion -Wstrict-overflow=5 -Wcast-align -Wundef -Wcast-qual -Wlogical-op -Wmissing-declarations -Wshadow -Winit-self -Wtrampolines -ggdb -DDEBUG"

	case "$DEBUG" in
	"NO" )
		I_EX=""
		L_EX="-lm -s"
		;;
	"YES" )
		I_EX="-fsanitize=undefined $DEBUG_I_EX"
		L_EX="-fsanitize=undefined -lm -O1 -Wl,--as-needed,-z,relro,-z,now"
		CFLAGS="$CFLAGS -std=gnu11 -Wbad-function-cast -Wstrict-prototypes -Wnested-externs"
		CXXFLAGS="$CXXFLAGS -std=gnu++14"
		;;
	"OLD" )
		I_EX="$DEBUG_I_EX"
		L_EX="-lm -O1 -Wl,--as-needed,-z,relro,-z,now"
		CFLAGS="$CFLAGS -std=gnu99 -Wbad-function-cast -Wstrict-prototypes -Wnested-externs"
		CXXFLAGS="$CXXFLAGS -std=gnu++03"
		;;
	esac

	if [ "$BIN_NAME" != "" ]
	then
		BIN_NAME=$BIN_NAME$BIN_SUFFIX
	fi
}


MTCF_CHECK_LIBS()
{
	while [ "$1" != "" ]
	do
		L_EX="$L_EX -l$1"

		shift
	done
}


MTCF_MAN_PAGE()
{
	ENABLE_MAN_PAGE="man"
}


MTCF_MAKE_DIRS_ADD()
{
	MAKE_DIRS="$MAKE_DIRS $1"
}


MTCF_VERSION_BIN_NAME()
{
	I_EX="$I_EX -DVERSION=\"\\\"$MT_VERSION\"\\\""

	if [ "$BIN_NAME" != "" ]
	then
		I_EX="$I_EX -DBIN_NAME=\"\\\"$BIN_NAME\"\\\""
	fi
}


MTCF_PKGCONFIG()
{
	PKGCONFIG="$PKGCONFIG $1"
}


MTCF_POST_CONF()
{
	> $CONF_FILE

	if [ "$PKGCONFIG" != "" ]
	then
		I_EX="$I_EX $(pkg-config $PKGCONFIG --cflags)"
		L_EX="$L_EX $(pkg-config $PKGCONFIG --libs)"
	fi

	F_C="$BIN_FLAGS $CFLAGS -I$HEAD_INSTALL $I_EX"
	F_CXX="$BIN_FLAGS $CXXFLAGS -I$HEAD_INSTALL $I_EX"
	F_L="$LDFLAGS -L$LIB_INSTALL $L_EX"

	echo "CC            = $CC"		>> $CONF_FILE
	echo "CXX           = $CXX"		>> $CONF_FILE
	echo "CFLAGS        = $F_C"		>> $CONF_FILE
	echo "CXXFLAGS      = $F_CXX"		>> $CONF_FILE
	echo "LDFLAGS       = $F_L"		>> $CONF_FILE

	echo "LIB_NAME      = $LIB_NAME"	>> $CONF_FILE
	echo "LIB_INSTALL   = $LIB_INSTALL"	>> $CONF_FILE
	echo "HEAD_INSTALL  = $HEAD_INSTALL"	>> $CONF_FILE

	echo "BIN_NAME      = $BIN_NAME"	>> $CONF_FILE
	echo "BIN_INSTALL   = $BIN_INSTALL"	>> $CONF_FILE
	echo "BIN_SUFFIX    = $BIN_SUFFIX"	>> $CONF_FILE

	echo "DATA_NAME     = $DATA_NAME"	>> $CONF_FILE
	echo "DATA_INSTALL  = $DATA_INSTALL"	>> $CONF_FILE

	echo "APP_NAME      = $APP_NAME"	>> $CONF_FILE
	echo "APP_VERSION   = $VERNUM"		>> $CONF_FILE

	if [ "$ENABLE_MAN_PAGE" != "" ]
	then
		MTCF_MAKE_DIRS_ADD "man"
		echo "MAN_INSTALL   = $MAN_INSTALL" >> $CONF_FILE
	fi

	echo "MAKE_DIRS     = $MAKE_DIRS"	>> $CONF_FILE

	if [ "$MOC" != "" ]
	then
		echo "MOC           = $MOC"	>> $CONF_FILE
	fi
}


MTCF_PRINT_CONF()
{
	echo
	echo

	cat $CONF_FILE

	echo
	echo
}


MT_GET_MOC_4()
{
	if hash moc-qt4 2>/dev/null
	then
		MOC="moc-qt4"
	else
		MOC="moc"
	fi

	MOC="$MOC $(pkg-config QtGui --cflags)"
}


MT_GET_MOC_5()
{
	if hash moc-qt5 2>/dev/null
	then
		MOC="moc-qt5"
	else
		MOC="moc -qt5"
	fi

	MOC="$MOC $(pkg-config Qt5Widgets --cflags)"
}
