Merge alpha100 branch back to main trunk
diff --git a/Modules/makesetup b/Modules/makesetup
index b5cc57b..69159f7 100755
--- a/Modules/makesetup
+++ b/Modules/makesetup
@@ -1,24 +1,103 @@
 #! /bin/sh
 
-# This script converts Makefile.in.in and config.c.in into Makefile.in
-# and config.c, based on the module definitions found in the file
-# Setup.
+# 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="\\
 "
 
-sed -e 's/#.*//' -e '/^[ 	]*$/d' ${1-Setup} |
+# 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=
-
 	while read line
 	do
+		# Output DEFS in reverse order so first definition overrides
 		case $line in
-		*=*)	DEFS="$DEFS$line$NL"; continue;;
+		*=*)	DEFS="$line$NL$DEFS"; continue;;
+		'<noobjects>')	noobjects=yes; continue;; 
 		esac
 		objs=
 		cpps=
@@ -27,7 +106,7 @@
 		do
 			case $arg in
 			-[IDUC]*)	cpps="$cpps $arg";;
-			-[Ll]*)		LIBS="$LIBS $arg";;
+			-[A-Zl]*)	LIBS="$LIBS $arg";;
 			*.a)		LIBS="$LIBS $arg";;
 			*.o)		objs="$objs $arg";;
 			*.*)		echo 1>&2 "bad word $arg in $line"
@@ -37,9 +116,16 @@
 					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"
@@ -52,20 +138,29 @@
 		EXTDECLS="${EXTDECLS}extern void init$mod();$NL"
 		INITBITS="${INITBITS}	{\"$mod\", init$mod},$NL"
 	done
-	sed -e "
-		/MARKER 1/i$NL$EXTDECLS
 
+	case $config in
+	-)  ;;
+	*)  sed -e "
+		1i$NL/* Generated automatically from $config by makesetup. */
+		/MARKER 1/i$NL$EXTDECLS
 		/MARKER 2/i$NL$INITBITS
 
-		" config.c.in >config.c
+		" $config >config.c
+	    ;;
+	esac
 
-	sed -e "
+	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
-		
-		" Makefile.in.in >Makefile.in
+		/Rules added by makesetup/a$NL$NL$RULES
+		/Definitions added by makesetup/a$NL$NL$DEFS
+
+		" $makepre >Makefile
+	    ;;
+	esac
 
 )