diff --git a/src/makefiles/Makefile.linux b/src/makefiles/Makefile.linux
index 11bef1572c6a608cc7534449b420a859c925a2c1..31277151c96c0acb62a79d6af9a6e0a6c23474d5 100644
--- a/src/makefiles/Makefile.linux
+++ b/src/makefiles/Makefile.linux
@@ -2,6 +2,7 @@ AROPT = crs
 export_dynamic = -export-dynamic
 rpath = -Wl,-rpath,$(libdir)
 shlib_symbolic = -Wl,-Bsymbolic
+allow_nonpic_in_shlib = yes
 DLSUFFIX = .so
 CFLAGS_SL = -fpic
 
diff --git a/src/pl/plperl/GNUmakefile b/src/pl/plperl/GNUmakefile
index 7e700a7a34f84fec6a6a951d2a3c8e91072eff9c..4ad205acb46c7fdc54340b255746f14572db4ecf 100644
--- a/src/pl/plperl/GNUmakefile
+++ b/src/pl/plperl/GNUmakefile
@@ -1,25 +1,26 @@
-# $Header: /cvsroot/pgsql/src/pl/plperl/GNUmakefile,v 1.6 2000/11/02 18:40:13 petere Exp $
+# $Header: /cvsroot/pgsql/src/pl/plperl/GNUmakefile,v 1.7 2001/08/26 23:54:41 petere Exp $
 
 subdir = src/pl/plperl
 top_builddir = ../../..
 include $(top_builddir)/src/Makefile.global
 
-plperl_installdir = $(DESTDIR)$(libdir)
+ifeq ($(allow_nonpic_in_shlib),yes)
+makefile_pl_flags = --force
+endif
 
 
 all: Makefile
-	$(MAKE) -f $< all
+	$(MAKE) -f $< all VPATH=$(VPATH)
 
 Makefile: Makefile.PL
-	plperl_installdir='$(plperl_installdir)' \
-	EXTRA_INCLUDES='$(filter -I%, $(CPPFLAGS))' \
-	$(PERL) $<
+	plperl_installdir='$$(DESTDIR)$(libdir)' \
+	$(PERL) $< $(makefile_pl_flags) INC='-I$(srcdir) $(filter -I%, $(CPPFLAGS))'
 
 install: all installdirs
-	$(MAKE) -f Makefile install
+	$(MAKE) -f Makefile install DESTDIR='$(DESTDIR)'
 
 installdirs:
-	$(mkinstalldirs) $(DESTDIR)$(plperl_installdir)
+	$(mkinstalldirs) $(DESTDIR)$(libdir)
 
 uninstall:
 	rm -f $(DESTDIR)$(libdir)/plperl$(DLSUFFIX)
diff --git a/src/pl/plperl/Makefile.PL b/src/pl/plperl/Makefile.PL
index 32d663a630183dd4dae543d578421b14d25e632a..83bf1ccc334e7b7aa1acb4988dc3afb2706979e5 100644
--- a/src/pl/plperl/Makefile.PL
+++ b/src/pl/plperl/Makefile.PL
@@ -3,23 +3,27 @@ use ExtUtils::Embed;
 use DynaLoader;
 use Config;
 
-#
-# Can't build a shared plperl unless libperl is shared too.
-# (Actually, it would be enough if code in libperl.a is compiled
-# to be position-independent, but that is hard to check for and
-# seems pretty unlikely anyway.)
-#
-if ($Config{'useshrplib'} ne 'true') {
+# On some platforms you can't build plperl unless libperl is a shared
+# library.  (Actually, it would be enough if code in libperl.a is
+# compiled to be position-independent, but that is hard to check for
+# and seems pretty unlikely anyway.)  On some platforms it doesn't
+# matter and they can pass in the --force flag to build anyway.
+# (Having a shared libperl is still a lot better for efficiency,
+# though.)
+
+if ($Config{'useshrplib'} ne 'true' && $ARGV[0] ne '--force') {
 	open(OUT, ">Makefile") or die "Can't write Makefile: $!\n";
 	print OUT <<'EndOfMakefile';
 # Dummy Makefile for use when we can't build plperl
 
-all install:
-	@echo "*****"; \
-	 echo "* Cannot build PL/Perl because libperl is not a shared library." ; \
-	 echo "* Skipped."; \
-	 echo "*****"
+all:
+	@echo ""; \
+	 echo "*** Cannot build PL/Perl because libperl is not a shared library." ; \
+	 echo "*** You might have to rebuild your Perl installation.  Refer to"; \
+	 echo "*** the documentation for details."; \
+	 echo ""
 
+install:
 
 clean realclean:
 	rm -f Makefile
@@ -34,7 +38,6 @@ $ldopts=~s/$Config{ccdlflags}//;
 
 WriteMakefile( 'NAME' => 'plperl', 
         dynamic_lib => { 'OTHERLDFLAGS' =>  $ldopts } ,
-	INC => "$ENV{EXTRA_INCLUDES}",
 	XS => { 'SPI.xs' => 'SPI.c' },
 	OBJECT => 'plperl.o eloglvl.o SPI.o',
 	);
@@ -66,3 +69,30 @@ install :: all
 ];
 
 }
+
+
+sub MY::xs_o {
+    '';
+}
+
+sub MY::makefile {
+    '';
+}
+
+# VPATH-aware version of this rule
+sub MY::xs_c {
+    my($self) = shift;
+    return '' unless $self->needs_linking();
+    '
+.xs.c:
+	$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $< > $@
+';
+}
+
+# somebody doesn't know how to write make rules...
+sub MY::c_o {
+    package MY; # so that "SUPER" works right
+    my $inherited = shift->SUPER::c_o(@_);
+    $inherited =~ s/\$\*\.\S+/\$\</g;
+    $inherited;
+}