makesetup 7.2 KB

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