#!/bin/sh
# 
# Copyright (c) 2015 Carsten Larsen
# Copyright (c) 2014 Poul-Henning Kamp
# All rights reserved.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
# 
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
# 

set -e

APPSRCS='
	app/main/evaluator.cpp
	app/main/functions.cpp
	app/main/graphlist.cpp
	app/main/lexer.cpp
	app/main/nodes.cpp
	app/main/operators.cpp
	app/main/optimizer.cpp
	app/main/parser.cpp
	app/main/statements.cpp
	app/main/token.cpp
	app/main/values.cpp
	app/main/viewer.cpp
	app/system/console.cpp
	app/system/console_amiga.cpp
	app/system/console_stdc.cpp
	app/system/filesystem_amiga.cpp
	app/system/filesystem_stdc.cpp
	app/system/graph.cpp
	app/system/graph_amiga.cpp
	app/system/graph_gtk.cpp
	app/system/language.cpp
	app/system/language_amiga.cpp
	app/system/language_stdc.cpp
	app/system/preferences.cpp
	app/system/preferences_amiga.cpp
	app/system/preferences_stdc.cpp
	app/system/proc_amiga.cpp
	app/system/program.cpp
	app/system/program_amiga.cpp
	app/system/program_stdc.cpp
	app/system/program_test.cpp
	app/system/task_amiga.cpp
	app/system/task_stdc.cpp
	app/system/window_amiga.cpp
	app/system/base/io.cpp
	app/main.cpp
'
LIBAPPSRCS='
	app/lib/aengine.cpp
	app/lib/charbuf.cpp
	app/lib/cplex.cpp
	app/lib/fgrid.cpp
	app/lib/ntext.cpp
	app/lib/real.cpp
'
LIBREALSRCS='
	lib/real/acos.c
	lib/real/acosh.c
	lib/real/asin.c
	lib/real/asinh.c
	lib/real/atan.c
	lib/real/atan2.c
	lib/real/atanh.c
	lib/real/cbrt.c
	lib/real/ceil.c
	lib/real/copysign.c
	lib/real/cos.c
	lib/real/cosh.c
	lib/real/exp.c
	lib/real/expm1.c
	lib/real/fabs.c
	lib/real/finite.c
	lib/real/floor.c
	lib/real/fmod.c
	lib/real/hypot.c
	lib/real/isnan.c
	lib/real/kcos.c
	lib/real/kremp2.c
	lib/real/ksin.c
	lib/real/ktan.c
	lib/real/log.c
	lib/real/log10.c
	lib/real/log1p.c
	lib/real/pow.c
	lib/real/remp2.c
	lib/real/round.c
	lib/real/scalbn.c
	lib/real/sin.c
	lib/real/sinh.c
	lib/real/sqrt.c
	lib/real/tan.c
	lib/real/tanh.c
	lib/real/trunc.c
'
LIBCPLEXSRCS='
	lib/cplex/cacos.c
	lib/cplex/cacosh.c
	lib/cplex/cacot.c
	lib/cplex/cacoth.c
	lib/cplex/cacsc.c
	lib/cplex/cacsch.c
	lib/cplex/casec.c
	lib/cplex/casech.c
	lib/cplex/casin.c
	lib/cplex/casinh.c
	lib/cplex/catan.c
	lib/cplex/catanh.c
	lib/cplex/ccbrt.c
	lib/cplex/ccos.c
	lib/cplex/ccosh.c
	lib/cplex/ccot.c
	lib/cplex/ccoth.c
	lib/cplex/ccsc.c
	lib/cplex/ccsch.c
	lib/cplex/cexp.c
	lib/cplex/clog.c
	lib/cplex/clog10.c
	lib/cplex/clogb.c
	lib/cplex/cpow.c
	lib/cplex/csec.c
	lib/cplex/csech.c
	lib/cplex/csgn.c
	lib/cplex/csin.c
	lib/cplex/csinh.c
	lib/cplex/csqrt.c
	lib/cplex/ctan.c
	lib/cplex/ctanh.c
	lib/cplex/prim.c
'
LIBC1SRCS='
	lib/clib/alloccpy.c
	lib/clib/mem.c
	lib/clib/memcpy.c
	lib/clib/memset.c
	lib/clib/strcmp.c
	lib/clib/strlen.c
	lib/clib/untag.c
'

LIBC2SRCS='
	lib/dconv/dragon4.cpp
	lib/dconv/dmath.cpp
	lib/dconv/dprint.cpp
'

if make -v 2>&1 | grep GNU > /dev/null 2>&1 ; then
	echo "make(1) is GNU make."
	VALID=true
else
	echo "make(1) is not GNU make."
	VALID=true
fi

if $VALID ; then
	if [ -n "$1" ];
	then
		ARCFLAG="$1 "
	else
		ARCFLAG=""
	fi
	
	if [ -n "$2" ];
	then
		CROSSCOMPILE="$2"
	else
		CROSSCOMPILE=""
	fi
	
	if [ -n "$3" ];
	then
		CROSSCOMPILEFLAGS="$3 "
	else
		CROSSCOMPILEFLAGS=""
	fi

	if [ -n "$GCC295" ];
	then
		if [ "$GCC295" = "y" ] || [ "$GCC295" = "Y" ];
		then
			gcclib="-lgcc"
		fi
	else
		gcclib="-lstdc++"
	fi
	
	if [ -n "$REGTEST" ];
	then
		if [ "$REGTEST" = "n" ] || [ "$REGTEST" = "N" ];
		then
			options="${options}"
		fi
	else
		options="${options} -DWITHTEST"
	fi

	if [ -n "$DEBUG" ];
	then
		if [ "$DEBUG" = "y" ] || [ "$DEBUG" = "Y" ];
		then
			appop="-O0 -g"
			libop="-O0 -g"
			exestrip=""
		fi
	else
		appop="-O2"
		libop="-O3"
		exestrip="-s"
	fi
	
	# Use under certain circumstances when GCC is causing problems with FPU
	nff="-fno-strict-aliasing -ffloat-store "
	
	(
	echo "# Makefile generated by configure"
	echo 
	echo "all:	libs app"
	echo 
	echo "CC     = ${CROSSCOMPILE}gcc"
	echo "AR     = ${CROSSCOMPILE}ar"
	echo "RANLIB = ${CROSSCOMPILE}ranlib"
	echo "CFLAGS = ${ARCFLAG}$options ${CROSSCOMPILEFLAGS}-I. -Wall -Werror"
	echo "LFLAGS = $gcclib -lamathapp${outext} -lcamath${outext} -lcomplex${outext} -lamath${outext}"
	echo "FLXCAT = flexcat"
	echo 
	
	i=""
	l=""
	for f in ${APPSRCS}
	do
		b=`basename $f .cpp`
#		i=`sed -n -e '/#include.*"/{
#			s/"$//
#			s/.*"//
#			p
#		}' $f | sort -u`
		echo "${b}.o:	${f}" ${i}
		echo "	\${CC} ${appop} \${CFLAGS} -Ilib -Iapp -Wall -Werror -c ${f}"
		echo
		l="${l} ${b}.o"
	done

	libapp=""
	for f in ${LIBAPPSRCS}
	do
		b=`basename $f .cpp`
		echo "${b}.o:	${f}"
		echo "	\${CC} ${appop} \${CFLAGS} -Ilib -Iapp -Wall -Werror -c ${f}"
		echo
		libapp="${libapp} ${b}.o"
	done
	
	libamath=""
	for f in ${LIBREALSRCS}
	do
		b=`basename $f .c`
		echo "${b}.o:	${f}"
		echo "	\${CC} ${libop} -std=c9x ${ARCFLAG}-fno-builtin ${nff}-Wall -Werror -Ilib -Ilib/real -c ${f}"
		echo
		libamath="${libamath} ${b}.o"
	done
	
	libcomplex=""
	for f in ${LIBCPLEXSRCS}
	do
		b=`basename $f .c`
		echo "${b}.o:	${f}"
		echo "	\${CC} ${libop} -std=c9x ${ARCFLAG}-fno-builtin -Wall -Werror -Ilib -Ilib/cplex -c ${f}"
		echo
		libcomplex="${libcomplex} ${b}.o"
	done
	
	libc=""
	for f in ${LIBC1SRCS}
	do
		b=`basename $f .c`
		echo "${b}.o:	${f}"
		echo "	\${CC} ${libop} -std=c9x ${ARCFLAG}${ansicon}-fno-builtin -Wall -Werror -Ilib -c ${f}"
		echo
		libc="${libc} ${b}.o"
	done

	for f in ${LIBC2SRCS}
	do
		b=`basename $f .cpp`
		echo "${b}.o:	${f}"
		echo "	\${CC} ${libop} ${ARCFLAG}-fno-builtin -Wall -Werror -Ilib -Ilib/dconv -c ${f}"
		echo
		libc="${libc} ${b}.o"
	done
	
	echo "libs:	libamath libcomplex libcamath libamathapp"
	echo
	echo "catalogs:	"
	echo "	\${FLXCAT} catalog/help.cd app/localize/help.h=catalog/help.sd"
	echo "	\${FLXCAT} catalog/ident-clean.cd app/localize/ident.h=catalog/ident.sd"
	echo "	\${FLXCAT} catalog/text.cd app/localize/text.h=catalog/text.sd"
	echo "	\${FLXCAT} catalog/help.cd catalog/danish/amath-help.ct CATALOG catalog/danish/amath-help.catalog"
	echo "	\${FLXCAT} catalog/ident.cd catalog/danish/amath-ident.ct CATALOG catalog/danish/amath-ident.catalog"
	echo "	\${FLXCAT} catalog/text.cd catalog/danish/amath-text.ct CATALOG catalog/danish/amath-text.catalog"
	echo "	\${FLXCAT} catalog/help.cd catalog/english/amath-help.ct CATALOG catalog/english/amath-help.catalog"
	echo "	\${FLXCAT} catalog/ident.cd catalog/english/amath-ident.ct CATALOG catalog/english/amath-ident.catalog"
	echo "	\${FLXCAT} catalog/text.cd catalog/english/amath-text.ct CATALOG catalog/english/amath-text.catalog"
	echo 
	echo "libamathapp:	${libapp}"
	echo "	\${AR} rcs libamathapp${outext}.a ${libapp}"
	echo "	\${RANLIB} libamathapp${outext}.a"
	echo
	echo "libamath:	${libamath}"
	echo "	\${AR} rcs libamath${outext}.a ${libamath}"
	echo "	\${RANLIB} libamath${outext}.a"
	echo
	echo "libcomplex:	${libcomplex}"
	echo "	\${AR} rcs libcomplex${outext}.a ${libcomplex}"
	echo "	\${RANLIB} libcomplex${outext}.a"
	echo
	echo "libcamath:	${libc}"
	echo "	\${AR} rcs libcamath${outext}.a ${libc}"
	echo "	\${RANLIB} libcamath${outext}.a"
	echo
	echo "app:	libs ${l}"
	echo "	\${CC} \${CFLAGS} ${ARCFLAG}${CROSSCOMPILEFLAGS}${exestrip} -L. -o amath${outext} ${l} \${LFLAGS}"
	echo
	echo "clean:"
	echo "	rm -f ${libapp} ${libamath} ${libcomplex} ${libc} ${l} libamath${outext}.a libcamath${outext}.a libcomplex${outext}.a libamathapp${outext}.a amath${outext}"
	echo "	rm -Rf dist"
	echo
	echo "dist: catalogs app"
	echo "	mkdir dist"
	echo "	mkdir dist/catalog"
	echo "	mkdir dist/catalog/dansk"
	echo "	mkdir dist/catalog/english"
	echo "	cp catalog/danish/*.catalog dist/catalog/dansk/"
	echo "	cp catalog/english/*.catalog dist/catalog/english/"
	echo "	cp amath dist/"
	echo "	cp LICENSE dist/"
	echo "	cp COPYRIGHT dist/"
	echo "	cp catalog/README dist/catalog/"
	echo "	cp catalog/LICENSE dist/catalog/"
	echo
	echo "depend:"
	echo "	@echo Dependencies already done"
	) > Makefile

	echo "Makefile generated${msg}"
fi
