|
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; \$(BLDSHARED) $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 ) |