diff options
Diffstat (limited to 'Modules/makesetup')
-rwxr-xr-x | Modules/makesetup | 133 |
1 files changed, 84 insertions, 49 deletions
diff --git a/Modules/makesetup b/Modules/makesetup index 88b87b9..35294c0 100755 --- a/Modules/makesetup +++ b/Modules/makesetup @@ -22,7 +22,7 @@ # # Copying config.c.in to config.c: # - insert an identifying comment at the start -# - for each <module> mentioned in Setup: +# - for each <module> mentioned in Setup before *noconfig*: # + insert 'extern void init<module>();' before MARKER 1 # + insert '{"<module>", initmodule},' before MARKER 2 # @@ -31,9 +31,10 @@ # - 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 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' @@ -45,6 +46,7 @@ srcdir='' config='' makepre='' noobjects='' +doconfig=yes while : do case $1 in @@ -81,17 +83,22 @@ NL="\\ for i in ${*-Setup} do case $i in - -n) echo '<noobjects>';; - *) cat "$i";; + -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= - RULES= LOCALLIBS= BASELIBS= while read line @@ -99,68 +106,91 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' | # Output DEFS in reverse order so first definition overrides case $line in *=*) DEFS="$line$NL$DEFS"; continue;; - '<noobjects>') + '*noobjects*') case $noobjects in yes) ;; *) LOCALLIBS=$LIBS; LIBS=;; esac noobjects=yes; - continue;; + continue;; + '*doconfig*') doconfig=yes; continue;; + '*noconfig*') doconfig=no; continue;; esac - objs= srcs= cpps= - set $line - for arg + libs= + mods= + for arg in $line do case $arg in -[IDUC]*) cpps="$cpps $arg";; - -[A-Zl]*) LIBS="$LIBS $arg";; - *.a) LIBS="$LIBS $arg";; - *.o) objs="$objs $arg";; + -[A-Zl]*) libs="$libs $arg";; + *.a) libs="$libs $arg";; + *.o) srcs="$srcs `basename $arg .o`.c";; *.[cC]) srcs="$srcs $arg";; *.cc) srcs="$srcs $arg";; *.c++) srcs="$srcs $arg";; *.*) echo 1>&2 "bad word $arg in $line" exit 1;; - [a-zA-Z_]*) MODS="$MODS $arg";; + [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 - for obj in $objs + objs='' + for src in $srcs 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" + 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)';; + *) 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 \$(CFLAGS) $cpps -c $src" + echo "$rule" >>$rulesf done - OBJS="$OBJS $objs" - objs= - for src in $srcs + case $doconfig in + yes) OBJS="$OBJS $objs";; + esac + for mod in $mods 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)';; - *) continue;; - esac - objs="$objs $obj" - case $src in - glmodule.c) ;; - *) src='$(srcdir)/'$src;; - esac - RULES="$RULES$obj: $src; $cc \$(CFLAGS) $cpps -c $src$NL" + 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 - OBJS="$OBJS $objs" done + case $SHAREDMODS in + '') ;; + *) DEFS="SHAREDMODS=$SHAREDMODS$NL$DEFS";; + esac + case $noobjects in yes) BASELIBS=$LIBS;; *) LOCALLIBS=$LIBS;; @@ -177,6 +207,7 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' | INITBITS="${INITBITS} {\"$mod\", init$mod},$NL" done + case $config in -) ;; *) sed -e " @@ -189,16 +220,20 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' | esac 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 - - " $makepre >Makefile + -) ;; + *) 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 ) |