mirror of
				https://github.com/python/cpython.git
				synced 2025-10-29 17:38:56 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			258 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			258 lines
		
	
	
	
		
			6.1 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)		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 \$(CFLAGS) $cpps -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
 | |
| )
 | 
