From 34fd50880f834b4944525b9120eccbec2f8d5be4 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Sun, 26 Aug 2001 23:54:41 +0000 Subject: [PATCH] VPATH and DESTDIR support for PL/Perl, using the same techniques employed in interfaces/perl5 a brief while ago. Also, since building PL/Perl without a shared libperl actually works on some platforms we can enable it there to get some development happening. I've only checked off linux right now, but others should be added in the future. --- src/makefiles/Makefile.linux | 1 + src/pl/plperl/GNUmakefile | 17 +++++------ src/pl/plperl/Makefile.PL | 56 +++++++++++++++++++++++++++--------- 3 files changed, 53 insertions(+), 21 deletions(-) diff --git a/src/makefiles/Makefile.linux b/src/makefiles/Makefile.linux index 11bef1572c..31277151c9 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 7e700a7a34..4ad205acb4 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 32d663a630..83bf1ccc33 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+/\$\