summaryrefslogtreecommitdiffstats
path: root/Modules/makesetup
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/makesetup')
-rwxr-xr-xModules/makesetup127
1 files changed, 111 insertions, 16 deletions
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 @@ sed -e 's/#.*//' -e '/^[ ]*$/d' ${1-Setup} |
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 @@ sed -e 's/#.*//' -e '/^[ ]*$/d' ${1-Setup} |
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 @@ sed -e 's/#.*//' -e '/^[ ]*$/d' ${1-Setup} |
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
)