| #! /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 before *noconfig*: |
| # + insert 'extern void init<module>(void);' 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, append a rule |
| # '<file>.o: <file>.c; <build commands>' to the end of the Makefile |
| # - for each module mentioned in Setup, append a rule |
| # which creates a shared library version to the end of the Makefile |
| # - 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='' |
| doconfig=yes |
| 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*';; |
| *) echo '*doconfig*'; cat "$i";; |
| esac |
| done | |
| sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' | |
| ( |
| rulesf="@rules.$$" |
| trap 'rm -f $rulesf' 0 1 2 3 |
| echo " |
| # Rules appended by makedepend |
| " >$rulesf |
| DEFS= |
| MODS= |
| SHAREDMODS= |
| OBJS= |
| LIBS= |
| LOCALLIBS= |
| BASELIBS= |
| while read line |
| do |
| # to handle backslashes for sh's that don't automatically |
| # continue a read when the last char is a backslash |
| while echo $line | grep '\\$' > /dev/null |
| do |
| read extraline |
| line=`echo $line| sed s/.$//`$extraline |
| done |
| |
| # Output DEFS in reverse order so first definition overrides |
| case $line in |
| *=*) DEFS="$line$NL$DEFS"; continue;; |
| 'include '*) DEFS="$line$NL$DEFS"; continue;; |
| '*noobjects*') |
| case $noobjects in |
| yes) ;; |
| *) LOCALLIBS=$LIBS; LIBS=;; |
| esac |
| noobjects=yes; |
| continue;; |
| '*doconfig*') doconfig=yes; continue;; |
| '*static*') doconfig=yes; continue;; |
| '*noconfig*') doconfig=no; continue;; |
| '*shared*') doconfig=no; continue;; |
| esac |
| srcs= |
| cpps= |
| libs= |
| mods= |
| skip= |
| for arg in $line |
| do |
| case $skip in |
| libs) libs="$libs $arg"; skip=; continue;; |
| cpps) cpps="$cpps $arg"; skip=; continue;; |
| srcs) srcs="$srcs $arg"; skip=; continue;; |
| esac |
| case $arg in |
| -[IDUCf]*) cpps="$cpps $arg";; |
| -Xlinker) libs="$libs $arg"; skip=libs;; |
| -rpath) libs="$libs $arg"; skip=libs;; |
| --rpath) libs="$libs $arg"; skip=libs;; |
| -[A-Zl]*) libs="$libs $arg";; |
| *.a) libs="$libs $arg";; |
| *.so) libs="$libs $arg";; |
| *.sl) libs="$libs $arg";; |
| /*.o) libs="$libs $arg";; |
| *.o) srcs="$srcs `basename $arg .o`.c";; |
| *.[cC]) srcs="$srcs $arg";; |
| *.cc) srcs="$srcs $arg";; |
| *.c++) srcs="$srcs $arg";; |
| *.cxx) srcs="$srcs $arg";; |
| *.cpp) srcs="$srcs $arg";; |
| \$*) libs="$libs $arg" |
| cpps="$cpps $arg";; |
| *.*) echo 1>&2 "bad word $arg in $line" |
| exit 1;; |
| -u) skip=libs; libs="$libs -u";; |
| [a-zA-Z_]*) mods="$mods $arg";; |
| *) echo 1>&2 "bad word $arg in $line" |
| exit 1;; |
| esac |
| done |
| case $doconfig in |
| yes) |
| LIBS="$LIBS $libs" |
| MODS="$MODS $mods" |
| ;; |
| esac |
| case $noobjects in |
| yes) continue;; |
| esac |
| 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)';; |
| *.cxx) obj=`basename $src .cxx`.o; cc='$(CCC)';; |
| *.cpp) obj=`basename $src .cpp`.o; cc='$(CCC)';; |
| *) continue;; |
| esac |
| objs="$objs $obj" |
| case $src in |
| glmodule.c) ;; |
| /*) ;; |
| \$*) ;; |
| *) src='$(srcdir)/'$src;; |
| esac |
| case $doconfig in |
| no) cc="$cc \$(CCSHARED)";; |
| esac |
| rule="$obj: $src; $cc $cpps \$(CFLAGS) -c $src" |
| echo "$rule" >>$rulesf |
| done |
| case $doconfig in |
| yes) OBJS="$OBJS $objs";; |
| esac |
| for mod in $mods |
| do |
| case $objs in |
| *$mod.o*) base=$mod;; |
| *) base=${mod}module;; |
| esac |
| file="$base\$(SO)" |
| case $doconfig in |
| no) SHAREDMODS="$SHAREDMODS $file";; |
| esac |
| rule="$file: $objs" |
| rule="$rule; \$(LDSHARED) $objs $libs -o $file" |
| echo "$rule" >>$rulesf |
| done |
| done |
| |
| case $SHAREDMODS in |
| '') ;; |
| *) DEFS="SHAREDMODS=$SHAREDMODS$NL$DEFS";; |
| esac |
| |
| 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(void);$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 |
| -) ;; |
| *) sedf="@sed.in.$$" |
| trap 'rm -f $sedf' 0 1 2 3 |
| echo "1i\\" >$sedf |
| str="# Generated automatically from $makepre by makesetup." |
| echo "$str" >>$sedf |
| echo "s%_MODOBJS_%$OBJS%" >>$sedf |
| echo "s%_MODLIBS_%$LIBS%" >>$sedf |
| echo "/Definitions added by makesetup/a$NL$NL$DEFS" >>$sedf |
| sed -f $sedf $makepre >Makefile |
| cat $rulesf >>Makefile |
| rm -f $sedf |
| ;; |
| esac |
| |
| rm -f $rulesf |
| ) |