123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 |
- #! /bin/sh
- # Convert templates into Makefile and config.c, based on the module
- # definitions found in the file Setup.
- #
- # Usage: makesetup [-s dir] [-c file] [-m file] [Setup] ... [-n [Setup] ...]
- #
- # Options:
- # -s directory: alternative source directory (default .)
- # -l directory: library source directory (default derived from $0)
- # -c file: alternative config.c template (default $libdir/config.c.in)
- # -c -: don't write config.c
- # -m file: alternative Makefile template (default ./Makefile.pre)
- # -m -: don't write Makefile
- #
- # Remaining arguments are one or more Setup files (default ./Setup).
- # Setup files after a -n option are used for their variables, modules
- # and libraries but not for their .o files.
- #
- # See Setup for a description of the format of the Setup file.
- #
- # The following edits are made:
- #
- # Copying config.c.in to config.c:
- # - insert an identifying comment at the start
- # - for each <module> mentioned in Setup before *noconfig*:
- # + insert 'extern PyObject* PyInit_<module>(void);' before MARKER 1
- # + insert '{"<module>", PyInit_<module>},' before MARKER 2
- #
- # Copying Makefile.pre to Makefile:
- # - insert an identifying comment at the start
- # - replace _MODBUILT_NAMES_ by the list of *static* and *shared* modules
- # from Setup
- # - replace _MODDISABLED_NAMES_ by the list of *disabled* modules from Setup
- # - replace _MODOBJS_ by the list of objects from Setup (except for
- # Setup files after a -n option)
- # - replace _MODLIBS_ by the list of libraries from Setup
- # - for each object file mentioned in Setup, append a rule
- # '<file>.o: <file>.c; <build commands>' to the end of the Makefile
- # - for each module mentioned in Setup, append a rule
- # which creates a shared library version to the end of the Makefile
- # - for each variable definition found in Setup, insert the definition
- # before the comment 'Definitions added by makesetup'
- # Loop over command line options
- usage='
- usage: makesetup [-s srcdir] [-l libdir] [-c config.c.in] [-m Makefile.pre]
- [Setup] ... [-n [Setup] ...]'
- srcdir='.'
- libdir=''
- config=''
- makepre=''
- noobjects=''
- doconfig=yes
- while :
- do
- case $1 in
- -s) shift; srcdir=$1; shift;;
- -l) shift; libdir=$1; shift;;
- -c) shift; config=$1; shift;;
- -m) shift; makepre=$1; shift;;
- --) shift; break;;
- -n) noobjects=yes;;
- -*) echo "$usage" 1>&2; exit 2;;
- *) break;;
- esac
- done
- # Set default libdir and config if not set by command line
- # (Not all systems have dirname)
- case $libdir in
- '') case $0 in
- */*) libdir=`echo $0 | sed 's,/[^/]*$,,'`;;
- *) libdir=.;;
- esac;;
- esac
- case $config in
- '') config=$libdir/config.c.in;;
- esac
- case $makepre in
- '') makepre=Makefile.pre;;
- esac
- # Newline for sed i and a commands
- NL='\
- '
- # Setup to link with extra libraries when making shared extensions.
- # Currently, only Cygwin needs this baggage.
- case `uname -s` in
- CYGWIN*) if test $libdir = .
- then
- ExtraLibDir=.
- else
- ExtraLibDir='$(LIBPL)'
- fi
- ExtraLibs="-L$ExtraLibDir -lpython\$(LDVERSION)";;
- esac
- # Main loop
- for i in ${*-Setup}
- do
- case $i in
- -n) echo '*noobjects*';;
- *) echo '*doconfig*'; cat "$i";;
- esac
- done |
- sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' |
- (
- rulesf="@rules.$$"
- trap 'rm -f $rulesf' 0 1 2 3
- echo "
- # Rules appended by makesetup
- " >$rulesf
- DEFS=
- BUILT=
- DISABLED=
- MODS=
- SHAREDMODS=
- OBJS=
- LIBS=
- LOCALLIBS=
- BASELIBS=
- while read line
- do
- # to handle backslashes for sh's that don't automatically
- # continue a read when the last char is a backslash
- while echo $line | grep '\\$' > /dev/null
- do
- read extraline
- line=`echo $line| sed s/.$//`$extraline
- done
- # Output DEFS in reverse order so first definition overrides
- case $line in
- *=*) DEFS="$line$NL$DEFS"; continue;;
- 'include '*) DEFS="$line$NL$DEFS"; continue;;
- '*noobjects*')
- case $noobjects in
- yes) ;;
- *) LOCALLIBS=$LIBS; LIBS=;;
- esac
- noobjects=yes;
- continue;;
- '*doconfig*') doconfig=yes; continue;;
- '*static*') doconfig=yes; continue;;
- '*noconfig*') doconfig=no; continue;;
- '*shared*') doconfig=no; continue;;
- '*disabled*') doconfig=disabled; continue;;
- esac
- srcs=
- cpps=
- libs=
- mods=
- skip=
- for arg in $line
- do
- case $skip in
- libs) libs="$libs $arg"; skip=; continue;;
- cpps) cpps="$cpps $arg"; skip=; continue;;
- srcs) srcs="$srcs $arg"; skip=; continue;;
- esac
- case $arg in
- -framework) libs="$libs $arg"; skip=libs;
- # OSX/OSXS/Darwin framework link cmd
- ;;
- -[IDUCfF]*) cpps="$cpps $arg";;
- -Xcompiler) skip=cpps;;
- -Xlinker) libs="$libs $arg"; skip=libs;;
- -rpath) libs="$libs $arg"; skip=libs;;
- --rpath) libs="$libs $arg"; skip=libs;;
- -[A-Zl]*) libs="$libs $arg";;
- *.a) libs="$libs $arg";;
- *.so) libs="$libs $arg";;
- *.sl) libs="$libs $arg";;
- /*.o) libs="$libs $arg";;
- *.def) libs="$libs $arg";;
- *.o) srcs="$srcs `basename $arg .o`.c";;
- *.[cC]) srcs="$srcs $arg";;
- *.m) srcs="$srcs $arg";; # Objective-C src
- *.cc) srcs="$srcs $arg";;
- *.c++) srcs="$srcs $arg";;
- *.cxx) srcs="$srcs $arg";;
- *.cpp) srcs="$srcs $arg";;
- \$*) libs="$libs $arg"
- cpps="$cpps $arg";;
- *.*) echo 1>&2 "bad word $arg in $line"
- exit 1;;
- -u) skip=libs; libs="$libs -u";;
- [a-zA-Z_]*) mods="$mods $arg";;
- *) echo 1>&2 "bad word $arg in $line"
- exit 1;;
- esac
- done
- case $doconfig in
- yes)
- LIBS="$LIBS $libs"
- MODS="$MODS $mods"
- BUILT="$BUILT $mods"
- ;;
- no)
- BUILT="$BUILT $mods"
- ;;
- disabled)
- DISABLED="$DISABLED $mods"
- continue
- ;;
- esac
- case $noobjects in
- yes) continue;;
- esac
- objs=''
- for src in $srcs
- do
- case $src in
- *.c) obj=`basename $src .c`.o; cc='$(CC)';;
- *.cc) obj=`basename $src .cc`.o; cc='$(CXX)';;
- *.c++) obj=`basename $src .c++`.o; cc='$(CXX)';;
- *.C) obj=`basename $src .C`.o; cc='$(CXX)';;
- *.cxx) obj=`basename $src .cxx`.o; cc='$(CXX)';;
- *.cpp) obj=`basename $src .cpp`.o; cc='$(CXX)';;
- *.m) obj=`basename $src .m`.o; cc='$(CC)';; # Obj-C
- *) continue;;
- esac
- obj="$srcdir/$obj"
- objs="$objs $obj"
- case $src in
- glmodule.c) ;;
- /*) ;;
- \$*) ;;
- *) src='$(srcdir)/'"$srcdir/$src";;
- esac
- case $doconfig in
- no) cc="$cc \$(CCSHARED) \$(PY_CFLAGS_NODIST) \$(PY_CPPFLAGS)";;
- *)
- cc="$cc \$(PY_BUILTIN_MODULE_CFLAGS)";;
- esac
- rule="$obj: $src; $cc $cpps -c $src -o $obj"
- echo "$rule" >>$rulesf
- done
- case $doconfig in
- yes) OBJS="$OBJS $objs";;
- esac
- for mod in $mods
- do
- file="$srcdir/$mod\$(EXT_SUFFIX)"
- case $doconfig in
- no) SHAREDMODS="$SHAREDMODS $file";;
- esac
- rule="$file: $objs"
- rule="$rule; \$(BLDSHARED) $objs $libs $ExtraLibs -o $file"
- echo "$rule" >>$rulesf
- done
- done
- case $SHAREDMODS in
- '') ;;
- *) DEFS="SHAREDMODS=$SHAREDMODS$NL$DEFS";;
- esac
- case $noobjects in
- yes) BASELIBS=$LIBS;;
- *) LOCALLIBS=$LIBS;;
- esac
- LIBS='$(LOCALMODLIBS) $(BASEMODLIBS)'
- DEFS="BASEMODLIBS=$BASELIBS$NL$DEFS"
- DEFS="LOCALMODLIBS=$LOCALLIBS$NL$DEFS"
- EXTDECLS=
- INITBITS=
- for mod in $MODS
- do
- EXTDECLS="${EXTDECLS}extern PyObject* PyInit_$mod(void);$NL"
- INITBITS="${INITBITS} {\"$mod\", PyInit_$mod},$NL"
- done
- case $config in
- -) ;;
- *) sed -e "
- 1i$NL/* Generated automatically from $config by makesetup. */
- /MARKER 1/i$NL$EXTDECLS
- /MARKER 2/i$NL$INITBITS
- " $config >config.c
- ;;
- esac
- case $makepre in
- -) ;;
- *) sedf="@sed.in.$$"
- trap 'rm -f $sedf' 0 1 2 3
- echo "1i\\" >$sedf
- str="# Generated automatically from $makepre by makesetup."
- echo "$str" >>$sedf
- echo "s%_MODBUILT_NAMES_%$BUILT%" >>$sedf
- echo "s%_MODDISABLED_NAMES_%$DISABLED%" >>$sedf
- echo "s%_MODOBJS_%$OBJS%" >>$sedf
- echo "s%_MODLIBS_%$LIBS%" >>$sedf
- echo "/Definitions added by makesetup/a$NL$NL$DEFS" >>$sedf
- sed -f $sedf $makepre >Makefile
- cat $rulesf >>Makefile
- rm -f $sedf
- ;;
- esac
- rm -f $rulesf
- )
|