#! /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) # -m file: alternative Makefile template (default ./Makefile.pre) # # 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 mentioned in Setup: # + insert 'extern void init();' before MARKER 1 # + insert '{"", 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 # '.o: .c; ' 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 '';; *) 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="$line$NL$DEFS"; continue;; '') noobjects=yes; continue;; esac objs= 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";; *.*) 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" done EXTDECLS= INITBITS= for mod in $MODS do EXTDECLS="${EXTDECLS}extern void init$mod();$NL" INITBITS="${INITBITS} {\"$mod\", init$mod},$NL" done sed -e " 1i$NL/* Generated automatically from $config by makesetup. */ /MARKER 1/i$NL$EXTDECLS /MARKER 2/i$NL$INITBITS " $config >config.c 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 )