Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | #! /bin/sh |
2 | ||
3 | # 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 .) | |
10 | # -l directory: library source directory (default derived from $0) | |
11 | # -c file: alternative config.c template (default $libdir/config.c.in) | |
12 | # -c -: don't write config.c | |
13 | # -m file: alternative Makefile template (default ./Makefile.pre) | |
14 | # -m -: don't write Makefile | |
15 | # | |
16 | # Remaining arguments are one or more Setup files (default ./Setup). | |
17 | # Setup files after a -n option are used for their variables, modules | |
18 | # and libraries but not for their .o files. | |
19 | # | |
20 | # See Setup.dist for a description of the format of the Setup file. | |
21 | # | |
22 | # The following edits are made: | |
23 | # | |
24 | # Copying config.c.in to config.c: | |
25 | # - insert an identifying comment at the start | |
26 | # - for each <module> mentioned in Setup before *noconfig*: | |
27 | # + insert 'extern void init<module>(void);' before MARKER 1 | |
28 | # + insert '{"<module>", initmodule},' before MARKER 2 | |
29 | # | |
30 | # Copying Makefile.pre to Makefile: | |
31 | # - insert an identifying comment at the start | |
32 | # - replace _MODOBJS_ by the list of objects from Setup (except for | |
33 | # Setup files after a -n option) | |
34 | # - replace _MODLIBS_ by the list of libraries from Setup | |
35 | # - for each object file mentioned in Setup, append a rule | |
36 | # '<file>.o: <file>.c; <build commands>' to the end of the Makefile | |
37 | # - for each module mentioned in Setup, append a rule | |
38 | # which creates a shared library version to the end of the Makefile | |
39 | # - for each variable definition found in Setup, insert the definition | |
40 | # before the comment 'Definitions added by makesetup' | |
41 | ||
42 | # Loop over command line options | |
43 | usage=' | |
44 | usage: makesetup [-s srcdir] [-l libdir] [-c config.c.in] [-m Makefile.pre] | |
45 | [Setup] ... [-n [Setup] ...]' | |
46 | srcdir='.' | |
47 | libdir='' | |
48 | config='' | |
49 | makepre='' | |
50 | noobjects='' | |
51 | doconfig=yes | |
52 | while : | |
53 | do | |
54 | case $1 in | |
55 | -s) shift; srcdir=$1; shift;; | |
56 | -l) shift; libdir=$1; shift;; | |
57 | -c) shift; config=$1; shift;; | |
58 | -m) shift; makepre=$1; shift;; | |
59 | --) shift; break;; | |
60 | -n) noobjects=yes;; | |
61 | -*) echo "$usage" 1>&2; exit 2;; | |
62 | *) break;; | |
63 | esac | |
64 | done | |
65 | ||
66 | # Set default libdir and config if not set by command line | |
67 | # (Not all systems have dirname) | |
68 | case $libdir in | |
69 | '') case $0 in | |
70 | */*) libdir=`echo $0 | sed 's,/[^/]*$,,'`;; | |
71 | *) libdir=.;; | |
72 | esac;; | |
73 | esac | |
74 | case $config in | |
75 | '') config=$libdir/config.c.in;; | |
76 | esac | |
77 | case $makepre in | |
78 | '') makepre=Makefile.pre;; | |
79 | esac | |
80 | ||
81 | # Newline for sed i and a commands | |
82 | NL='\ | |
83 | ' | |
84 | ||
85 | # Setup to link with extra libraries when makeing shared extensions. | |
86 | # Currently, only Cygwin needs this baggage. | |
87 | case `uname -s` in | |
88 | CYGWIN*) if test $libdir = . | |
89 | then | |
90 | ExtraLibDir=. | |
91 | else | |
92 | ExtraLibDir='$(LIBPL)' | |
93 | fi | |
94 | ExtraLibs="-L$ExtraLibDir -lpython\$(VERSION)";; | |
95 | esac | |
96 | ||
97 | # Main loop | |
98 | for i in ${*-Setup} | |
99 | do | |
100 | case $i in | |
101 | -n) echo '*noobjects*';; | |
102 | *) echo '*doconfig*'; cat "$i";; | |
103 | esac | |
104 | done | | |
105 | sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' | | |
106 | ( | |
107 | rulesf="@rules.$$" | |
108 | trap 'rm -f $rulesf' 0 1 2 3 | |
109 | echo " | |
110 | # Rules appended by makedepend | |
111 | " >$rulesf | |
112 | DEFS= | |
113 | MODS= | |
114 | SHAREDMODS= | |
115 | OBJS= | |
116 | LIBS= | |
117 | LOCALLIBS= | |
118 | BASELIBS= | |
119 | while read line | |
120 | do | |
121 | # to handle backslashes for sh's that don't automatically | |
122 | # continue a read when the last char is a backslash | |
123 | while echo $line | grep '\\$' > /dev/null | |
124 | do | |
125 | read extraline | |
126 | line=`echo $line| sed s/.$//`$extraline | |
127 | done | |
128 | ||
129 | # Output DEFS in reverse order so first definition overrides | |
130 | case $line in | |
131 | *=*) DEFS="$line$NL$DEFS"; continue;; | |
132 | 'include '*) DEFS="$line$NL$DEFS"; continue;; | |
133 | '*noobjects*') | |
134 | case $noobjects in | |
135 | yes) ;; | |
136 | *) LOCALLIBS=$LIBS; LIBS=;; | |
137 | esac | |
138 | noobjects=yes; | |
139 | continue;; | |
140 | '*doconfig*') doconfig=yes; continue;; | |
141 | '*static*') doconfig=yes; continue;; | |
142 | '*noconfig*') doconfig=no; continue;; | |
143 | '*shared*') doconfig=no; continue;; | |
144 | esac | |
145 | srcs= | |
146 | cpps= | |
147 | libs= | |
148 | mods= | |
149 | skip= | |
150 | for arg in $line | |
151 | do | |
152 | case $skip in | |
153 | libs) libs="$libs $arg"; skip=; continue;; | |
154 | cpps) cpps="$cpps $arg"; skip=; continue;; | |
155 | srcs) srcs="$srcs $arg"; skip=; continue;; | |
156 | esac | |
157 | case $arg in | |
158 | -framework) libs="$libs $arg"; skip=libs; | |
159 | # OSX/OSXS/Darwin framework link cmd | |
160 | ;; | |
161 | -[IDUCfF]*) cpps="$cpps $arg";; | |
162 | -Xcompiler) skip=cpps;; | |
163 | -Xlinker) libs="$libs $arg"; skip=libs;; | |
164 | -rpath) libs="$libs $arg"; skip=libs;; | |
165 | --rpath) libs="$libs $arg"; skip=libs;; | |
166 | -[A-Zl]*) libs="$libs $arg";; | |
167 | *.a) libs="$libs $arg";; | |
168 | *.so) libs="$libs $arg";; | |
169 | *.sl) libs="$libs $arg";; | |
170 | /*.o) libs="$libs $arg";; | |
171 | *.def) libs="$libs $arg";; | |
172 | *.o) srcs="$srcs `basename $arg .o`.c";; | |
173 | *.[cC]) srcs="$srcs $arg";; | |
174 | *.m) srcs="$srcs $arg";; # Objective-C src | |
175 | *.cc) srcs="$srcs $arg";; | |
176 | *.c++) srcs="$srcs $arg";; | |
177 | *.cxx) srcs="$srcs $arg";; | |
178 | *.cpp) srcs="$srcs $arg";; | |
179 | \$*) libs="$libs $arg" | |
180 | cpps="$cpps $arg";; | |
181 | *.*) echo 1>&2 "bad word $arg in $line" | |
182 | exit 1;; | |
183 | -u) skip=libs; libs="$libs -u";; | |
184 | [a-zA-Z_]*) mods="$mods $arg";; | |
185 | *) echo 1>&2 "bad word $arg in $line" | |
186 | exit 1;; | |
187 | esac | |
188 | done | |
189 | case $doconfig in | |
190 | yes) | |
191 | LIBS="$LIBS $libs" | |
192 | MODS="$MODS $mods" | |
193 | ;; | |
194 | esac | |
195 | case $noobjects in | |
196 | yes) continue;; | |
197 | esac | |
198 | objs='' | |
199 | for src in $srcs | |
200 | do | |
201 | case $src in | |
202 | *.c) obj=`basename $src .c`.o; cc='$(CC)';; | |
203 | *.cc) obj=`basename $src .cc`.o; cc='$(CXX)';; | |
204 | *.c++) obj=`basename $src .c++`.o; cc='$(CXX)';; | |
205 | *.C) obj=`basename $src .C`.o; cc='$(CXX)';; | |
206 | *.cxx) obj=`basename $src .cxx`.o; cc='$(CXX)';; | |
207 | *.cpp) obj=`basename $src .cpp`.o; cc='$(CXX)';; | |
208 | *.m) obj=`basename $src .m`.o; cc='$(CC)';; # Obj-C | |
209 | *) continue;; | |
210 | esac | |
211 | obj="$srcdir/$obj" | |
212 | objs="$objs $obj" | |
213 | case $src in | |
214 | glmodule.c) ;; | |
215 | /*) ;; | |
216 | \$*) ;; | |
217 | *) src='$(srcdir)/'"$srcdir/$src";; | |
218 | esac | |
219 | case $doconfig in | |
220 | no) cc="$cc \$(CCSHARED) \$(CFLAGS) \$(CPPFLAGS)";; | |
221 | *) | |
222 | cc="$cc \$(PY_CFLAGS)";; | |
223 | esac | |
224 | rule="$obj: $src; $cc $cpps -c $src -o $obj" | |
225 | echo "$rule" >>$rulesf | |
226 | done | |
227 | case $doconfig in | |
228 | yes) OBJS="$OBJS $objs";; | |
229 | esac | |
230 | for mod in $mods | |
231 | do | |
232 | case $objs in | |
233 | *$mod.o*) base=$mod;; | |
234 | *) base=${mod}module;; | |
235 | esac | |
236 | file="$srcdir/$base\$(SO)" | |
237 | case $doconfig in | |
238 | no) SHAREDMODS="$SHAREDMODS $file";; | |
239 | esac | |
240 | rule="$file: $objs" | |
241 | rule="$rule; \$(LDSHARED) $objs $libs $ExtraLibs -o $file" | |
242 | echo "$rule" >>$rulesf | |
243 | done | |
244 | done | |
245 | ||
246 | case $SHAREDMODS in | |
247 | '') ;; | |
248 | *) DEFS="SHAREDMODS=$SHAREDMODS$NL$DEFS";; | |
249 | esac | |
250 | ||
251 | case $noobjects in | |
252 | yes) BASELIBS=$LIBS;; | |
253 | *) LOCALLIBS=$LIBS;; | |
254 | esac | |
255 | LIBS='$(LOCALMODLIBS) $(BASEMODLIBS)' | |
256 | DEFS="BASEMODLIBS=$BASELIBS$NL$DEFS" | |
257 | DEFS="LOCALMODLIBS=$LOCALLIBS$NL$DEFS" | |
258 | ||
259 | EXTDECLS= | |
260 | INITBITS= | |
261 | for mod in $MODS | |
262 | do | |
263 | EXTDECLS="${EXTDECLS}extern void init$mod(void);$NL" | |
264 | INITBITS="${INITBITS} {\"$mod\", init$mod},$NL" | |
265 | done | |
266 | ||
267 | ||
268 | case $config in | |
269 | -) ;; | |
270 | *) sed -e " | |
271 | 1i$NL/* Generated automatically from $config by makesetup. */ | |
272 | /MARKER 1/i$NL$EXTDECLS | |
273 | ||
274 | /MARKER 2/i$NL$INITBITS | |
275 | ||
276 | " $config >config.c | |
277 | ;; | |
278 | esac | |
279 | ||
280 | case $makepre in | |
281 | -) ;; | |
282 | *) sedf="@sed.in.$$" | |
283 | trap 'rm -f $sedf' 0 1 2 3 | |
284 | echo "1i\\" >$sedf | |
285 | str="# Generated automatically from $makepre by makesetup." | |
286 | echo "$str" >>$sedf | |
287 | echo "s%_MODOBJS_%$OBJS%" >>$sedf | |
288 | echo "s%_MODLIBS_%$LIBS%" >>$sedf | |
289 | echo "/Definitions added by makesetup/a$NL$NL$DEFS" >>$sedf | |
290 | sed -f $sedf $makepre >Makefile | |
291 | cat $rulesf >>Makefile | |
292 | rm -f $sedf | |
293 | ;; | |
294 | esac | |
295 | ||
296 | rm -f $rulesf | |
297 | ) |