#! /bin/sh

# Convert templates into Makefile and config.c, based on the module
# definitions found in the file Setup.
#
# Usage: makesetup [-s dir] [-c file] [-m file] [Setup] ... [-n [Setup] ...]
#
# Options:
# -s directory: alternative source directory (default derived from $0)
# -c file:      alternative config.c template (default $srcdir/config.c.in)
# -c -:         don't write config.c
# -m file:      alternative Makefile template (default ./Makefile.pre)
# -m -:         don't write Makefile
#
# Remaining arguments are one or more Setup files (default ./Setup).
# Setup files after a -n option are used for their variables, modules
# and libraries but not for their .o files.
#
# See Setup.in for a description of the format of the Setup file.
#
# The following edits are made:
#
# Copying config.c.in to config.c:
# - insert an identifying comment at the start
# - for each <module> mentioned in Setup:
#   + insert 'extern void init<module>();' before MARKER 1
#   + insert '{"<module>", initmodule},' before MARKER 2
#
# Copying Makefile.pre to Makefile:
# - insert an identifying comment at the start
# - replace @MODOBJS@ by the list of objects from Setup (except for
#   Setup files after a -n option)
# - replace @MODLIBS@ by the list of libraries from Setup
# - for each object file mentioned in Setup, insert a rule
#   '<file>.o: <file>.c; <build commands>' before the comment
#   'Rules added by makesetup'
# - for each variable definition found in Setup, insert the definition
#   before the comment 'Definitions added by makesetup'

# Loop over command line options
usage='
usage: makesetup [-s srcdir] [-c config.c.in] [-m Makefile.pre]
                 [Setup] ... [-n [Setup] ...]'
srcdir=''
config=''
makepre=''
noobjects=''
while :
do
	case $1 in
	-s)	shift; srcdir=$1; shift;;
	-c)	shift; config=$1; shift;;
	-m)	shift; makepre=$1; shift;;
	--)	shift; break;;
	-n)	noobjects=yes;;
	-*)	echo "$usage" 1>&2; exit 2;;
	*)	break;;
	esac
done

# Set default srcdir and config if not set by command line
# (Not all systems have dirname)
case $srcdir in
'')	case $0 in
	*/*)	srcdir=`echo $0 | sed 's,/[^/]*$,,'`;;
	*)	srcdir=.;;
	esac;;
esac
case $config in
'')	config=$srcdir/config.c.in;;
esac
case $makepre in
'')	makepre=Makefile.pre;;
esac

# Newline for sed i and a commands
NL="\\
"

# Main loop
for i in ${*-Setup}
do
	case $i in
	-n)	echo '<noobjects>';;
	*)	cat "$i";;
	esac
done |
sed -e 's/[ 	]*#.*//' -e '/^[ 	]*$/d' |
(
	DEFS=
	MODS=
	OBJS=
	LIBS=
	RULES=
	LOCALLIBS=
	BASELIBS=
	while read line
	do
		# Output DEFS in reverse order so first definition overrides
		case $line in
		*=*)	DEFS="$line$NL$DEFS"; continue;;
		'<noobjects>')
			case $noobjects in
			yes)	;;
			*)	LOCALLIBS=$LIBS; LIBS=;;
			esac
			noobjects=yes;
			continue;; 
		esac
		objs=
		srcs=
		cpps=
		set $line
		for arg
		do
			case $arg in
			-[IDUC]*)	cpps="$cpps $arg";;
			-[A-Zl]*)	LIBS="$LIBS $arg";;
			*.a)		LIBS="$LIBS $arg";;
			*.o)		objs="$objs $arg";;
			*.[cC])		srcs="$srcs $arg";;
			*.cc)		srcs="$srcs $arg";;
			*.c++)		srcs="$srcs $arg";;
			*.*)		echo 1>&2 "bad word $arg in $line"
					exit 1;;
			[a-zA-Z_]*)	MODS="$MODS $arg";;
			*)		echo 1>&2 "bad word $arg in $line"
					exit 1;;
			esac
		done
		case $noobjects in
		yes)	continue;;
		esac
		for obj in $objs
		do
		  src=`basename $obj .o`.c
		  case $src in
		  glmodule.c) ;;
		  *) src='$(srcdir)/'$src;;
		  esac
		  RULES="$RULES$obj: $src; \$(CC) \$(CFLAGS) $cpps -c $src$NL"
		done
		OBJS="$OBJS $objs"
		objs=
		for src in $srcs
		do
		  case $src in
		  *.c)   obj=`basename $src .c`.o; cc='$(CC)';;
		  *.cc)  obj=`basename $src .cc`.o; cc='$(CCC)';;
		  *.c++) obj=`basename $src .c++`.o; cc='$(CCC)';;
		  *.C)   obj=`basename $src .C`.o; cc='$(CCC)';;
		  *)     continue;;
		  esac
		  objs="$objs $obj"
		  case $src in
		  glmodule.c) ;;
		  *) src='$(srcdir)/'$src;;
		  esac
		  RULES="$RULES$obj: $src; $cc \$(CFLAGS) $cpps -c $src$NL"
		done
		OBJS="$OBJS $objs"
	done

	case $noobjects in
	yes)	BASELIBS=$LIBS;;
	*)	LOCALLIBS=$LIBS;;
	esac
	LIBS='$(LOCALMODLIBS) $(BASEMODLIBS)'
	DEFS="BASEMODLIBS=$BASELIBS$NL$DEFS"
	DEFS="LOCALMODLIBS=$LOCALLIBS$NL$DEFS"

	EXTDECLS=
	INITBITS=
	for mod in $MODS
	do
		EXTDECLS="${EXTDECLS}extern void init$mod();$NL"
		INITBITS="${INITBITS}	{\"$mod\", init$mod},$NL"
	done

	case $config in
	-)  ;;
	*)  sed -e "
		1i$NL/* Generated automatically from $config by makesetup. */
		/MARKER 1/i$NL$EXTDECLS
		/MARKER 2/i$NL$INITBITS

		" $config >config.c
	    ;;
	esac

	case $makepre in
	-)  ;;
	*)  sed -e "
		1i$NL# Generated automatically from $makepre by makesetup.
		s%@MODOBJS@%$OBJS%
		s%@MODLIBS@%$LIBS%
		/Rules added by makesetup/a$NL$NL$RULES
		/Definitions added by makesetup/a$NL$NL$DEFS

		" $makepre >Makefile
	    ;;
	esac

)
