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 ) 298