/usr/local/CPAN/PAB3-DB-Driver-Postgres/Makefile.PL
use 5.008;
use ExtUtils::MakeMaker ();
use Config;
require 'copy_dlls.PL';
$ExtUtils::MakeMaker::Verbose = 0;
%os_supported = ( 'linux' => 1, 'MSWin32' => 1, 'darwin' => 1 );
our $TERM_RED = "\033[31;1m";
our $TERM_GREEN = "\033[32;1m";
our $TERM_YELLOW = "\033[33;1m";
our $TERM_BLUE = "\033[34;1m";
our $TERM_MAGENTA = "\033[35;1m";
our $TERM_CYAN = "\033[36;1m";
our $TERM_WHITE = "\033[37;1m";
our $TERM_RESET = "\033[m";
my $_useit = !$PAB || ($PAB && $PAB_OPT{'with_pgsql'});
%_LIBREQ = %_LIBS = ( 'pq' => 1 );
@_LIB_PATH = qw(/usr/local/lib64 /usr/local/lib /usr/lib64 /usr/lib);
@_INC_PATH = qw(/usr/local/include/pgsql /usr/include/pgsql);
@_LIB_PATH_MY = qw(/usr/local/pgsql/lib);
@_INC_PATH_MY = qw(/usr/local/pgsql/include);
@_EXT = ( '.so', '.a', '.dll', '.dylib' );
$_LIBPREFIX = 'lib';
$_BIN_DIR = '';
if( !$os_supported{$^O} ) {
if( $PAB && $PAB_OPT{'with_pgsql'} eq '_auto_' ) {
$_useit = 0;
}
elsif( $_useit ) {
print <<EOF1;
************* WARNING *************
* Your operation system is not *
* supported. *
* The installation may fail! *
***********************************
EOF1
}
}
%_MAKEOPTS = (
NAME => 'PAB3::DB::Driver::Postgres',
VERSION_FROM => 'Postgres.pm',
ABSTRACT => 'Perl5 wrapper to libpgsql',
XSPROTOARG => '-prototypes',
PREREQ_PM => {},
DEFINE => '',
OBJECT => '$(O_FILES)',
XS => { 'Postgres.xs' => 'Postgres.c' },
C => [ 'my_postgres.c', 'Postgres.c' ],
PL_FILES => { 'copy_dlls.PL' => $PAB ? 'pab' : 'self' },
);
if( ! $_useit ) {
&donotuse();
ExtUtils::MakeMaker::WriteMakefile( %_MAKEOPTS );
$PAB ? return 1 : exit 0;
}
$mc = 'pg_config';
if( $^O eq 'MSWin32' ) {
print "*****************************************************************\n";
print "*** Tested with MS-VC 7.10 and Postgres 8.2.4 ***\n";
print "*****************************************************************\n";
$mc = undef;
@_LIB_PATH_MY = @_LIB_PATH = ();
@_INC_PATH_MY = @_INC_PATH = ();
%_LIBREQ = %_LIBS = ( 'libpq' => 1 );
@_EXT = ( '.dll' );
#@_OBJECT = ( 'libpq.lib' );
$_LIBPREFIX = '';
require Win32::TieRegistry;
import Win32::TieRegistry;
$Registry->Delimiter( '/' );
$keys = $Registry->{'HKEY_LOCAL_MACHINE/Software/PostgreSQL/Installations'};
if( $keys ) {
foreach( sort keys %$keys ) {
next if ! ref( $keys->{$_} ) || ! $keys->{$_}->{'Base Directory'};
my $path = $keys->{$_}->{'Base Directory'};
$path =~ s!\\!\\\\!g;
my $inc = $path . 'include\\libpq-fe.h';
if( -f $inc ) {
$_BIN_DIR = $path . 'bin';
unshift( @_INC_PATH_MY, $path . 'include' );
unshift( @_LIB_PATH_MY, $path . 'bin', $path . 'lib', $path . 'lib\\ms' );
©_dlls( $path . 'bin/', '' );
}
if( -x $path . 'bin/pg_config.exe' ) {
$mc = $path . 'bin/pg_config.exe';
}
}
}
}
if( $PAB_OPT{'with_pgsql'} ) {
if( -d $PAB_OPT{'with_pgsql'} ) {
@_INC_PATH_MY = ( $PAB_OPT{'with_pgsql'} . '/include' );
@_LIB_PATH_MY = ( $PAB_OPT{'with_pgsql'} . '/lib' );
$_BIN_DIR = $PAB_OPT{'with_pgsql'} . '/bin';
©_dlls( $_BIN_DIR . '/', '' );
$mc = 0;
}
elsif( -x $PAB_OPT{'with_pgsql'} ) {
$mc = $PAB_OPT{'with_pgsql'};
}
}
if( $Config{'usethreads'} ) {
$_MAKEOPTS{'DEFINE'} .= ' -DUSE_THREADS';
}
if( $^O eq 'MSWin32' ) {
$_MAKEOPTS{'DEFINE'} .= ' -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS';
}
if( $^O ne 'linux' ) {
$TERM_RED = $TERM_GREEN = $TERM_YELLOW = $TERM_BLUE = $TERM_MAGENTA =
$TERM_CYAN = $TERM_WHITE = $TERM_RESET = '';
}
@argv = ();
foreach( @ARGV ) {
if( /--help/ ) {
print_usage();
}
if( /--pg_config=(.+)/ ) {
$mc = $1;
}
elsif( /--pg_base=(.+)/ ) {
@_INC_PATH_MY = ( $1 . '/include' );
@_LIB_PATH_MY = ( $1 . '/lib' );
$_BIN_DIR = $1 . '/bin';
©_dlls( $_BIN_DIR . '/', '' );
$bd = $lb = $ic = 1;
}
elsif( /--libdir=(.+)/ ) {
@_LIB_PATH_MY = ( $1 );
$lb = 1;
}
elsif( /--bindir=(.+)/ ) {
$_BIN_DIR = $1;
©_dlls( $_BIN_DIR . '/', '' );
$bd = 1;
}
elsif( /--incdir=(.+)/ ) {
@_INC_PATH_MY = ( $1 );
$ic = 1;
}
else {
push @argv, $_;
}
}
@ARGV = @argv;
$out = select( STDOUT );
$| = 1;
select( $out );
$res = $mc ? `$mc --version` : 0;
if( $res ) {
if( ! $ic ) {
$ic = `$mc --includedir`;
$ic =~ s![\n\r]+$!!;
@_INC_PATH_MY = ( $ic );
}
if( ! $lb ) {
$lb = `$mc --libdir`;
$lb =~ s![\n\r]+$!!;
@_LIB_PATH_MY = ( $lb );
if( $^O eq 'MSWin32' ) {
unshift @_LIB_PATH_MY, $lb . '/ms';
$lb = `$mc --bindir`;
$lb =~ s![\n\r]+$!!;
unshift @_LIB_PATH_MY, $lb;
©_dlls( $lb . '/', '' );
}
}
if( ! $bd ) {
$bd = `$mc --bindir`;
$bd =~ s![\n\r]+$!!;
$_BIN_DIR = $bd;
}
}
unshift @_LIB_PATH, @_LIB_PATH_MY;
unshift @_INC_PATH, @_INC_PATH_MY;
print $TERM_BLUE, "Preparing ", $TERM_YELLOW, $_MAKEOPTS{'NAME'}, $TERM_RESET, "\n";
foreach $lib( keys %_LIBS ) {
print $TERM_WHITE, "Looking for ", $TERM_GREEN, $_LIBPREFIX . "$lib", $TERM_RESET, " ...";
$found = 0;
foreach $path( @_LIB_PATH ) {
foreach $ext( @_EXT ) {
my $file = $path . '/' . $_LIBPREFIX . $lib . $ext;
if( -f $file ) {
print $TERM_WHITE, "\n found at ", $TERM_MAGENTA, $file, $TERM_RESET;
$found = 1;
if( $_LIBS{$lib} eq 'inst' ) {
&file_copy( $file, $_LIBPREFIX . $lib . $ext );
}
}
}
}
if( ! $found ) {
print $TERM_RED, " not found", $TERM_RESET;
delete $_LIBS{$lib};
}
print "\n";
}
if( $^O eq 'MSWin32' ) {
$_MAKEOPTS{'LIBS'} = [
join( ' ', map{ '"-L' . $_ . '"' } @_LIB_PATH ) . ' '
. join( ' ', map{ '-l' . $_ } keys %_LIBS )
. ' ' . join( ' ', @_OBJECT )
];
$_MAKEOPTS{'INC'} = join( ' ', map{ '"-I' . $_ . '"' } @_INC_PATH );
}
else {
$_MAKEOPTS{'LIBS'} = [
join( ' ', map{ '-L' . $_ } @_LIB_PATH ) . ' '
. join( ' ', map{ '-l' . $_ } keys %_LIBS )
. ' ' . join( ' ', @_OBJECT )
];
$_MAKEOPTS{'INC'} = join( ' ', map{ '-I' . $_ } @_INC_PATH );
}
$found = 1;
foreach( keys %_LIBREQ ) {
if( ! $_LIBS{$_} ) {
$found = 0;
last;
}
}
if( ! $found ) {
if( $PAB && $PAB_OPT{'with_pgsql'} eq '_auto_' ) {
&donotuse();
}
else {
print <<EOF1;
************* WARNING *************
* Some required libraries has not *
* been found. *
* The installation may fail! *
***********************************
EOF1
}
}
else {
rename '_t', 't' if -d '_t';
}
ExtUtils::MakeMaker::WriteMakefile( %_MAKEOPTS );
1;
sub print_usage {
print <<EOTH;
Usage: perl $0 [options]
Options:
--help print this message
--pg_base=DIR DIR is the PostgreSQL base directory
--pg_config=FILE FILE is the pathname to pg_config
--libdir=DIR Use DIR for running the linker; defaults to the value of "pg_config --libdir" or a guessed value
--incdir=DIR Use DIR for running the comiler; defaults to the value of "pg_config --includedir" or a guessed value
--bindir=DIR Use DIR for copying dlls on MSWin32; defaults to the value of "pg_config --bindir" or a guessed value
EOTH
exit( 256 );
}
sub donotuse {
$_MAKEOPTS{'XS'} = {};
$_MAKEOPTS{'C'} = [];
$_MAKEOPTS{'OBJECT'} = '';
$_MAKEOPTS{'PM'} = {};
$_MAKEOPTS{'PL_FILES'} => {};
rename 't', '_t' if -d 't';
}
package MY;
sub cflags {
my $inherited = shift->SUPER::cflags( @_ );
if( $^O eq 'MSWin32' ) {
$inherited =~ s/-O1/-O2/sg;
# set static linking to crt
$inherited =~ s/-MD/-MT/sg;
}
$inherited;
}
sub const_loadlibs {
my $inherited = shift->SUPER::const_loadlibs( @_ );
if( $^O eq 'MSWin32' ) {
# set static linking to crt
$inherited =~ s/msvcrt\.lib/libcmt\.lib/sgi;
}
$inherited;
}