blob: b00dfd4b2379621a3319bb46744f7b8b17ade32f [file] [log] [blame]
Guido van Rossumfba715a1994-01-02 00:26:09 +00001#! /bin/sh
2
Guido van Rossumb6775db1994-08-01 11:34:53 +00003# Convert templates into Makefile and config.c, based on the module
4# definitions found in the file Setup.
5#
6# Usage: makesetup [-s dir] [-c file] [-m file] [Setup] ... [-n [Setup] ...]
7#
8# Options:
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
14#
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.
18#
19# See Setup.in for a description of the format of the Setup file.
20#
21# The following edits are made:
22#
23# Copying config.c.in to config.c:
24# - insert an identifying comment at the start
Guido van Rossum7cc5abd1994-09-12 10:42:20 +000025# - for each <module> mentioned in Setup before *noconfig*:
Guido van Rossumb6775db1994-08-01 11:34:53 +000026# + insert 'extern void init<module>();' before MARKER 1
27# + insert '{"<module>", initmodule},' before MARKER 2
28#
29# Copying Makefile.pre to Makefile:
30# - insert an identifying comment at the start
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000031# - replace _MODOBJS_ by the list of objects from Setup (except for
Guido van Rossumb6775db1994-08-01 11:34:53 +000032# Setup files after a -n option)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000033# - replace _MODLIBS_ by the list of libraries from Setup
Guido van Rossum7cc5abd1994-09-12 10:42:20 +000034# - 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
Guido van Rossumb6775db1994-08-01 11:34:53 +000038# - for each variable definition found in Setup, insert the definition
39# before the comment 'Definitions added by makesetup'
Guido van Rossumfba715a1994-01-02 00:26:09 +000040
Guido van Rossumb6775db1994-08-01 11:34:53 +000041# Loop over command line options
42usage='
43usage: makesetup [-s srcdir] [-c config.c.in] [-m Makefile.pre]
44 [Setup] ... [-n [Setup] ...]'
45srcdir=''
46config=''
47makepre=''
48noobjects=''
Guido van Rossum7cc5abd1994-09-12 10:42:20 +000049doconfig=yes
Guido van Rossumb6775db1994-08-01 11:34:53 +000050while :
51do
52 case $1 in
53 -s) shift; srcdir=$1; shift;;
54 -c) shift; config=$1; shift;;
55 -m) shift; makepre=$1; shift;;
56 --) shift; break;;
57 -n) noobjects=yes;;
58 -*) echo "$usage" 1>&2; exit 2;;
59 *) break;;
60 esac
61done
62
63# Set default srcdir and config if not set by command line
64# (Not all systems have dirname)
65case $srcdir in
66'') case $0 in
67 */*) srcdir=`echo $0 | sed 's,/[^/]*$,,'`;;
68 *) srcdir=.;;
69 esac;;
70esac
71case $config in
72'') config=$srcdir/config.c.in;;
73esac
74case $makepre in
75'') makepre=Makefile.pre;;
76esac
77
78# Newline for sed i and a commands
Guido van Rossum4a269861995-06-14 22:52:06 +000079NL='\
80'
Guido van Rossumfba715a1994-01-02 00:26:09 +000081
Guido van Rossumb6775db1994-08-01 11:34:53 +000082# Main loop
83for i in ${*-Setup}
84do
85 case $i in
Guido van Rossum7cc5abd1994-09-12 10:42:20 +000086 -n) echo '*noobjects*';;
87 *) echo '*doconfig*'; cat "$i";;
Guido van Rossumb6775db1994-08-01 11:34:53 +000088 esac
89done |
90sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' |
Guido van Rossumfba715a1994-01-02 00:26:09 +000091(
Guido van Rossum7cc5abd1994-09-12 10:42:20 +000092 rulesf="@rules.$$"
93 trap 'rm -f $rulesf' 0 1 2 3
94 echo "
95# Rules appended by makedepend
96" >$rulesf
Guido van Rossumfba715a1994-01-02 00:26:09 +000097 DEFS=
98 MODS=
Guido van Rossum7cc5abd1994-09-12 10:42:20 +000099 SHAREDMODS=
Guido van Rossumfba715a1994-01-02 00:26:09 +0000100 OBJS=
101 LIBS=
Guido van Rossum0b498be1994-08-23 13:49:15 +0000102 LOCALLIBS=
103 BASELIBS=
Guido van Rossumfba715a1994-01-02 00:26:09 +0000104 while read line
105 do
Guido van Rossumb6775db1994-08-01 11:34:53 +0000106 # Output DEFS in reverse order so first definition overrides
Guido van Rossumfba715a1994-01-02 00:26:09 +0000107 case $line in
Guido van Rossumb6775db1994-08-01 11:34:53 +0000108 *=*) DEFS="$line$NL$DEFS"; continue;;
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000109 '*noobjects*')
Guido van Rossum0b498be1994-08-23 13:49:15 +0000110 case $noobjects in
111 yes) ;;
112 *) LOCALLIBS=$LIBS; LIBS=;;
113 esac
114 noobjects=yes;
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000115 continue;;
116 '*doconfig*') doconfig=yes; continue;;
117 '*noconfig*') doconfig=no; continue;;
Guido van Rossumfba715a1994-01-02 00:26:09 +0000118 esac
Guido van Rossum0b498be1994-08-23 13:49:15 +0000119 srcs=
Guido van Rossumfba715a1994-01-02 00:26:09 +0000120 cpps=
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000121 libs=
122 mods=
Guido van Rossum4a269861995-06-14 22:52:06 +0000123 skip=
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000124 for arg in $line
Guido van Rossumfba715a1994-01-02 00:26:09 +0000125 do
Guido van Rossum4a269861995-06-14 22:52:06 +0000126 case $skip in
127 libs) libs="$libs $arg"; skip=; continue;;
128 cpps) cpps="$cpps $arg"; skip=; continue;;
129 srcs) srcs="$srcs $arg"; skip=; continue;;
130 esac
Guido van Rossumfba715a1994-01-02 00:26:09 +0000131 case $arg in
132 -[IDUC]*) cpps="$cpps $arg";;
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000133 -[A-Zl]*) libs="$libs $arg";;
134 *.a) libs="$libs $arg";;
Guido van Rossuma29756c1996-08-19 22:00:05 +0000135 *.so) libs="$libs $arg";;
136 *.sl) libs="$libs $arg";;
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000137 *.o) srcs="$srcs `basename $arg .o`.c";;
Guido van Rossum0b498be1994-08-23 13:49:15 +0000138 *.[cC]) srcs="$srcs $arg";;
139 *.cc) srcs="$srcs $arg";;
140 *.c++) srcs="$srcs $arg";;
Sjoerd Mullender4237efc1995-10-11 08:45:15 +0000141 \$*) libs="$libs $arg"
142 cpps="$cpps $arg";;
Guido van Rossumfba715a1994-01-02 00:26:09 +0000143 *.*) echo 1>&2 "bad word $arg in $line"
144 exit 1;;
Guido van Rossum4a269861995-06-14 22:52:06 +0000145 -u) skip=libs; libs="$libs -u";;
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000146 [a-zA-Z_]*) mods="$mods $arg";;
Guido van Rossumfba715a1994-01-02 00:26:09 +0000147 *) echo 1>&2 "bad word $arg in $line"
148 exit 1;;
149 esac
150 done
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000151 case $doconfig in
152 yes)
153 LIBS="$LIBS $libs"
154 MODS="$MODS $mods"
155 ;;
156 esac
Guido van Rossumb6775db1994-08-01 11:34:53 +0000157 case $noobjects in
158 yes) continue;;
159 esac
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000160 objs=''
Guido van Rossum0b498be1994-08-23 13:49:15 +0000161 for src in $srcs
162 do
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000163 case $src in
164 *.c) obj=`basename $src .c`.o; cc='$(CC)';;
165 *.cc) obj=`basename $src .cc`.o; cc='$(CCC)';;
166 *.c++) obj=`basename $src .c++`.o; cc='$(CCC)';;
167 *.C) obj=`basename $src .C`.o; cc='$(CCC)';;
168 *) continue;;
169 esac
170 objs="$objs $obj"
171 case $src in
172 glmodule.c) ;;
173 *) src='$(srcdir)/'$src;;
174 esac
175 case $doconfig in
Guido van Rossum89910651994-10-20 21:58:30 +0000176 no) cc="$cc \$(CCSHARED)";;
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000177 esac
178 rule="$obj: $src; $cc \$(CFLAGS) $cpps -c $src"
179 echo "$rule" >>$rulesf
Guido van Rossum0b498be1994-08-23 13:49:15 +0000180 done
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000181 case $doconfig in
182 yes) OBJS="$OBJS $objs";;
183 esac
184 for mod in $mods
185 do
186 case $objs in
187 *$mod.o*) base=$mod;;
188 *) base=${mod}module;;
189 esac
190 file="$base\$(SO)"
191 case $doconfig in
192 no) SHAREDMODS="$SHAREDMODS $file";;
193 esac
194 rule="$file: $objs"
Sjoerd Mullender4eba0c91994-10-13 09:09:05 +0000195 rule="$rule; \$(LDSHARED) $objs $libs -o $file"
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000196 echo "$rule" >>$rulesf
197 done
Guido van Rossumfba715a1994-01-02 00:26:09 +0000198 done
199
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000200 case $SHAREDMODS in
201 '') ;;
202 *) DEFS="SHAREDMODS=$SHAREDMODS$NL$DEFS";;
203 esac
204
Guido van Rossum0b498be1994-08-23 13:49:15 +0000205 case $noobjects in
206 yes) BASELIBS=$LIBS;;
207 *) LOCALLIBS=$LIBS;;
208 esac
209 LIBS='$(LOCALMODLIBS) $(BASEMODLIBS)'
210 DEFS="BASEMODLIBS=$BASELIBS$NL$DEFS"
211 DEFS="LOCALMODLIBS=$LOCALLIBS$NL$DEFS"
212
Guido van Rossumfba715a1994-01-02 00:26:09 +0000213 EXTDECLS=
214 INITBITS=
215 for mod in $MODS
216 do
217 EXTDECLS="${EXTDECLS}extern void init$mod();$NL"
218 INITBITS="${INITBITS} {\"$mod\", init$mod},$NL"
219 done
Guido van Rossumfba715a1994-01-02 00:26:09 +0000220
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000221
Guido van Rossumb6775db1994-08-01 11:34:53 +0000222 case $config in
223 -) ;;
224 *) sed -e "
225 1i$NL/* Generated automatically from $config by makesetup. */
226 /MARKER 1/i$NL$EXTDECLS
Guido van Rossumfba715a1994-01-02 00:26:09 +0000227 /MARKER 2/i$NL$INITBITS
228
Guido van Rossumb6775db1994-08-01 11:34:53 +0000229 " $config >config.c
230 ;;
231 esac
Guido van Rossumfba715a1994-01-02 00:26:09 +0000232
Guido van Rossumb6775db1994-08-01 11:34:53 +0000233 case $makepre in
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000234 -) ;;
235 *) sedf="@sed.in.$$"
236 trap 'rm -f $sedf' 0 1 2 3
237 echo "1i\\" >$sedf
238 str="# Generated automatically from $makepre by makesetup."
239 echo "$str" >>$sedf
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000240 echo "s%_MODOBJS_%$OBJS%" >>$sedf
241 echo "s%_MODLIBS_%$LIBS%" >>$sedf
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000242 echo "/Definitions added by makesetup/a$NL$NL$DEFS" >>$sedf
243 sed -f $sedf $makepre >Makefile
244 cat $rulesf >>Makefile
245 rm -f $sedf
Guido van Rossumb6775db1994-08-01 11:34:53 +0000246 ;;
247 esac
Guido van Rossumfba715a1994-01-02 00:26:09 +0000248
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000249 rm -f $rulesf
Guido van Rossumfba715a1994-01-02 00:26:09 +0000250)