#
# MakeMaker file for the DB2 Administrative API
#
# $Id: Makefile.PL,v 165.2 2009/04/22 14:01:32 biersma Exp $
#
use Config;
use ExtUtils::MakeMaker;
use strict;
#
# DB2_VERSION will be 8.2, 9.1, 9.5, 9.7
#
# NOTE: support for V7.2 and V8.1 has been dropped in release 3.1; use
# the older 3.0 release if you use theose older DB2 releases.
#
my $db2_version = $ENV{DB2_VERSION} || do {
#
# Exit with zero status to avoid warnings from CPAN testers
#
warn "Environment variable 'DB2_VERSION' not set\n";
exit(0);
};
my ($db2_version_enum, @defines, %extra_args);
#
# Determine version enum
#
if ($db2_version =~ /^V8\.2/) {
$db2_version_enum = 'db2Version822'; # Use 820 if running w/o FixPaks
} elsif ($db2_version =~ /^V9\.1/) {
$db2_version_enum = 'db2Version900';
} elsif ($db2_version =~ /^V9\.5/) {
$db2_version_enum = 'db2Version950';
} elsif ($db2_version =~ /^V9\.7/) {
$db2_version_enum = 'db2Version970';
} else {
die "Unsupported DB2 version '$db2_version'\n";
}
push @defines, "-DDB2_VERSION_ENUM=$db2_version_enum";
#
# Determine path. We look at the following environment variables:
# - DB2PATH (common for Windows)
# - DB2DIR
# - DB2_HOME
# After that, we fall back to platform defaults (guesses)
#
# All this can be overridden by DB2_PREFIX for Morgan Stanley hacks,
# see below.
#
my $db2_path;
foreach my $env_var (qw(DB2PATH DB2DIR DB2_HOME)) {
next unless (defined $ENV{$env_var} && -d $ENV{$env_var});
print "Using \$$env_var to set DB2 location\n";
$db2_path = $ENV{$env_var};
last;
}
unless (defined $db2_path) {
if ($db2_version =~ /^V8\./) {
if ($^O eq 'linux' || $^O eq 'solaris') {
$db2_path = "/opt/IBM/db2/V8.1";
} elsif ($^O eq 'aix') {
$db2_path = "/usr/opt/db2_08_01";
} else {
die "unexpected V8.2 platform '$^O'";
}
} elsif ($db2_version =~ /^V9\.([157])/) {
my $sub_release = $1; # 1, 5 or 7
if ($^O eq 'linux') {
$db2_path = "/opt/ibm/db2/V9.$sub_release";
} elsif ($^O eq 'solaris') {
$db2_path = "/opt/IBM/db2/V9.$sub_release";
} elsif ($^O eq 'aix') {
$db2_path = "/usr/opt/db2_09_0$sub_release";
} elsif ($^O eq 'MSWin32' || $^O eq 'MSWin64') {
$db2_path = "C:\\ibm\\sqllib";
} elsif ($^O eq 'cygwin') {
$db2_path = "/cygdrive/c/ibm/sqllib";
} else {
die "unexpected V9.$sub_release platform '$^O'";
}
} else {
die "Unsupported DB2 version '$db2_version'\n";
}
}
#
# This deals with a Morgan Stanley specific setup, where we install
# DB2 in a non-standard location and then make /opt/IBM/xxx link to
# it. If $ENV{DB2_PREFIX} is set and resolves to a directory, use that
# as the db2path for compilation/installation.
#
# We also do some horrible link-time tricks. Don't try this at home...
#
if ($ENV{DB2_PREFIX}) {
$db2_path = $ENV{DB2_PREFIX};
die "DB2_PREFIX path '$db2_path' invalid" unless (-d $db2_path);
#
# For DB2 V9.x, we have 'lib32' and 'lib64' but no 'lib'.
#
my $lib_pf = 'lib';
if ($Config{use64bitall}) { # 64-bit perl
$lib_pf = 'lib64';
} else { # 32-bit perl
if ($ENV{ID_EXEC} eq 'ia32.linux.2.6.glibc.2.3' ||
$ENV{ID_EXEC} eq 'x86_64.linux.2.6.glibc.2.3' ||
$ENV{ID_EXEC} eq 'x86_64.linux.2.6.glibc.2.5') {
$extra_args{CCFLAGS} = '-m32';
$lib_pf = 'lib32';
} elsif ($ENV{ID_EXEC} eq 'sun4.sunos64.5.10') {
$lib_pf = 'lib32';
}
}
my $sysliblist = "-L$db2_path/$lib_pf -ldb2";
my @db2libs = qw(db2install db2g11n db2locale db2osse
db2genreg db2trcapi db2dascmn db2osse_db2);
if ( $Config{osname} =~ /linux/i ) {
$extra_args{LDDLFLAGS} =
"-shared -Wl,--enable-new-dtags -Wl,-rpath $db2_path/$lib_pf";
if ($Config{use64bitall}) { # 64-bit perl
} elsif ($ENV{ID_EXEC} eq 'ia32.linux.2.6.glibc.2.3' ||
$ENV{ID_EXEC} eq 'x86_64.linux.2.6.glibc.2.3' ||
$ENV{ID_EXEC} eq 'x86_64.linux.2.6.glibc.2.5') {
$extra_args{LDDLFLAGS} .= ' -m32';
} else {
$sysliblist .= ' -L/tmp -lcxa'; # Setup in Makefile.inner
}
} elsif ( $Config{osname} =~ /solaris/i ) {
#$sysliblist = "-R$db2_path/lib $sysliblist";
}
$sysliblist .= ' ' .join(' ', map {"-l$_"} @db2libs);
$extra_args{LIBS} = [ $sysliblist ];
}
#
# In version 8.2 (but not above), use the V8.2 version db2DbDirXXX
# functions to access the database directory.
#
if ($db2_version eq 'V8.2') {
push @defines, "-DADMIN_API_HAVE_DB2DBDIR_V8";
}
#
# In version 9.1 and above, use the V9 version of the db2DbDirInfo
# structure and support XML for import/export
#
if ($db2_version ge 'V9.1') {
push @defines, "-DADMIN_API_HAVE_DB2DBDIR_V9";
push @defines, "-DADMIN_API_HAVE_EXPORT_XML";
push @defines, "-DADMIN_API_HAVE_IMPORT_XML";
}
#
# In version 9.5 and above, use the LongActionString for import
# and load; support XML for load.
#
if ($db2_version ge 'V9.5') {
push @defines, "-DADMIN_API_HAVE_IMPORT_LONG_ACTION";
push @defines, "-DADMIN_API_HAVE_LOAD_LONG_ACTION";
push @defines, "-DADMIN_API_HAVE_LOAD_XML";
}
#
# Platform/bit-ness issues:
# - On Unix, link to libdb2.so; on Windows, link to db2cli and db2api.
# - Use one of lib64/lib32/lib
#
my $libs = "-L$db2_path/lib -ldb2"; # Default
if ($^O eq 'MSWin32') { # 32-bit Windows
$libs = "-L\"$db2_path\\lib\" -ldb2cli -ldb2api";
} elsif ($^O eq 'MSWin64') { # 64-bit Windows
$libs = "-L\"$db2_path\\lib64\" -ldb2cli -ldb2api";
} elsif ($^O eq 'cygwin') {
my $libdir = ($Config{use64bitall}) ? 'lib64' : 'lib32';
$libs = "-L$db2_path/$libdir -ldb2cli -ldb2api";
} else { # Unix
my $libdir = ($Config{use64bitall}) ? 'lib64' : 'lib32';
if (-d "$db2_path/$libdir") {
$libs = "-L$db2_path/$libdir -ldb2";
}
}
#print "XXX: have libs '$libs'\n";
#
# The module depends on a heper file to translate constant names (like
# SQLMA_APPLICATIONS_ALL) to numeric values. DB2 does not maintain
# binary compatibility for these values across major release, so we
# have to parse the include files at the current location and generate
# the file locally.
#
# Instead of passing in the base directory (which may contain blanks)
# as a parameter, force it through an environment variable.
#
$ENV{DB2PATH} = $db2_path;
if ($^O =~ /^MSWin/) {
system("perl", "util\\parse_constants.pl");
} else {
system("./util/parse_constants.pl");
}
WriteMakefile('NAME' => 'DB2::Admin',
'VERSION_FROM' => 'lib/DB2/Admin.pm',
'PREREQ_PM' => { 'Params::Validate' => '0.87',
'Test::Simple' => '0.62',
},
'INC' => "-I$db2_path/include",
'LIBS' => $libs,
'DEFINE' => "@defines",
%extra_args,
);