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