/usr/local/CPAN/PAB3-DB-Driver-Sqlite3/Makefile.PL


#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 <<EOF1;
************* WARNING *************
* Your operation system is not    *
* supported.                      *
* The installation may fail!      *
***********************************
EOF1
	}
}

%MY_MAKEOPTS = (
    NAME => '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 <<EOF1;
************* WARNING *************
* Some required libraries has not *
* been found.                     *
* The installation may fail!      *
***********************************
EOF1
	}
}

rename '_t', 't' if -d '_t';
#use PAB3;
#PAB3::print_r( \%MY_MAKEOPTS );
ExtUtils::MakeMaker::WriteMakefile( %MY_MAKEOPTS );

1;

sub print_usage {
	print <<EOTH;
Usage: perl $0 [options]
Options:
    --help            print this message
    --libdir=DIR      Use DIR for running the linker; defaults to a guessed value
    --incdir=DIR      Use DIR for running the comiler; defaults to a guessed value
EOTH
	exit( 256 );
}

sub donotuse {
	$MY_MAKEOPTS{'XS'} = {};
	$MY_MAKEOPTS{'C'} = [];
	$MY_MAKEOPTS{'OBJECT'} = '';
	$MY_MAKEOPTS{'PM'} = {};
    $MY_MAKEOPTS{'PL_FILES'} = {};
	rename 't', '_t' if -d 't';
}

sub file_copy {
	my( $src, $dst ) = @_;
	my( $sfh, $dfh, $buf );
	return if ! -f $src;
	open( $sfh, '<', $src ) or warn "Can not open $src: $!";
	binmode( $sfh );
	open( $dfh, '>', $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;
}