use 5.008; use ExtUtils::MakeMaker; use Config; require 'copy_dlls.PL'; $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 < 'PAB3::DB::Driver::Postgres', VERSION_FROM => 'Postgres.pm', ABSTRACT => 'Perl5 wrapper to libpgsql', XSPROTOARG => '-prototypes', PREREQ_PM => {}, 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(); 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 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 < {}; rename 't', '_t' if -d 't'; }