diff options
Diffstat (limited to 'Modules/makesetup')
-rwxr-xr-x | Modules/makesetup | 127 |
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 ) |