Staging
v0.8.1
Revision 1a4b593dd67a9c9cbb1560f4c00ac9a63218aca7 authored by Fred Drake on 10 April 2000, 15:36:39 UTC, committed by Fred Drake on 10 April 2000, 15:36:39 UTC
Instead of assuming that the number process ids of the threads is the
same as the process id of the controlling process, use a copy of the
dictionary and check for changes in the process ids of the threads
from the thread's process ids in the parent process.  This makes the
test make more sense on systems which assign a new pid to each thread
(i.e., Linux).

This doesn't fix the other problems evident with this test on Linux.
1 parent 9706486
Raw File
makesetup
#! /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
		# 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
			-[IDUC]*)	cpps="$cpps $arg";;
			-Xlinker)	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";;
			*.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
)
back to top