/usr/local/CPAN/DBD-MaxDB/Makefile.PL


#!/usr/local/bin/perl -w
#/*!
#  @file           Makefile.PL
#  @author         MarcoP, ThomasS
#  @ingroup        dbd::MaxDB
#  @brief          
#
#\if EMIT_LICENCE
#
#    ========== licence begin  SAP
#
#    (c) Copyright 2001-2006 SAP AG
#
#    All rights reserved.
#
#    ========== licence end


#\endif
#*/
BEGIN { require 5.004 }	
use Config;
use ExtUtils::MakeMaker 5.16, qw(&WriteMakefile $Verbose);
use File::Basename;
use Getopt::Long;
use File::Spec;

use DBI 1.21;		
use DBI::DBD;
use strict;

sub getSQLDBCSDKFromIndepPath();
sub usageSQLDBCSDK;
sub checkSQLDBCSDKVersion;

my $dbi_dir      = dbd_dbi_dir();
my $dbi_arch_dir = dbd_dbi_arch_dir();

my %opts =
(
    NAME	=> 'DBD::MaxDB',
    VERSION_FROM => 'MaxDB.pm',
    clean	=> { FILES=> 'MaxDB.xsi dbdmaxdb.h' },
    dist	=> {
	DIST_DEFAULT=> 'distcheck readmetxt tardist',
#	PREOP    => '$(MAKE) -f Makefile.old distdir',
	COMPRESS => 'gzip -f -v9', SUFFIX => 'gz'
    },
    OBJECT	=> '$(O_FILES)',
 );
if ($ExtUtils::MakeMaker::VERSION >= 5.43) {
    $opts{AUTHOR} = 'Marco Paskamp and Thomas Simenec https://forums.sdn.sap.com/forum.jspa?forumID=90&start=0';
    $opts{ABSTRACT} = 'A MaxDB driver for the Perl5 Database Interface (DBI)';
    $opts{PREREQ_PM} = { DBI => 1.21 };
    $opts{CAPI} = 'TRUE' if $Config{archname} =~ /-object\b/i;
}

my $opt_g = 0;
my $opt_o = '';
my $opt_i = '';
my $opt_l = '';
Getopt::Long::GetOptions("g!" => \$opt_g,
                         "o=s" => \$opt_o,
                         "i=s" => \$opt_i,
                         "l=s" => \$opt_l) or die "Invalid arguments";

    print "Overriding MaxDB directory with command line option        : $opt_o\n" if $opt_o ;
    print "Overriding MaxDB include directory with command line option: $opt_i\n" if $opt_i ;
    print "Overriding MaxDB lib directory with command line option    : $opt_l\n" if $opt_l ;

print "\nConfiguring DBD::MaxDB ...\n";

my $SQLDBC_SDK= $opt_o || $ENV{SQLDBCSDK} || getSQLDBCSDKFromIndepPath() || $ENV{INSTROOT} || "";

unless (($SQLDBC_SDK && -d $SQLDBC_SDK) || ($opt_i ne '' && $opt_l ne ''))
{die "SQLDBCSDK environment variable ($SQLDBC_SDK) does not refer to a directory.\n";}
my $SQLDBC_incl=$SQLDBC_SDK.'/sdk/sqldbc/incl';

if ($opt_i ne '') {
    $SQLDBC_incl=$opt_i;
}

my $SQLDBC_lib;
my $SQLDBC_slPath;
my $SQLDBC_sl;
if ($^O ne 'MSWin32') {
  $opts{OPTIMIZE} = '-g -O0' if $opt_g;
  if (($^O eq 'aix') || ($^O eq 'solaris')|| ($^O eq 'hpux' &&  !(`uname -m` =~ /ia64/))) {
    $SQLDBC_slPath=$SQLDBC_SDK.'/lib/lib64';
  } else {
    $SQLDBC_slPath=$SQLDBC_SDK.'/lib';
  }
}else {
  $opts{OPTIMIZE} = '/Zi' if $opt_g;
  $SQLDBC_slPath=$SQLDBC_SDK.'/pgm';
  $SQLDBC_lib=$SQLDBC_SDK.'/sdk/sqldbc/lib/libSQLDBC_C'.$Config{_a};
}
$SQLDBC_sl=$SQLDBC_slPath.'/libSQLDBC_C.';
if ($^O eq 'aix'){
  $SQLDBC_sl.= 'so';
}else {
  $SQLDBC_sl.= $Config{so};
}

if ($opt_l ne '' ) {
    $SQLDBC_slPath=$opt_l;
}

$SQLDBC_sl=$SQLDBC_slPath.'/libSQLDBC_C.'.$Config{so};

if ($^O eq 'MSWin32') {
  $SQLDBC_lib    = Win32::GetShortPathName($SQLDBC_lib);
  $SQLDBC_slPath = Win32::GetShortPathName($SQLDBC_slPath);
  $SQLDBC_sl     = Win32::GetShortPathName($SQLDBC_sl);
  $SQLDBC_incl   = Win32::GetShortPathName($SQLDBC_incl);
  $SQLDBC_SDK    = Win32::GetShortPathName($SQLDBC_SDK);
}

checkSQLDBCSDK($SQLDBC_sl);
checkSQLDBCSDK("$SQLDBC_incl/SQLDBC_C.h");
checkSQLDBCSDK("$SQLDBC_incl/SQLDBC_Types.h");
checkSQLDBCSDK($SQLDBC_lib) if ($^O eq 'MSWin32');

print "Using MaxDB SQLDBC sdk installed in $SQLDBC_SDK\n";

checkSQLDBCSDKVersion($SQLDBC_incl.'/SQLDBC_C.h');

if ($^O ne 'MSWin32') {
	$SQLDBC_sl     =~ s/^(.*\s+.*)/\"$1\"/;
	$SQLDBC_slPath =~ s/^(.*\s+.*)/\"$1\"/;
	$SQLDBC_incl   =~ s/^(.*\s+.*)/\"$1\"/;
}

if ($^O eq 'aix') {
  $opts{CCFLAGS} .= " -DREL30 -DAIX -D_IBMR2 -DSAG -ma -qnoinline -DBIT64 -qtbtable=full -qalias=noansi -U__STR__ -qchars=signed  -D_LARGE_FILES -D_REENTRANT -qnotempinc";
}
$opts{INC} .= ' -I'.$SQLDBC_incl." -I$dbi_arch_dir";
if ($^O eq 'aix') {
$opts{INC} .= " -q64 -qcpluscmt -qsuppress=1506-234 -DBIT64";
}
if ($^O ne 'MSWin32') {
  $opts{LIBS} .= ' -L'.$SQLDBC_slPath.' -lSQLDBC_C -ldl';
} else {
  $opts{LIBS} .= ' '.$SQLDBC_lib;
}

print "\n";
WriteMakefile(%opts);

local($^W)=0;
print qq{
The DBD::MaxDB tests will use these values for the database connection:
        DBI_DSN=$ENV{DBI_DSN}	e.g. dbi:MaxDB:<host>/<dbname>
        DBI_USER=$ENV{DBI_USER}
        DBI_PASS=$ENV{DBI_PASS}
};
print "Warning: not all required environment variables are set.\n"
	unless ($ENV{DBI_DSN} && $ENV{DBI_USER} && $ENV{DBI_PASS});
print "Warning: DBI_DSN ($ENV{DBI_DSN}) doesn't start with 'dbi:MaxDB:'\n"
	if ($ENV{DBI_DSN} && $ENV{DBI_DSN} !~ m/^dbi:MaxDB:/);
print "\n";

sub MY::post_constants {
   my ($self) = shift;
   my $sqldbc_sl_name = 'libSQLDBC_C.'.$Config{so};
   '
# copy some files
inst_libdbdsqldbc =       ' . File::Spec->catdir ($self->{INST_LIB}, 'DBD/MaxDB') . '
getinfo_pm =              ' . File::Spec->catfile($self->{INST_LIB}, 'DBD/MaxDB', 'GetInfo.pm') . '
typeinfoascii_pm =        ' . File::Spec->catfile($self->{INST_LIB}, 'DBD/MaxDB', 'TypeInfoAscii.pm') . '
typeinfounicode_pm =      ' . File::Spec->catfile($self->{INST_LIB}, 'DBD/MaxDB', 'TypeInfoUnicode.pm') . '
inst_libdbdsqldbc_c_sl =  ' . File::Spec->catdir ($self->{INST_ARCHAUTODIR}, '') . '
libdbdsqldbc_c_sl =       ' . File::Spec->catfile($self->{INST_ARCHAUTODIR}, '', $sqldbc_sl_name) . '

config :: $(getinfo_pm) $(typeinfoascii_pm) $(typeinfounicode_pm) $(libdbdsqldbc_c_sl)
		@$(NOOP)

$(getinfo_pm): GetInfo.pm
		$(NOECHO) $(MKPATH) $(inst_libdbdsqldbc)
		$(NOECHO) $(RM_F) $(getinfo_pm)
		$(CP) GetInfo.pm $(getinfo_pm)

$(typeinfoascii_pm): TypeInfoAscii.pm
		$(NOECHO) $(MKPATH) $(inst_libdbdsqldbc)
		$(NOECHO) $(RM_F) $(typeinfoascii_pm)
		$(CP) TypeInfoAscii.pm $(typeinfoascii_pm)

$(typeinfounicode_pm): TypeInfoUnicode.pm
		$(NOECHO) $(MKPATH) $(inst_libdbdsqldbc)
		$(NOECHO) $(RM_F) $(typeinfounicode_pm)
		$(CP) TypeInfoUnicode.pm $(typeinfounicode_pm)

$(libdbdsqldbc_c_sl): '.$SQLDBC_sl.'
		$(NOECHO) $(MKPATH) $(inst_libdbdsqldbc_c_sl)
		$(NOECHO) $(RM_F) $(libdbdsqldbc_c_sl)
		$(CP) '.$SQLDBC_sl.' $(libdbdsqldbc_c_sl)
';
}

# ====================================================================
sub checkSQLDBCSDK {
  my ($filename)=@_;
  
  unless ( -f $filename){ 
    print "\n";
    print "Cannot find $filename\n\n";
    print "The DBD::MaxDB module needs to link with MaxDB's common database \n";
    print "interface SQLDBC. The DBD::MaxDB module does _not_ include the\n";
    print "MaxDB SQLDBC sdk! If it isn't already installed you can download\n";
    print "it from the MaxDB homepage.\n\n";
    print "You need also to set the path to the SQLDBC sdk directory.\n";
    print "You can do this either by setting the SQLDBCSDK environment variable\n";
    print "or by running 'perl Makefile.PL -o <sqldbc-sdk-dir>'.\n";
    print "Alternatively you can specify the path to the include and library\n";
    print "files separately using the -i <include-path> and -l <lib-path>\n";
    print "command line switches.\n\n";
    die "Makefile.PL aborted.\n";
  }
}

sub checkSQLDBCSDKVersion {
  my ($sqldbc_h) = @_;
  my $version = undef; 
  my $version_okay = 0; 
  if (open FILE_IN, "<$sqldbc_h") {
    while (<FILE_IN>) {
      chomp $_;
      if (/^#define SQLDBC_CHeaderVersion \"SQLDBC_C.H\s*((\d+).(\d+).(\d+)\s*BUILD\s*(\d+).*)\"$/) {
			   if ( $2<7 || ($2>=7 && $3<6) || ($2==7 && $3==6 && $4==0 && $5<=19)){ 
			    $version = $1;
          last;
			  }
			  $version_okay = 1;
        print "SQLDBC sdk version is $1\n"; 
        last;
      }
    }
    close (FILE_IN);
    if (! $version_okay){ 
      print "\n";
      if ($version){
        print "Wrong version of SQLDBC sdk found $version.\n"; 
      }else {
        print "Cannot find the version of SQLDBC sdk.\n"; 
      }
	    print "The version of SQLDBC-SDK must be at least 7.6.0 Build 019 but\n";
	    print "you should always try the newest version available.\n\n";
	    print "The DBD::MaxDB module needs to link with MaxDB's common database \n";
	    print "interface SQLDBC. The DBD::MaxDB module does _not_ include the\n";
	    print "MaxDB SQLDBC sdk! If it isn't already installed you can download\n";
	    print "it from the MaxDB homepage.\n\n";
	    print "You need also to set the path to the SQLDBC sdk directory.\n";
	    print "You can do this ether by setting the SQLDBCSDK environment variable\n";
	    print "or by runing 'perl Makefile.PL -o <sqldbc-sdk-dir>'.\n\n";
	    die "Makefile.PL aborted.\n";
  	}
  }
}

sub getSQLDBCSDKFromIndepPath(){
  my $indep=undef;
  if ($^O eq 'MSWin32') {
     eval {require Win32API::Registry; }; if ($@) {return undef};
     my ($key, $type);
     Win32API::Registry::RegOpenKeyEx( Win32API::Registry::HKEY_LOCAL_MACHINE(), "SOFTWARE\\SAP\\SAP DBTech", 0, Win32API::Registry::KEY_READ(), $key )
         or  return undef;
     Win32API::Registry::RegQueryValueEx( $key, "IndepPrograms", [], $type, $indep, [] )
         or  return undef;
     Win32API::Registry::RegCloseKey( $key );
  }else {
    if (open FILE_IN, "</etc/opt/sdb") {
      while (<FILE_IN>) {
        chomp $_;
        next if ((/^$/) or (/^#/));
        if (/^IndepPrograms=(.*)$/) {
          $indep=$1;
          last;
        }
      }
      close (FILE_IN);
    }
  }
  return $indep;
} 
 
{
    package MY; # SUPER needs package context, $self is not sufficient

    use strict;
    use Config;

    sub postamble {
      require DBI::DBD;
      "\n" . DBI::DBD::dbd_postamble(@_) . <<"POSTAMBLE";
    
readmetxt: README.pod
\tpod2text README.pod  > README
    
POSTAMBLE
    };

#    sub postamble {
#       return main::dbd_postamble(@_);
#    }
}
__END__