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 43usage=' 44usage: makesetup [-s srcdir] [-l libdir] [-c config.c.in] [-m Makefile.pre] 45 [Setup] ... [-n [Setup] ...]' 46srcdir='.' 47libdir='' 48config='' 49makepre='' 50noobjects='' 51doconfig=yes 52while : 53do 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 64done 65 66# Set default libdir and config if not set by command line 67# (Not all systems have dirname) 68case $libdir in 69'') case $0 in 70 */*) libdir=`echo $0 | sed 's,/[^/]*$,,'`;; 71 *) libdir=.;; 72 esac;; 73esac 74case $config in 75'') config=$libdir/config.c.in;; 76esac 77case $makepre in 78'') makepre=Makefile.pre;; 79esac 80 81# Newline for sed i and a commands 82NL='\ 83' 84 85# Setup to link with extra libraries when making shared extensions. 86# Currently, only Cygwin needs this baggage. 87case `uname -s` in 88CYGWIN*) if test $libdir = . 89 then 90 ExtraLibDir=. 91 else 92 ExtraLibDir='$(LIBPL)' 93 fi 94 ExtraLibs="-L$ExtraLibDir -lpython\$(VERSION)";; 95esac 96 97# Main loop 98for i in ${*-Setup} 99do 100 case $i in 101 -n) echo '*noobjects*';; 102 *) echo '*doconfig*'; cat "$i";; 103 esac 104done | 105sed -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) 298