mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			296 lines
		
	
	
	
		
			7.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			296 lines
		
	
	
	
		
			7.3 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 .)
 | 
						|
# -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.dist 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 _MODNAMES_ by the list of 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 makedepend
 | 
						|
" >$rulesf
 | 
						|
	DEFS=
 | 
						|
	NAMES=
 | 
						|
	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;;
 | 
						|
		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_]*)	NAMES="$NAMES $arg"; 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='$(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) \$(PY_CPPFLAGS)";;
 | 
						|
			*)
 | 
						|
				cc="$cc \$(PY_CORE_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%_MODNAMES_%$NAMES%" >>$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
 | 
						|
)
 |