Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Eisentraut2001-08-26 22:28:04 +0000
committerPeter Eisentraut2001-08-26 22:28:04 +0000
commitef7152f99bb87fae344f731a670c18dd476638e7 (patch)
tree87572cf1ed04c1c119689c6daac62148a825d378 /src/interfaces/perl5
parent8e0d642c9bfb9247f385eb3490def23bff236093 (diff)
Put the right runpath to libpq into the Perl module shared object on more
platforms and without relinking. Also support VPATH builds and DESTDIR installs. One hopes.
Diffstat (limited to 'src/interfaces/perl5')
-rw-r--r--src/interfaces/perl5/GNUmakefile104
-rw-r--r--src/interfaces/perl5/Makefile.PL95
2 files changed, 134 insertions, 65 deletions
diff --git a/src/interfaces/perl5/GNUmakefile b/src/interfaces/perl5/GNUmakefile
index c82ae59f083..6920742c593 100644
--- a/src/interfaces/perl5/GNUmakefile
+++ b/src/interfaces/perl5/GNUmakefile
@@ -4,64 +4,92 @@
# Makefile according to its own ideas and then invoke the rules from
# that file.
#
-# $Header: /cvsroot/pgsql/src/interfaces/perl5/Attic/GNUmakefile,v 1.5 2000/11/17 00:08:57 tgl Exp $
+# $Header: /cvsroot/pgsql/src/interfaces/perl5/Attic/GNUmakefile,v 1.6 2001/08/26 22:28:04 petere Exp $
subdir = src/interfaces/perl5
top_builddir = ../../..
include $(top_builddir)/src/Makefile.global
+.NOTPARALLEL:
+
+# This would allow a non-root install of the Perl module, but it's not
+# quite implemented yet.
+ifeq ($(mysterious_feature),yes)
+perl_installsitearch = $(pkglibdir)
+perl_installsitelib = $(pkglibdir)
+perl_installman3dir = $(mandir)/man3
+endif
+
all: Makefile libpq-all
- $(MAKE) -f $< all
+ $(MAKE) -f $< all VPATH=$(VPATH)
-Makefile: Makefile.PL
- $(PERL) $<
+# We need to run Makefile.PL in the source directory because it scans
+# the directory for files to build with. If we ran it in the build
+# dir it would miss all the files and not build half the stuff!
+Makefile: Makefile.PL Pg.pm
+ abs_builddir=`pwd`; \
+ abs_libpq_builddir=`cd $(libpq_builddir) && pwd`; \
+ cd $(srcdir) && \
+ SRCDIR=$(srcdir) \
+ PGLIBDIR=$(libdir) \
+ $(PERL) $< \
+ INC='-I$(srcdir) -I$(libpq_srcdir) $(filter -I%, $(CPPFLAGS))' \
+ LIBS="-L$$abs_libpq_builddir -lpq" \
+ INSTALLSITEARCH='$$(DESTDIR)$(perl_installsitearch)' \
+ INSTALLSITELIB='$$(DESTDIR)$(perl_installsitelib)' \
+ INSTALLMAN3DIR='$$(DESTDIR)$(perl_installman3dir)' \
+ MAKEFILE="$$abs_builddir/Makefile"
.PHONY: libpq-all
libpq-all:
$(MAKE) -C $(libpq_builddir) all
-test: Makefile
- $(MAKE) -f $< test
-# The klugery here is to ensure that the perl5 shared library gets
-# built with the correct path to the installed location of libpq
-# during `make install', but is built against the local tree during
-# ordinary building and testing.
-#
-# During install, we must also guard against the likelihood that we
-# don't have permissions to install into the Perl module library. The
-# purer alternative would naturally be the ability to select the
-# installation directory somewhere.
-
-install: Makefile
- $(MAKE) -f Makefile clean
- POSTGRES_LIB="$(libdir)" \
- POSTGRES_INCLUDE="$(includedir)" \
- $(PERL) $(srcdir)/Makefile.PL
- $(MAKE) -f Makefile all
- -@if [ -w "`$(MAKE) --quiet -f Makefile echo-installdir`" ]; then \
- $(MAKE) -f Makefile install; \
- $(MAKE) clean; \
+# During install, we must guard against the likelihood that we don't
+# have permissions to install into the Perl module library. It's not
+# exactly fun to have to scan the build output, but...
+
+install-warning-msg := { \
+echo ""; \
+echo "*** Skipping the installation of the Perl module for lack"; \
+echo "*** of permissions. To install it, change to the directory"; \
+echo "*** `pwd`,"; \
+echo "*** become the appropriate user, and enter '$(MAKE) install'."; \
+echo ""; }
+
+# We need to massage the packlist after installation to get the
+# DESTDIR out of there.
+install: all installdirs
+ @if test -w $(DESTDIR)$(perl_installsitearch); then \
+ $(MAKE) -f Makefile pure_install DESTDIR=$(DESTDIR) && \
+ mv $(DESTDIR)$(perl_installsitearch)/auto/Pg/.packlist fake-packlist && \
+ sed 's,^$(DESTDIR),,' fake-packlist >$(DESTDIR)$(perl_installsitearch)/auto/Pg/.packlist && \
+ rm fake-packlist; \
else \
- echo "*****" ;\
- echo "* Skipping the installation of the Perl module for lack of permissions."; \
- echo "* To install it, change to the directory "`pwd`","; \
- echo "* become the appropriate user, and do \`$(MAKE) install'."; \
- echo "*****"; \
+ $(install-warning-msg); \
fi
+# Try to make the directories ourselves, otherwise the writability
+# test above may fail because of mere non-existence.
+installdirs:
+ -$(mkinstalldirs) $(DESTDIR)$(perl_installsitearch)/auto/Pg \
+ $(DESTDIR)$(perl_installsitelib) \
+ $(DESTDIR)$(perl_installman3dir)
uninstall:
- @echo "*****"; \
- echo "* The Perl module cannot be uninstalled automatically. You can"; \
- echo "* change into the directory "`pwd`" and do"; \
- echo "*"; \
- echo "* $(MAKE) -f Makefile realclean"; \
- echo "*"; \
- echo "* to delete built and installed files."; \
- echo "*****"
+ for file in `cat $(DESTDIR)$(perl_installsitearch)/auto/Pg/.packlist`; do \
+ rm -f $(DESTDIR)$$file || exit; \
+ done
+ rm -f $(DESTDIR)$(perl_installsitearch)/auto/Pg/.packlist
+ -rmdir $(DESTDIR)$(perl_installsitearch)/auto/Pg
+
clean distclean maintainer-clean:
-[ -f Makefile ] && $(MAKE) -f Makefile clean
rm -f Makefile Makefile.old
+ @rm -f fake-packlist
+
+
+installcheck test: Makefile
+ $(MAKE) -f $< test
diff --git a/src/interfaces/perl5/Makefile.PL b/src/interfaces/perl5/Makefile.PL
index 99eb9d4b59b..6c217d9e627 100644
--- a/src/interfaces/perl5/Makefile.PL
+++ b/src/interfaces/perl5/Makefile.PL
@@ -1,6 +1,6 @@
#-------------------------------------------------------
#
-# $Id: Makefile.PL,v 1.17 2001/03/06 22:07:09 tgl Exp $
+# $Id: Makefile.PL,v 1.18 2001/08/26 22:28:04 petere Exp $
#
# Copyright (c) 1997, 1998 Edmund Mergl
#
@@ -10,8 +10,20 @@ use ExtUtils::MakeMaker;
use Config;
use strict;
+my $srcdir=$ENV{SRCDIR};
+
my %opts;
+%opts = (
+ NAME => 'Pg',
+ VERSION_FROM => "Pg.pm",
+ OBJECT => "Pg\$(OBJ_EXT)",
+# explicit mappings required for VPATH builds
+ PM => { "$srcdir/Pg.pm" => '$(INST_LIBDIR)/Pg.pm' },
+ MAN3PODS => { "$srcdir/Pg.pm" => '$(INST_MAN3DIR)/Pg.$(MAN3EXT)' },
+);
+
+
if (! -d $ENV{POSTGRES_LIB} || ! -d $ENV{POSTGRES_INCLUDE}) {
# Check that we actually are inside the Postgres source tree
@@ -22,30 +34,13 @@ set environment variables POSTGRES_LIB and POSTGRES_INCLUDE to point
to where Postgres is installed (often /usr/local/pgsql/{lib,include}).\n";
}
- # Setup for build/test inside a Postgres source tree
-
- # Perl may complain if path to libpq isn't absolute
- my $cwd = `pwd`;
- chop $cwd;
-
- %opts = (
- NAME => 'Pg',
- VERSION_FROM => 'Pg.pm',
- INC => "-I../libpq -I../../include",
- OBJECT => "Pg\$(OBJ_EXT)",
- LIBS => ["-L$cwd/../libpq -lpq"],
- );
-
} else {
- # Setup for final install of Pg using an already-installed libpq,
- # or for standalone installation when Postgres already is installed.
+ # Setup for standalone installation when Postgres already is installed.
%opts = (
- NAME => 'Pg',
- VERSION_FROM => 'Pg.pm',
+ %opts,
INC => "-I$ENV{POSTGRES_INCLUDE}",
- OBJECT => "Pg\$(OBJ_EXT)",
LIBS => ["-L$ENV{POSTGRES_LIB} -lpq"],
);
}
@@ -54,13 +49,59 @@ to where Postgres is installed (often /usr/local/pgsql/{lib,include}).\n";
WriteMakefile(%opts);
-sub MY::installbin {
-q[
-# Create a target that can be used to
-# determine the Perl install directory.
-echo-installdir:
- @echo $(INSTALLSITELIB)
-];
+# Put the proper runpath into the shared object.
+
+sub MY::dynamic_lib {
+ package MY;
+ my $inherited= shift->SUPER::dynamic_lib(@_);
+
+ my $pglibdir = $ENV{PGLIBDIR};
+ return $inherited if $pglibdir eq '';
+
+ # Remove any misguided attempts to set the runpath.
+ $inherited =~ s/LD_RUN_PATH=\"\$\(LD_RUN_PATH\)\" //g;
+ $inherited =~ s/-R\S*//g;
+ $inherited =~ s/-rpath\S*//g;
+
+ my $rpath;
+ # Note that this could be different from what Makefile.port has
+ # because a different compiler/linker could be used.
+ SWITCH: for ($Config::Config{'osname'}) {
+ /hpux/ and $rpath = "+b $pglibdir", last;
+ /freebsd/ and $rpath = "-R$pglibdir", last;
+ /irix/ and $rpath = "-R$pglibdir", last;
+ /linux/ and $rpath = "-Wl,-rpath,$pglibdir", last;
+ /netbsd/ and $rpath = "-R$pglibdir", last;
+ /openbsd/ and $rpath = "-R$pglibdir", last;
+ /solaris/ and $rpath = "-R$pglibdir", last;
+ /svr5/ and $rpath = "-R$pglibdir", last;
+ }
+
+ $inherited=~ s,OTHERLDFLAGS =,OTHERLDFLAGS = $rpath , if defined $rpath;
+ $inherited;
+}
+
+
+
+# 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) $< > $@
+';
+}
+
+# Delete this rule. We can use the above one.
+sub MY::xs_o {
+ '';
+}
+
+# This rule tries to rebuild the Makefile from Makefile.PL. We can do
+# that better ourselves.
+sub MY::makefile {
+ '';
}