blob: b8b34d85b14eb3a9ff18954555c7115a45575850 [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#
Fred Drakecf3bc8c2000-10-26 17:07:40 +000019# See Setup.dist for a description of the format of the Setup file.
Guido van Rossumb6775db1994-08-01 11:34:53 +000020#
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*:
Thomas Wouters53e7fd72000-07-23 00:02:15 +000026# + insert 'extern void init<module>(void);' before MARKER 1
Guido van Rossumb6775db1994-08-01 11:34:53 +000027# + 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 Rossumb9619202001-01-10 21:12:18 +000082# Setup to link with extra libraries when makeing shared extensions.
83# Currently, only Cygwin needs this baggage.
84case `uname -s` in
85CYGWIN*) if test $srcdir = .
86 then
87 ExtraLibDir=..
88 else
89 ExtraLibDir='$(LIBPL)'
90 fi
91 ExtraLibs="-L$ExtraLibDir -lpython\$(VERSION)";;
92esac
93
Guido van Rossumb6775db1994-08-01 11:34:53 +000094# Main loop
95for i in ${*-Setup}
96do
97 case $i in
Guido van Rossum7cc5abd1994-09-12 10:42:20 +000098 -n) echo '*noobjects*';;
99 *) echo '*doconfig*'; cat "$i";;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000100 esac
101done |
102sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' |
Guido van Rossumfba715a1994-01-02 00:26:09 +0000103(
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000104 rulesf="@rules.$$"
105 trap 'rm -f $rulesf' 0 1 2 3
106 echo "
107# Rules appended by makedepend
108" >$rulesf
Guido van Rossumfba715a1994-01-02 00:26:09 +0000109 DEFS=
110 MODS=
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000111 SHAREDMODS=
Guido van Rossumfba715a1994-01-02 00:26:09 +0000112 OBJS=
113 LIBS=
Guido van Rossum0b498be1994-08-23 13:49:15 +0000114 LOCALLIBS=
115 BASELIBS=
Guido van Rossumfba715a1994-01-02 00:26:09 +0000116 while read line
117 do
Guido van Rossumae84e8d1999-04-19 17:16:12 +0000118 # to handle backslashes for sh's that don't automatically
119 # continue a read when the last char is a backslash
120 while echo $line | grep '\\$' > /dev/null
121 do
122 read extraline
123 line=`echo $line| sed s/.$//`$extraline
124 done
125
Guido van Rossumb6775db1994-08-01 11:34:53 +0000126 # Output DEFS in reverse order so first definition overrides
Guido van Rossumfba715a1994-01-02 00:26:09 +0000127 case $line in
Guido van Rossumb6775db1994-08-01 11:34:53 +0000128 *=*) DEFS="$line$NL$DEFS"; continue;;
Guido van Rossum9bf84451997-04-02 05:33:00 +0000129 'include '*) DEFS="$line$NL$DEFS"; continue;;
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000130 '*noobjects*')
Guido van Rossum0b498be1994-08-23 13:49:15 +0000131 case $noobjects in
132 yes) ;;
133 *) LOCALLIBS=$LIBS; LIBS=;;
134 esac
135 noobjects=yes;
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000136 continue;;
137 '*doconfig*') doconfig=yes; continue;;
Guido van Rossum43554541996-08-20 19:49:13 +0000138 '*static*') doconfig=yes; continue;;
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000139 '*noconfig*') doconfig=no; continue;;
Guido van Rossum43554541996-08-20 19:49:13 +0000140 '*shared*') doconfig=no; continue;;
Guido van Rossumfba715a1994-01-02 00:26:09 +0000141 esac
Guido van Rossum0b498be1994-08-23 13:49:15 +0000142 srcs=
Guido van Rossumfba715a1994-01-02 00:26:09 +0000143 cpps=
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000144 libs=
145 mods=
Guido van Rossum4a269861995-06-14 22:52:06 +0000146 skip=
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000147 for arg in $line
Guido van Rossumfba715a1994-01-02 00:26:09 +0000148 do
Guido van Rossum4a269861995-06-14 22:52:06 +0000149 case $skip in
150 libs) libs="$libs $arg"; skip=; continue;;
151 cpps) cpps="$cpps $arg"; skip=; continue;;
152 srcs) srcs="$srcs $arg"; skip=; continue;;
153 esac
Guido van Rossumfba715a1994-01-02 00:26:09 +0000154 case $arg in
Guido van Rossum2a78cf22001-01-10 21:46:05 +0000155 -framework) libs="$libs $arg"; skip=libs;
156 # OSX/OSXS/Darwin framework link cmd
157 ;;
158 -[IDUCfF]*) cpps="$cpps $arg";;
Guido van Rossumb447d111997-12-02 20:38:11 +0000159 -Xlinker) libs="$libs $arg"; skip=libs;;
Guido van Rossum8bfefce1999-05-21 19:18:49 +0000160 -rpath) libs="$libs $arg"; skip=libs;;
Fred Drake091ec2c2000-08-11 13:58:37 +0000161 --rpath) libs="$libs $arg"; skip=libs;;
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000162 -[A-Zl]*) libs="$libs $arg";;
163 *.a) libs="$libs $arg";;
Guido van Rossuma29756c1996-08-19 22:00:05 +0000164 *.so) libs="$libs $arg";;
165 *.sl) libs="$libs $arg";;
Guido van Rossumfa1fb7d1998-05-14 02:37:45 +0000166 /*.o) libs="$libs $arg";;
Guido van Rossumb9619202001-01-10 21:12:18 +0000167 *.def) libs="$libs $arg";;
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000168 *.o) srcs="$srcs `basename $arg .o`.c";;
Guido van Rossum0b498be1994-08-23 13:49:15 +0000169 *.[cC]) srcs="$srcs $arg";;
Guido van Rossum2a78cf22001-01-10 21:46:05 +0000170 *.m) srcs="$srcs $arg";; # Objective-C src
Guido van Rossum0b498be1994-08-23 13:49:15 +0000171 *.cc) srcs="$srcs $arg";;
172 *.c++) srcs="$srcs $arg";;
Guido van Rossumbabacb01997-02-14 16:44:04 +0000173 *.cxx) srcs="$srcs $arg";;
174 *.cpp) srcs="$srcs $arg";;
Sjoerd Mullender4237efc1995-10-11 08:45:15 +0000175 \$*) libs="$libs $arg"
176 cpps="$cpps $arg";;
Guido van Rossumfba715a1994-01-02 00:26:09 +0000177 *.*) echo 1>&2 "bad word $arg in $line"
178 exit 1;;
Guido van Rossum4a269861995-06-14 22:52:06 +0000179 -u) skip=libs; libs="$libs -u";;
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000180 [a-zA-Z_]*) mods="$mods $arg";;
Guido van Rossumfba715a1994-01-02 00:26:09 +0000181 *) echo 1>&2 "bad word $arg in $line"
182 exit 1;;
183 esac
184 done
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000185 case $doconfig in
186 yes)
187 LIBS="$LIBS $libs"
188 MODS="$MODS $mods"
189 ;;
190 esac
Guido van Rossumb6775db1994-08-01 11:34:53 +0000191 case $noobjects in
192 yes) continue;;
193 esac
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000194 objs=''
Guido van Rossum0b498be1994-08-23 13:49:15 +0000195 for src in $srcs
196 do
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000197 case $src in
198 *.c) obj=`basename $src .c`.o; cc='$(CC)';;
Guido van Rossum37da22b2000-12-06 23:46:29 +0000199 *.cc) obj=`basename $src .cc`.o; cc='$(CXX)';;
200 *.c++) obj=`basename $src .c++`.o; cc='$(CXX)';;
201 *.C) obj=`basename $src .C`.o; cc='$(CXX)';;
202 *.cxx) obj=`basename $src .cxx`.o; cc='$(CXX)';;
203 *.cpp) obj=`basename $src .cpp`.o; cc='$(CXX)';;
Guido van Rossum2a78cf22001-01-10 21:46:05 +0000204 *.m) obj=`basename $src .m`.o; cc='$(CXX)';; # Obj-C
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000205 *) continue;;
206 esac
207 objs="$objs $obj"
208 case $src in
209 glmodule.c) ;;
Guido van Rossum76d1f961998-09-09 14:04:51 +0000210 /*) ;;
Skip Montanarofd022672000-07-06 17:58:06 +0000211 \$*) ;;
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000212 *) src='$(srcdir)/'$src;;
213 esac
214 case $doconfig in
Guido van Rossum89910651994-10-20 21:58:30 +0000215 no) cc="$cc \$(CCSHARED)";;
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000216 esac
Guido van Rossum732aa2f1998-12-11 01:10:29 +0000217 rule="$obj: $src; $cc $cpps \$(CFLAGS) -c $src"
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000218 echo "$rule" >>$rulesf
Guido van Rossum0b498be1994-08-23 13:49:15 +0000219 done
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000220 case $doconfig in
221 yes) OBJS="$OBJS $objs";;
222 esac
223 for mod in $mods
224 do
225 case $objs in
226 *$mod.o*) base=$mod;;
227 *) base=${mod}module;;
228 esac
229 file="$base\$(SO)"
230 case $doconfig in
231 no) SHAREDMODS="$SHAREDMODS $file";;
232 esac
233 rule="$file: $objs"
Guido van Rossumb9619202001-01-10 21:12:18 +0000234 rule="$rule; \$(LDSHARED) $objs $libs $ExtraLibs -o $file"
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000235 echo "$rule" >>$rulesf
236 done
Guido van Rossumfba715a1994-01-02 00:26:09 +0000237 done
238
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000239 case $SHAREDMODS in
240 '') ;;
241 *) DEFS="SHAREDMODS=$SHAREDMODS$NL$DEFS";;
242 esac
243
Guido van Rossum0b498be1994-08-23 13:49:15 +0000244 case $noobjects in
245 yes) BASELIBS=$LIBS;;
246 *) LOCALLIBS=$LIBS;;
247 esac
248 LIBS='$(LOCALMODLIBS) $(BASEMODLIBS)'
249 DEFS="BASEMODLIBS=$BASELIBS$NL$DEFS"
250 DEFS="LOCALMODLIBS=$LOCALLIBS$NL$DEFS"
251
Guido van Rossumfba715a1994-01-02 00:26:09 +0000252 EXTDECLS=
253 INITBITS=
254 for mod in $MODS
255 do
Thomas Wouters53e7fd72000-07-23 00:02:15 +0000256 EXTDECLS="${EXTDECLS}extern void init$mod(void);$NL"
Guido van Rossumfba715a1994-01-02 00:26:09 +0000257 INITBITS="${INITBITS} {\"$mod\", init$mod},$NL"
258 done
Guido van Rossumfba715a1994-01-02 00:26:09 +0000259
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000260
Guido van Rossumb6775db1994-08-01 11:34:53 +0000261 case $config in
262 -) ;;
263 *) sed -e "
264 1i$NL/* Generated automatically from $config by makesetup. */
265 /MARKER 1/i$NL$EXTDECLS
Guido van Rossum3886bb61998-12-04 18:50:17 +0000266
Guido van Rossumfba715a1994-01-02 00:26:09 +0000267 /MARKER 2/i$NL$INITBITS
268
Guido van Rossumb6775db1994-08-01 11:34:53 +0000269 " $config >config.c
270 ;;
271 esac
Guido van Rossumfba715a1994-01-02 00:26:09 +0000272
Guido van Rossumb6775db1994-08-01 11:34:53 +0000273 case $makepre in
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000274 -) ;;
275 *) sedf="@sed.in.$$"
276 trap 'rm -f $sedf' 0 1 2 3
277 echo "1i\\" >$sedf
278 str="# Generated automatically from $makepre by makesetup."
279 echo "$str" >>$sedf
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000280 echo "s%_MODOBJS_%$OBJS%" >>$sedf
281 echo "s%_MODLIBS_%$LIBS%" >>$sedf
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000282 echo "/Definitions added by makesetup/a$NL$NL$DEFS" >>$sedf
283 sed -f $sedf $makepre >Makefile
284 cat $rulesf >>Makefile
285 rm -f $sedf
Guido van Rossumb6775db1994-08-01 11:34:53 +0000286 ;;
287 esac
Guido van Rossumfba715a1994-01-02 00:26:09 +0000288
Guido van Rossum7cc5abd1994-09-12 10:42:20 +0000289 rm -f $rulesf
Guido van Rossumfba715a1994-01-02 00:26:09 +0000290)