mirror of
https://github.com/python/cpython.git
synced 2024-11-25 10:54:51 +08:00
732aa2f987
But IMHO, this problem really reveals an annoyance in Python's makesetup. makesetup puts the global include directories "$(INCLUDEPY) $(EXECINCLUDEPY)" in front of the directories defined by the module in Setup. Therefore global (potentially older) header files are preferred over the ones set by the module, which makes it hard to compile new versions of modules when the old versions are installed. AFAIK, the other way around is common practice for most other software. This patch to makesetup would be an potential fix for this problem, though I don't know if it breaks anything else.
262 lines
6.2 KiB
Bash
Executable File
262 lines
6.2 KiB
Bash
Executable File
#! /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 derived from $0)
|
|
# -c file: alternative config.c template (default $srcdir/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.in 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 void init<module>();' before MARKER 1
|
|
# + insert '{"<module>", initmodule},' before MARKER 2
|
|
#
|
|
# Copying Makefile.pre to Makefile:
|
|
# - insert an identifying comment at the start
|
|
# - 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] [-c config.c.in] [-m Makefile.pre]
|
|
[Setup] ... [-n [Setup] ...]'
|
|
srcdir=''
|
|
config=''
|
|
makepre=''
|
|
noobjects=''
|
|
doconfig=yes
|
|
while :
|
|
do
|
|
case $1 in
|
|
-s) shift; srcdir=$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 srcdir and config if not set by command line
|
|
# (Not all systems have dirname)
|
|
case $srcdir in
|
|
'') case $0 in
|
|
*/*) srcdir=`echo $0 | sed 's,/[^/]*$,,'`;;
|
|
*) srcdir=.;;
|
|
esac;;
|
|
esac
|
|
case $config in
|
|
'') config=$srcdir/config.c.in;;
|
|
esac
|
|
case $makepre in
|
|
'') makepre=Makefile.pre;;
|
|
esac
|
|
|
|
# Newline for sed i and a commands
|
|
NL='\
|
|
'
|
|
|
|
# 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 makedepend
|
|
" >$rulesf
|
|
DEFS=
|
|
MODS=
|
|
SHAREDMODS=
|
|
OBJS=
|
|
LIBS=
|
|
LOCALLIBS=
|
|
BASELIBS=
|
|
while read line
|
|
do
|
|
# 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;;
|
|
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
|
|
-[IDUC]*) cpps="$cpps $arg";;
|
|
-Xlinker) 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";;
|
|
*.o) srcs="$srcs `basename $arg .o`.c";;
|
|
*.[cC]) srcs="$srcs $arg";;
|
|
*.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"
|
|
;;
|
|
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='$(CCC)';;
|
|
*.c++) obj=`basename $src .c++`.o; cc='$(CCC)';;
|
|
*.C) obj=`basename $src .C`.o; cc='$(CCC)';;
|
|
*.cxx) obj=`basename $src .cxx`.o; cc='$(CCC)';;
|
|
*.cpp) obj=`basename $src .cpp`.o; cc='$(CCC)';;
|
|
*) continue;;
|
|
esac
|
|
objs="$objs $obj"
|
|
case $src in
|
|
glmodule.c) ;;
|
|
/*) ;;
|
|
*) src='$(srcdir)/'$src;;
|
|
esac
|
|
case $doconfig in
|
|
no) cc="$cc \$(CCSHARED)";;
|
|
esac
|
|
rule="$obj: $src; $cc $cpps \$(CFLAGS) -c $src"
|
|
echo "$rule" >>$rulesf
|
|
done
|
|
case $doconfig in
|
|
yes) OBJS="$OBJS $objs";;
|
|
esac
|
|
for mod in $mods
|
|
do
|
|
case $objs in
|
|
*$mod.o*) base=$mod;;
|
|
*) base=${mod}module;;
|
|
esac
|
|
file="$base\$(SO)"
|
|
case $doconfig in
|
|
no) SHAREDMODS="$SHAREDMODS $file";;
|
|
esac
|
|
rule="$file: $objs"
|
|
rule="$rule; \$(LDSHARED) $objs $libs -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 void init$mod();$NL"
|
|
INITBITS="${INITBITS} {\"$mod\", init$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%_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
|
|
)
|