Support shared library creation.
diff --git a/Modules/Makefile.pre.in b/Modules/Makefile.pre.in
index 7afa0b9..39c3b7c 100644
--- a/Modules/Makefile.pre.in
+++ b/Modules/Makefile.pre.in
@@ -27,9 +27,19 @@
 LIBM=		@LIBM@
 LIBC=		@LIBC@
 
+# Machine-dependent subdirectories
+MACHDEP=	@MACHDEP@
+
 # Install prefix, may be changed by configure
 prefix=		/usr/local
 
+# Symbols used for using shared libraries
+SO=		@SO@
+LDSHARED=	@LDSHARED@
+CCSHARED=	@CCSHARED@
+LINKFORSHARED=	@LINKFORSHARED@
+DESTSHARED=	$(prefix)/lib/python/$(MACHDEP)
+
 
 # === Variables that are customizable by hand ===
 
@@ -60,13 +70,13 @@
 
 all:		$(LIB) ../python
 
-$(LIB):		$(OBJS)
+$(LIB):		$(OBJS) Makefile
 		-rm -f $(LIB)
 		$(AR) cr $(LIB) $(OBJS)
 		$(RANLIB) $(LIB)
 
-../python:	config.o $(MYLIBS)
-		$(CC) $(OPT) config.o \
+../python:	config.o $(MYLIBS) Makefile
+		$(CC) $(OPT) config.o $(LINKFORSHARED) \
 		      $(MYLIBS) $(MODLIBS) $(LIBS) $(SYSLIBS) -o python
 		mv python ../python
 
@@ -136,8 +146,9 @@
 xxmodule.o: xxmodule.c
 yuvconvert.o: yuvconvert.c
 
-# === Rules added by makesetup ===
+# Rules to build and install all shared modules
+sharedmods:	$(SHAREDMODS)
+sharedinstall:	$(SHAREDMODS)
+		mv $(SHAREDMODS) $(DESTSHARED)
 
-# DO NOT DELETE THIS LINE -- mkdep uses it.
-# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
-# IF YOU PUT ANYTHING HERE IT WILL GO AWAY
+# Stuff is appended here by makesetup and make depend
diff --git a/Modules/Setup.in b/Modules/Setup.in
index d657e9e..af7d235 100644
--- a/Modules/Setup.in
+++ b/Modules/Setup.in
@@ -28,6 +28,16 @@
 # <name> = <value>
 #
 # which defines a Make variable definition inserted into Makefile.in
+#
+# Finally, if a line has the literal form
+#
+# *noconfig*
+#
+# (that is including the '*' and '*' !) then the following modules will
+# not be included in the config.c file, nor in the list of objects to be
+# added to the library archive, and their linker options won't be added 
+# to the linker options, but rules to create their .o files and their
+# shared libraries will still be added to the Makefile
 
 # NOTE: As a standard policy, as many modules as can be supported by a
 # platform should be present.  The distribution comes with all modules
@@ -47,13 +57,10 @@
 # Standard enabled (tests are always available)
 TESTPATH=:$(DESTLIB)/test
 
-# Enable this for SGI systems
-#ARCHPATH=:$(DESTLIB)/sgi
+# Path for machine- or system-dependent modules (and shared libraries)
+MACHDEPPATH=:$(DESTLIB)/$(MACHDEP)
 
-# Enable this for Sun systems
-#ARCHPATH=:$(DESTLIB)/sun4
-
-PYTHONPATH=.:$(DESTLIB)$(TESTPATH)$(ARCHPATH)$(STDWINPATH)$(TKPATH)
+PYTHONPATH=.:$(DESTLIB)$(TESTPATH)$(MACHDEPPATH)$(STDWINPATH)$(TKPATH)
 
 
 # Modules that should always be present (non UNIX dependent)
@@ -86,6 +93,7 @@
 
 #dbm dbmmodule.c 	# dbm(3) may require -lndbm or similar
 #nis nismodule.c 	# Sun yellow pages -- not everywhere
+#termios termios.c	# Steen Lumholt's termios module
 
 
 # Multimedia modules -- on by default.
@@ -109,6 +117,18 @@
 #stdwin stdwinmodule.c -I$(STDWIN)/H $(STDWIN)/Build/$(ARCH)/x11/lib/lib.a -lX11
 #STDWINPATH=:$(DESTLIB)/stdwin
 
+# For STDWIN 1.0 it's a bit different:
+
+#STDWIN=/ufs/guido/src/stdwin
+#LIBTEXTEDIT=$(STDWIN)/$(MACHDEP)/Packs/textedit/libtextedit.a
+#LIBX11STDWIN=$(STDWIN)/$(MACHDEP)/Ports/x11/libstdwin.a
+#LIBALFASTDWIN=$(STDWIN)/$(MACHDEP)/Ports/alfa/libstdwin.a
+#stdwin stdwinmodule.c -I$(STDWIN)/H $(LIBTEXTEDIT) $(LIBX11STDWIN) -lX11
+
+# Or use the following for the alphanumeric version:
+
+#stdwin stdwinmodule.c -I$(STDWIN)/H $(LIBTEXTEDIT) $(LIBALFASTDWIN) -ltermcap
+
 
 # The md5 module implements the RSA Data Security, Inc. MD5
 # Message-Digest Algorithm, described in RFC 1321.  The necessary files
diff --git a/Modules/makesetup b/Modules/makesetup
index 88b87b9..35294c0 100755
--- a/Modules/makesetup
+++ b/Modules/makesetup
@@ -22,7 +22,7 @@
 #
 # Copying config.c.in to config.c:
 # - insert an identifying comment at the start
-# - for each <module> mentioned in Setup:
+# - for each <module> mentioned in Setup before *noconfig*:
 #   + insert 'extern void init<module>();' before MARKER 1
 #   + insert '{"<module>", initmodule},' before MARKER 2
 #
@@ -31,9 +31,10 @@
 # - 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, insert a rule
-#   '<file>.o: <file>.c; <build commands>' before the comment
-#   'Rules added by makesetup'
+# - 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'
 
@@ -45,6 +46,7 @@
 config=''
 makepre=''
 noobjects=''
+doconfig=yes
 while :
 do
 	case $1 in
@@ -81,17 +83,22 @@
 for i in ${*-Setup}
 do
 	case $i in
-	-n)	echo '<noobjects>';;
-	*)	cat "$i";;
+	-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=
-	RULES=
 	LOCALLIBS=
 	BASELIBS=
 	while read line
@@ -99,68 +106,91 @@
 		# Output DEFS in reverse order so first definition overrides
 		case $line in
 		*=*)	DEFS="$line$NL$DEFS"; continue;;
-		'<noobjects>')
+		'*noobjects*')
 			case $noobjects in
 			yes)	;;
 			*)	LOCALLIBS=$LIBS; LIBS=;;
 			esac
 			noobjects=yes;
-			continue;; 
+			continue;;
+		'*doconfig*')	doconfig=yes; continue;;
+		'*noconfig*')	doconfig=no; continue;;
 		esac
-		objs=
 		srcs=
 		cpps=
-		set $line
-		for arg
+		libs=
+		mods=
+		for arg in $line
 		do
 			case $arg in
 			-[IDUC]*)	cpps="$cpps $arg";;
-			-[A-Zl]*)	LIBS="$LIBS $arg";;
-			*.a)		LIBS="$LIBS $arg";;
-			*.o)		objs="$objs $arg";;
+			-[A-Zl]*)	libs="$libs $arg";;
+			*.a)		libs="$libs $arg";;
+			*.o)		srcs="$srcs `basename $arg .o`.c";;
 			*.[cC])		srcs="$srcs $arg";;
 			*.cc)		srcs="$srcs $arg";;
 			*.c++)		srcs="$srcs $arg";;
 			*.*)		echo 1>&2 "bad word $arg in $line"
 					exit 1;;
-			[a-zA-Z_]*)	MODS="$MODS $arg";;
+			[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
-		for obj in $objs
-		do
-		  src=`basename $obj .o`.c
-		  case $src in
-		  glmodule.c) ;;
-		  *) src='$(srcdir)/'$src;;
-		  esac
-		  RULES="$RULES$obj: $src; \$(CC) \$(CFLAGS) $cpps -c $src$NL"
-		done
-		OBJS="$OBJS $objs"
-		objs=
+		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)';;
-		  *)     continue;;
-		  esac
-		  objs="$objs $obj"
-		  case $src in
-		  glmodule.c) ;;
-		  *) src='$(srcdir)/'$src;;
-		  esac
-		  RULES="$RULES$obj: $src; $cc \$(CFLAGS) $cpps -c $src$NL"
+			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)';;
+			*)     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
-		OBJS="$OBJS $objs"
+		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;;
@@ -177,6 +207,7 @@
 		INITBITS="${INITBITS}	{\"$mod\", init$mod},$NL"
 	done
 
+
 	case $config in
 	-)  ;;
 	*)  sed -e "
@@ -189,16 +220,20 @@
 	esac
 
 	case $makepre in
-	-)  ;;
-	*)  sed -e "
-		1i$NL# Generated automatically from $makepre by makesetup.
-		s%@MODOBJS@%$OBJS%
-		s%@MODLIBS@%$LIBS%
-		/Rules added by makesetup/a$NL$NL$RULES
-		/Definitions added by makesetup/a$NL$NL$DEFS
-
-		" $makepre >Makefile
+	-)	;;
+	*)	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
 )