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