#package PAB3::DB::Driver::Sqlite3::Makefile; use 5.008; use ExtUtils::MakeMaker (); use Config; $ExtUtils::MakeMaker::Verbose = 0; my %MY_MAKEOPTS = (); my %os_supported = ( 'linux' => 1, 'darwin' => 1 ); my $TERM_RED = "\033[31;1m"; my $TERM_GREEN = "\033[32;1m"; my $TERM_YELLOW = "\033[33;1m"; my $TERM_BLUE = "\033[34;1m"; my $TERM_MAGENTA = "\033[35;1m"; my $TERM_CYAN = "\033[36;1m"; my $TERM_WHITE = "\033[37;1m"; my $TERM_RESET = "\033[m"; my $_useit = ! $PAB || ( $PAB && $PAB_OPT{'with_sqlite3'} ); my( @_INC, %_LIBREQ, %_LIBS, @_LIB_PATH, @_INC_PATH, @_EXT, $lb, $ic ); @_INC = qw(sqlite3.h); %_LIBREQ = %_LIBS = ( 'sqlite3' => 1 ); @_LIB_PATH = qw(/usr/local/lib64 /usr/local/lib /usr/lib64 /usr/lib); @_INC_PATH = (split( ' ', $Config{'incpath'} ), split( ' ', $Config{'locincpth'} )); @_EXT = ( '.so', '.a', '.dll', '.dylib' ); if( ! $os_supported{$^O} ) { if( $PAB && $PAB_OPT{'with_sqlite3'} eq '_auto_' ) { $_useit = 0; } elsif( $_useit ) { print < 'PAB3::DB::Driver::Sqlite3', VERSION_FROM => 'Sqlite3.pm', ABSTRACT => 'Perl wrapper to Sqlite3', XSPROTOARG => '-prototypes', PREREQ_PM => {}, OBJECT => '$(O_FILES)', XS => { 'Sqlite3.xs' => 'Sqlite3.c' }, C => [ 'my_sqlite3.c', 'Sqlite3.c' ], DEFINE => '', PL_FILES => { 'install_files.PL' => $PAB ? 'pab' : 'self' }, ); if( ! $_useit ) { &donotuse(); ExtUtils::MakeMaker::WriteMakefile( %MY_MAKEOPTS ); $PAB ? return 1 : exit 0; } if( $PAB_OPT{'with_sqlite3'} ) { if( -d $PAB_OPT{'with_sqlite3'} ) { @_INC_PATH = ( $PAB_OPT{'with_sqlite3'} . '/include' ); unshift @_LIB_PATH, $PAB_OPT{'with_sqlite3'} . '/lib'; $lb = $ic = 1; } } if( $Config{'usethreads'} ) { $MY_MAKEOPTS{'DEFINE'} .= ' -DUSE_THREADS'; } if( $PAB_OPT{'sqlite3_enable_metadata'} ) { $MY_MAKEOPTS{'DEFINE'} .= ' -DSQLITE_ENABLE_COLUMN_METADATA'; } if( $^O eq 'darwin' ) { $MY_MAKEOPTS{'DEFINE'} .= ' -fnested-functions'; } if( $^O eq 'MSWin32' ) { $MY_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 = ''; } my @argv = (); foreach( @ARGV ) { if( /--help/ ) { print_usage(); } elsif( /--libdir=(.+)/ ) { @_LIB_PATH = ( $lb = $1 ); } elsif( /--incdir=(.+)/ ) { @_INC_PATH = ( $ic = $1 ); } else { push @argv, $_; } } @ARGV = @argv; my $out = select( STDOUT ); $| = 1; select( $out ); print $TERM_BLUE, "Preparing ", $TERM_YELLOW, $MY_MAKEOPTS{'NAME'}, $TERM_RESET, "\n"; foreach my $lib( keys %_LIBS ) { print $TERM_WHITE, "Looking for ", $TERM_GREEN, "lib$lib", $TERM_RESET, " ..."; my $found = 0; foreach my $path( @_LIB_PATH ) { foreach my $ext( @_EXT ) { my $file = $path . '/lib' . $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, 'lib' . $lib . $ext ); } } } } if( ! $found ) { print $TERM_RED, " not found", $TERM_RESET; delete $_LIBS{$lib}; } print "\n"; } if( $^O eq 'MSWin32' ) { $MY_MAKEOPTS{'LIBS'} = [ join( ' ', map{ '"-L' . $_ . '"' } @_LIB_PATH ) . ' ' . join( ' ', map{ '-l' . $_ } keys %_LIBS ) ]; $MY_MAKEOPTS{'INC'} = join( ' ', map{ '"-I' . $_ . '"' } @_INC_PATH ); } else { $MY_MAKEOPTS{'LIBS'} = [ join( ' ', map{ '-L' . $_ } @_LIB_PATH ) . ' ' . join( ' ', map{ '-l' . $_ } keys %_LIBS ) ]; $MY_MAKEOPTS{'INC'} = join( ' ', map{ '-I' . $_ } @_INC_PATH ); } my $found = 1; foreach( keys %_LIBREQ ) { if( ! $_LIBS{$_} ) { $found = 0; last; } } if( $found ) { $found = find_header_item( \@_INC_PATH, 'sqlite3.h', 'sqlite3_prepare' ); } if( $found ) { my $r = find_header_item( \@_INC_PATH, 'sqlite3.h', 'sqlite3_prepare_v2' ); if( $r ) { $MY_MAKEOPTS{'DEFINE'} .= ' -DSQLITE_HAS_V2'; } } if( ! $found ) { if( $PAB && $PAB_OPT{'with_sqlite3'} eq '_auto_' ) { &donotuse(); WriteMakefile( %MY_MAKEOPTS ); $PAB ? return 1 : exit 0; } else { print <', $dst ) or warn "Can not open $dst: $!"; binmode( $dfh ); while( read( $sfh, $buf, 8192 ) ) { print $dfh $buf; } close( $dfh ); close( $sfh ); } sub find_header_item { my( $inc, $file, $item, $level, $reflist ) = @_; my( $fh, @ct, $p ); $reflist ||= {}; $reflist->{$file} = 1; $level ||= 0; $level or print "Looking for '$item' ... "; foreach $p( @$inc ) { $_ = $p . '/' . $file; -f or next; open $fh, '<' . $_; @ct = <$fh>; close $fh; foreach( @ct ) { if( m!^\#include\s+[\<\"]([\w\.\_\/\\]+?\.h\w*)[\"\>]! ) { #if( m!^\#include! ) { next if $reflist->{$1}; #print "include $1\n"; return 1 if find_header_item( $inc, $1, $item, $level + 1, $reflist ); } if( index( $_, $item ) >= 0 ) { print "found\n"; return 1; } } } $level or print "not found\n"; return 0; } 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; }