[PATCH] DBD::Pg configuration setup

"H.Merijn Brand" <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.dbi.sybase.devel
Message-ID <[email protected]>
PATCH at the end and attached ...

I have a system - and so do most of my customers with the same
architecture - where the base system has postgres installed.

But alas, it is version 7. That will not do. Their install is in /opt,
but as it is *system* postgress, they decided to link /opt/.../libpg.so
to /usr/lib/hpux64, which is the default $LD_LIBRARY_PATH of every
single user on the system.

I set POSTGRES_HOME to /pro/pgsql, which is a symlink to the postgres
version I am currently building against (e.g. /pro/pgsql-8.4.3). I do
have several to match what is installed at the customer. They all have
the /pro/pgsql symlink, so I can rest assured that the libs are found
whatever version I build when distributing.

When I set POSTGRES_HOME and POSTGRES_LIB (POSTGRES_INCLUDE setting
does not propagate into the binary, so I accept the return value of
App::Info), the *compilation* works fine, with just 2 warnings:

DBD-Pg-2.17.1 > env POSTGRES_HOME=/pro/pgsql POSTGRES_LIB=/pro/pgsql/lib perl Makefile.PL
Configuring DBD::Pg 2.17.1
PostgreSQL version: 80403 (default port: 5432)
POSTGRES_HOME: /pro/pgsql
POSTGRES_INCLUDE: /pro/pgsql-8.4.3/include
POSTGRES_LIB: /pro/pgsql/lib
OS: hpux
Using DBI 1.615 (for perl 5.010001 on IA64.ARCHREV_0-LP64) installed in /pro/lib/perl5/site_perl/5.10.1/IA64.ARCHREV_0-LP64/auto/DBI/
Writing Makefile for DBD::Pg

DBD-Pg-2.17.1 > make
cp lib/Bundle/DBD/Pg.pm blib/lib/Bundle/DBD/Pg.pm
cp Pg.pm blib/lib/DBD/Pg.pm
/pro/bin/perl -p -e "s/~DRIVER~/Pg/g; s/^do\(/dontdo\(/" /pro/lib/perl5/site_perl/5.10.1/IA64.ARCHREV_0-LP64/auto/DBI/Driver.xst > Pg.xsi
/pro/bin/perl /pro/lib/perl5/5.10.1/ExtUtils/xsubpp  -typemap /pro/lib/perl5/5.10.1/ExtUtils/typemap  Pg.xs > Pg.xsc && mv Pg.xsc Pg.c
cc -c  -I/pro/pgsql-8.4.3/include -I/pro/lib/perl5/site_perl/5.10.1/IA64.ARCHREV_0-LP64/auto/DBI -Ae -DPERL_DONT_CREATE_GVSV +Z -z -D_HPUX_SOURCE -Wl,+vnocompatwarnings +DD64 -I/pro/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -DPGLIBVERSION=80403 -DPGDEFPORT=5432 +O2 +Onolimit  -DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc -Dfree=Perl_mfree -Drealloc=Perl_realloc -Dcalloc=Perl_calloc -DVERSION=\"2.17.1\" -DXS_VERSION=\"2.17.1\" +Z "-I/pro/lib/perl5/5.10.1/IA64.ARCHREV_0-LP64/CORE"   Pg.c
cc -c  -I/pro/pgsql-8.4.3/include -I/pro/lib/perl5/site_perl/5.10.1/IA64.ARCHREV_0-LP64/auto/DBI -Ae -DPERL_DONT_CREATE_GVSV +Z -z -D_HPUX_SOURCE -Wl,+vnocompatwarnings +DD64 -I/pro/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -DPGLIBVERSION=80403 -DPGDEFPORT=5432 +O2 +Onolimit  -DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc -Dfree=Perl_mfree -Drealloc=Perl_realloc -Dcalloc=Perl_calloc -DVERSION=\"2.17.1\" -DXS_VERSION=\"2.17.1\" +Z "-I/pro/lib/perl5/5.10.1/IA64.ARCHREV_0-LP64/CORE"   dbdimp.c
"dbdimp.c", line 4472: warning #2068-D: integer conversion resulted in a
          change of sign
                if (!pg_db_end_txn(aTHX_ dbh, imp_dbh, -1==loid ? 0 : 1))
                                                       ^

cc -c  -I/pro/pgsql-8.4.3/include -I/pro/lib/perl5/site_perl/5.10.1/IA64.ARCHREV_0-LP64/auto/DBI -Ae -DPERL_DONT_CREATE_GVSV +Z -z -D_HPUX_SOURCE -Wl,+vnocompatwarnings +DD64 -I/pro/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -DPGLIBVERSION=80403 -DPGDEFPORT=5432 +O2 +Onolimit  -DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc -Dfree=Perl_mfree -Drealloc=Perl_realloc -Dcalloc=Perl_calloc -DVERSION=\"2.17.1\" -DXS_VERSION=\"2.17.1\" +Z "-I/pro/lib/perl5/5.10.1/IA64.ARCHREV_0-LP64/CORE"   quote.c
"quote.c", line 334: warning #2513-D: a value of type "const char *" cannot be
          assigned to an entity of type "char *"
        result = string;
               ^


cc -c  -I/pro/pgsql-8.4.3/include -I/pro/lib/perl5/site_perl/5.10.1/IA64.ARCHREV_0-LP64/auto/DBI -Ae -DPERL_DONT_CREATE_GVSV +Z -z -D_HPUX_SOURCE -Wl,+vnocompatwarnings +DD64 -I/pro/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -DPGLIBVERSION=80403 -DPGDEFPORT=5432 +O2 +Onolimit  -DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc -Dfree=Perl_mfree -Drealloc=Perl_realloc -Dcalloc=Perl_calloc -DVERSION=\"2.17.1\" -DXS_VERSION=\"2.17.1\" +Z "-I/pro/lib/perl5/5.10.1/IA64.ARCHREV_0-LP64/CORE"   types.c
Running Mkbootstrap for DBD::Pg ()
chmod 644 Pg.bs
rm -f blib/arch/auto/DBD/Pg/Pg.so


But *linking* breaks, because the default -L flags from $LDFLAGS and
$LDDLFLAGS are in front of $EXTRALIBS and/or $LDLOADLIBS and the linker
now picks up the postgres-7 library :( :(

EXTRALIBS = -L/pro/pgsql/lib -lpq
LDLOADLIBS = -L/pro/pgsql/lib -lpq -lm
BSLOADLIBS =
LD_RUN_PATH = /pro/pgsql/lib

LD_RUN_PATH="/pro/pgsq/lib" /usr/bin/ld  -b +vnocompatwarnings -L/pro/local/lib -L/usr/lib/hpux64 Pg.o dbdimp.o quote.o types.o  -o blib/arch/auto/DBD/Pg/Pg.so  \
           -L/pro/pgsql/lib -lpq -lm      \

chmod 755 blib/arch/auto/DBD/Pg/Pg.so
cp Pg.bs blib/arch/auto/DBD/Pg/Pg.bs
chmod 644 blib/arch/auto/DBD/Pg/Pg.bs
Manifying blib/man3/Bundle::DBD::Pg.3
Manifying blib/man3/DBD::Pg.3

After I changed my Makefile.PL and started over (see patch below), I
get here:

DBD-Pg-2.17.1 > make test
PGINITDB="/pro/pgsql-8.4.3/bin/initdb" PERL_DL_NONLAZY=1 /pro/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/00-signature.t .... skipped: Set the environment variable TEST_SIGNATURE to enable this test
t/00basic.t ......... ok
t/01connect.t ....... 1/13 #
# DBI                         Version 1.615
# DBD::Pg                     Version 2.17.1
# Perl                        Version 5.10.1
# OS                          hpux
# PostgreSQL (compiled)       80403
# PostgreSQL (target)         80404
# PostgreSQL (reported)       PostgreSQL 8.4.4 on x86_64-unknown-linux-gnu, compiled by GCC gcc (SUSE Linux) 4.4.1 [gcc-4_4-branch revision 150839], 64-bit
# Default port                5432
# DBI_DSN                     dbi:Pg:
# DBI_USER                    postgres
# Test schema                 dbd_pg_testschema
# PGDATABASE                  fin0737
# PGHOST                      sv02
# array_nulls                 on
# backslash_quote             safe_encoding
# client_encoding             UTF8
# server_encoding             UTF8
# standard_conforming_strings off
t/01connect.t ....... ok
t/01constants.t ..... ok
t/02attribs.t ....... 84/249
#   Failed test 'Failed ping returns a SQLSTATE code of 08000'
#   at t/02attribs.t line 1597.
#          got: '22000'
#     expected: '08000'
t/02attribs.t ....... 247/249 # Looks like you failed 1 test of 249.
t/02attribs.t ....... Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/249 subtests
        (less 1 skipped subtest: 247 okay)
t/03dbmethod.t ...... ok
t/03smethod.t ....... ok
t/04misc.t .......... ok
t/06bytea.t ......... ok
t/07copy.t .......... ok
t/08async.t ......... ok
t/09arrays.t ........ ok
t/12placeholders.t .. ok
t/20savepoints.t .... ok
t/99cleanup.t ....... 1/1 Removing test database directory
t/99cleanup.t ....... ok

Test Summary Report
-------------------
t/02attribs.t     (Wstat: 256 Tests: 249 Failed: 1)
  Failed test:  244
  Non-zero exit status: 1
Files=15, Tests=1707, 20 wallclock secs ( 0.53 usr  0.10 sys +  3.63 cusr  0.71 csys =  4.97 CPU)
Result: FAIL
Failed 1/15 test programs. 1/1707 subtests failed.
make: *** [test_dynamic] Error 255

Good enough for now.

And here's the patch. FWIW HP-UX 9 is so archaic that even /I/ do not
have access to it anymore :)

--8<---
--- Makefile.PL.org     2010-04-07 22:52:55 +0200
+++ Makefile.PL 2010-10-15 16:35:35 +0200
@@ -211,19 +211,16 @@ my %opts =
         PERL_MALLOC_OK => 1,
         NEEDS_LINKING  => 1,
         NO_META        => 1,
-     NORECURS       => 1,
+        NORECURS       => 1,
         clean          => { FILES => 'trace Pg.xsi README.testdatabase' },
-     realclean      => { FILES => 'dbdpg_test_database/' },
+        realclean      => { FILES => 'dbdpg_test_database/' },
+        macro          => {
+           LDFLAGS     => "-L$POSTGRES_LIB $Config{ldflags}",
+           LDDLFLAGS   => "-L$POSTGRES_LIB $Config{lddlflags}",
+       },
 );

-if ($os eq 'hpux') {
-    my $osvers = $Config{osvers};
-    if ($osvers < 10) {
-        print "Warning: Forced to build static not dynamic on $os $osvers.\a\n";
-        $opts{LINKTYPE} = 'static';
-    }
-}
-elsif ($os =~ /Win32/) {
+if ($os =~ /Win32/) {
        my $msdir = $POSTGRES_LIB;
        $msdir =~ s{"$}{/ms"};
        $opts{LIBS}[0] .= " -L$msdir -lsecur32";
-->8---

-- 
H.Merijn Brand  http://tux.nl      Perl Monger  http://amsterdam.pm.org/
using 5.00307 through 5.12 and porting perl5.13.x on HP-UX 10.20, 11.00,
11.11, 11.23 and 11.31, OpenSuSE 10.1, 11.0 .. 11.3 and AIX 5.2 and 5.3.
http://mirrors.develooper.com/hpux/           http://www.test-smoke.org/
http://qa.perl.org      http://www.goldmark.org/jeff/stupid-disclaimers/
Makeffile.PL.diff (text/x-patch, 926 B)
--- Makefile.PL.org	2010-04-07 22:52:55 +0200
+++ Makefile.PL	2010-10-15 16:35:35 +0200
@@ -211,19 +211,16 @@ my %opts =
 	 PERL_MALLOC_OK => 1,
 	 NEEDS_LINKING  => 1,
 	 NO_META        => 1,
-     NORECURS       => 1,
+	 NORECURS       => 1,
 	 clean          => { FILES => 'trace Pg.xsi README.testdatabase' },
-     realclean      => { FILES => 'dbdpg_test_database/' },
+	 realclean      => { FILES => 'dbdpg_test_database/' },
+	 macro		=> {
+	    LDFLAGS	=> "-L$POSTGRES_LIB $Config{ldflags}",
+	    LDDLFLAGS	=> "-L$POSTGRES_LIB $Config{lddlflags}",
+	},
 );
 
-if ($os eq 'hpux') {
-    my $osvers = $Config{osvers};
-    if ($osvers < 10) {
-        print "Warning: Forced to build static not dynamic on $os $osvers.\a\n";
-        $opts{LINKTYPE} = 'static';
-    }
-}
-elsif ($os =~ /Win32/) {
+if ($os =~ /Win32/) {
 	my $msdir = $POSTGRES_LIB;
 	$msdir =~ s{"$}{/ms"};
 	$opts{LIBS}[0] .= " -L$msdir -lsecur32";
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.