3 # Convert templates into Makefile and config.c, based on the module
4 # definitions found in the file Setup.
6 # Usage: makesetup [-s dir] [-c file] [-m file] [Setup] ... [-n [Setup] ...]
9 # -s directory: alternative source directory (default derived from $0)
10 # -c file: alternative config.c template (default $srcdir/config.c.in)
11 # -c -: don't write config.c
12 # -m file: alternative Makefile template (default ./Makefile.pre)
13 # -m -: don't write Makefile
15 # Remaining arguments are one or more Setup files (default ./Setup).
16 # Setup files after a -n option are used for their variables, modules
17 # and libraries but not for their .o files.
19 # See Setup.in for a description of the format of the Setup file.
21 # The following edits are made:
23 # Copying config.c.in to config.c:
24 # - insert an identifying comment at the start
25 # - for each <module> mentioned in Setup before *noconfig*:
26 # + insert 'extern void init<module>();' before MARKER 1
27 # + insert '{"<module>", initmodule},' before MARKER 2
29 # Copying Makefile.pre to Makefile:
30 # - insert an identifying comment at the start
31 # - replace _MODOBJS_ by the list of objects from Setup (except for
32 # Setup files after a -n option)
33 # - replace _MODLIBS_ by the list of libraries from Setup
34 # - for each object file mentioned in Setup, append a rule
35 # '<file>.o: <file>.c; <build commands>' to the end of the Makefile
36 # - for each module mentioned in Setup, append a rule
37 # which creates a shared library version to the end of the Makefile
38 # - for each variable definition found in Setup, insert the definition
39 # before the comment 'Definitions added by makesetup'
41 # Loop over command line options
43 usage: makesetup [-s srcdir] [-c config.c.in] [-m Makefile.pre]
44 [Setup] ... [-n [Setup] ...]'
53 -s) shift; srcdir
=$1; shift;;
54 -c) shift; config
=$1; shift;;
55 -m) shift; makepre
=$1; shift;;
58 -*) echo "$usage" 1>&2; exit 2;;
63 # Set default srcdir and config if not set by command line
64 # (Not all systems have dirname)
67 */*) srcdir
=`echo $0 | sed 's,/[^/]*$,,'`;;
72 '') config
=$srcdir/config.c.
in;;
75 '') makepre
=Makefile.pre
;;
78 # Newline for sed i and a commands
86 -n) echo '*noobjects*';;
87 *) echo '*doconfig*'; cat "$i";;
90 sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' |
93 trap 'rm -f $rulesf' 0 1 2 3
95 # Rules appended by makedepend
106 # Output DEFS in reverse order so first definition overrides
108 *=*) DEFS
="$line$NL$DEFS"; continue;;
109 'include '*) DEFS
="$line$NL$DEFS"; continue;;
113 *) LOCALLIBS
=$LIBS; LIBS
=;;
117 '*doconfig*') doconfig
=yes; continue;;
118 '*static*') doconfig
=yes; continue;;
119 '*noconfig*') doconfig
=no
; continue;;
120 '*shared*') doconfig
=no
; continue;;
130 libs
) libs
="$libs $arg"; skip
=; continue;;
131 cpps
) cpps
="$cpps $arg"; skip
=; continue;;
132 srcs
) srcs
="$srcs $arg"; skip
=; continue;;
135 -[IDUC
]*) cpps
="$cpps $arg";;
136 -Xlinker) libs
="$libs $arg"; skip
=libs
;;
137 -[A-Zl
]*) libs
="$libs $arg";;
138 *.a
) libs
="$libs $arg";;
139 *.so
) libs
="$libs $arg";;
140 *.sl
) libs
="$libs $arg";;
141 /*.o
) libs
="$libs $arg";;
142 *.o
) srcs
="$srcs `basename $arg .o`.c";;
143 *.
[cC
]) srcs
="$srcs $arg";;
144 *.cc
) srcs
="$srcs $arg";;
145 *.c
++) srcs
="$srcs $arg";;
146 *.cxx
) srcs
="$srcs $arg";;
147 *.cpp
) srcs
="$srcs $arg";;
148 \$
*) libs
="$libs $arg"
150 *.
*) echo 1>&2 "bad word $arg in $line"
152 -u) skip
=libs
; libs
="$libs -u";;
153 [a-zA-Z_
]*) mods
="$mods $arg";;
154 *) echo 1>&2 "bad word $arg in $line"
171 *.c
) obj
=`basename $src .c`.o
; cc
='$(CC)';;
172 *.cc
) obj
=`basename $src .cc`.o
; cc
='$(CCC)';;
173 *.c
++) obj
=`basename $src .c++`.o
; cc
='$(CCC)';;
174 *.C
) obj
=`basename $src .C`.o
; cc
='$(CCC)';;
175 *.cxx
) obj
=`basename $src .cxx`.o
; cc
='$(CCC)';;
176 *.cpp
) obj
=`basename $src .cpp`.o
; cc
='$(CCC)';;
182 *) src
='$(srcdir)/'$src;;
185 no
) cc
="$cc \$(CCSHARED)";;
187 rule
="$obj: $src; $cc \$(CFLAGS) $cpps -c $src"
188 echo "$rule" >>$rulesf
191 yes) OBJS
="$OBJS $objs";;
196 *$mod.o
*) base
=$mod;;
197 *) base
=${mod}module
;;
201 no
) SHAREDMODS
="$SHAREDMODS $file";;
204 rule
="$rule; \$(LDSHARED) $objs $libs -o $file"
205 echo "$rule" >>$rulesf
211 *) DEFS
="SHAREDMODS=$SHAREDMODS$NL$DEFS";;
215 yes) BASELIBS
=$LIBS;;
218 LIBS
='$(LOCALMODLIBS) $(BASEMODLIBS)'
219 DEFS
="BASEMODLIBS=$BASELIBS$NL$DEFS"
220 DEFS
="LOCALMODLIBS=$LOCALLIBS$NL$DEFS"
226 EXTDECLS
="${EXTDECLS}extern void init$mod();$NL"
227 INITBITS
="${INITBITS} {\"$mod\", init$mod},$NL"
234 1i$NL/* Generated automatically from $config by makesetup. */
235 /MARKER 1/i$NL$EXTDECLS
236 /MARKER 2/i$NL$INITBITS
245 trap 'rm -f $sedf' 0 1 2 3
247 str
="# Generated automatically from $makepre by makesetup."
249 echo "s%_MODOBJS_%$OBJS%" >>$sedf
250 echo "s%_MODLIBS_%$LIBS%" >>$sedf
251 echo "/Definitions added by makesetup/a$NL$NL$DEFS" >>$sedf
252 sed -f $sedf $makepre >Makefile
253 cat $rulesf >>Makefile