#! perl -w use strict ; use ExtUtils::MakeMaker 5.16 ; use Config ; die "DB_File needs Perl 5.004_05 or better. This is $]\n" if $] <= 5.00404; my $VER_INFO ; my $LIB_DIR ; my $INC_DIR ; my $DB_NAME ; my $LIBS ; my $COMPAT185 = "" ; ParseCONFIG() ; my @files = ('DB_File.pm', glob "t/*.t") ; UpDowngrade(@files); if (defined $DB_NAME) { $LIBS = $DB_NAME } else { if ($^O eq 'MSWin32') { $LIBS = '-llibdb' } else { $LIBS = '-ldb' } } # Solaris is special. #$LIBS .= " -lthread" if $^O eq 'solaris' ; # AIX is special. $LIBS .= " -lpthread" if $^O eq 'aix' ; # OS2 is a special case, so check for it now. my $OS2 = "" ; $OS2 = "-DOS2" if $Config{'osname'} eq 'os2' ; WriteMakefile( NAME => 'DB_File', LIBS => ["-L${LIB_DIR} $LIBS"], #MAN3PODS => {}, # Pods will be built by installman. INC => "-I$INC_DIR", VERSION_FROM => 'DB_File.pm', XSPROTOARG => '-noprototypes', DEFINE => "-D_NOT_CORE $OS2 $VER_INFO $COMPAT185", OBJECT => 'version$(OBJ_EXT) DB_File$(OBJ_EXT)', #OPTIMIZE => '-g', 'depend' => { 'Makefile' => 'config.in', 'version$(OBJ_EXT)' => 'version.c'}, 'clean' => { FILES => 'constants.h constants.xs' }, 'macro' => { INSTALLDIRS => 'perl', my_files => "@files" }, 'dist' => { COMPRESS => 'gzip', SUFFIX => 'gz', DIST_DEFAULT => 'MyDoubleCheck tardist'}, ); my @names = qw( BTREEMAGIC BTREEVERSION DB_LOCK DB_SHMEM DB_TXN HASHMAGIC HASHVERSION MAX_PAGE_NUMBER MAX_PAGE_OFFSET MAX_REC_NUMBER RET_ERROR RET_SPECIAL RET_SUCCESS R_CURSOR R_DUP R_FIRST R_FIXEDLEN R_IAFTER R_IBEFORE R_LAST R_NEXT R_NOKEY R_NOOVERWRITE R_PREV R_RECNOSYNC R_SETCURSOR R_SNAPSHOT __R_UNUSED ); if (eval {require ExtUtils::Constant; 1}) { # Check the constants above all appear in @EXPORT in DB_File.pm my %names = map { $_, 1} @names; open F, "<DB_File.pm" or die "Cannot open DB_File.pm: $!\n"; while (<F>) { last if /^\s*\@EXPORT\s+=\s+qw\(/ ; } while (<F>) { last if /^\s*\)/ ; /(\S+)/ ; delete $names{$1} if defined $1 ; } close F ; if ( keys %names ) { my $missing = join ("\n\t", sort keys %names) ; die "The following names are missing from \@EXPORT in DB_File.pm\n" . "\t$missing\n" ; } ExtUtils::Constant::WriteConstants( NAME => 'DB_File', NAMES => \@names, C_FILE => 'constants.h', XS_FILE => 'constants.xs', ); } else { use File::Copy; copy ('fallback.h', 'constants.h') or die "Can't copy fallback.h to constants.h: $!"; copy ('fallback.xs', 'constants.xs') or die "Can't copy fallback.xs to constants.xs: $!"; } exit; sub MY::postamble { <<'EOM' } ; MyDoubleCheck: @echo Checking config.in is setup for a release @(grep "^LIB.*/usr/local/BerkeleyDB" config.in && \ grep "^INCLUDE.*/usr/local/BerkeleyDB" config.in && \ grep "^#DBNAME.*" config.in) >/dev/null || \ (echo config.in needs fixing ; exit 1) @echo config.in is ok @echo @echo Checking DB_File.xs is ok for a release. @(perl -ne ' exit 1 if /^\s*#\s*define\s+TRACE/ ; ' DB_File.xs || \ (echo DB_File.xs needs fixing ; exit 1)) @echo DB_File.xs is ok @echo @echo Checking for $$^W in files: $(my_files) @perl -ne ' \ exit 1 if /^\s*local\s*\(\s*\$$\^W\s*\)/;' $(my_files) || \ (echo found unexpected $$^W ; exit 1) @echo No $$^W found. @echo @echo Checking for 'use vars' in files: $(my_files) @perl -ne ' \ exit 0 if /^__(DATA|END)__/; \ exit 1 if /^\s*use\s+vars/;' $(my_files) || \ (echo found unexpected "use vars"; exit 1) @echo No 'use vars' found. @echo @echo All files are OK for a release. @echo EOM sub ParseCONFIG { my ($k, $v) ; my @badkey = () ; my %Info = () ; my @Options = qw( INCLUDE LIB PREFIX HASH DBNAME COMPAT185 ) ; my %ValidOption = map {$_, 1} @Options ; my %Parsed = %ValidOption ; my $CONFIG = 'config.in' ; print "Parsing $CONFIG...\n" ; # DBNAME & COMPAT185 are optional, so pretend they have # been parsed. delete $Parsed{'DBNAME'} ; delete $Parsed{'COMPAT185'} ; $Info{COMPAT185} = "No" ; open(F, "$CONFIG") or die "Cannot open file $CONFIG: $!\n" ; while (<F>) { s/^\s*|\s*$//g ; next if /^\s*$/ or /^\s*#/ ; s/\s*#\s*$// ; ($k, $v) = split(/\s+=\s+/, $_, 2) ; $k = uc $k ; if ($ValidOption{$k}) { delete $Parsed{$k} ; $Info{$k} = $v ; } else { push(@badkey, $k) ; } } close F ; print "Unknown keys in $CONFIG ignored [@badkey]\n" if @badkey ; # check parsed values my @missing = () ; die "The following keys are missing from $CONFIG file: [@missing]\n" if @missing = keys %Parsed ; $INC_DIR = $ENV{'DB_FILE_INCLUDE'} || $Info{'INCLUDE'} ; $LIB_DIR = $ENV{'DB_FILE_LIB'} || $Info{'LIB'} ; $DB_NAME = $Info{'DBNAME'} if defined $Info{'DBNAME'} ; $COMPAT185 = "-DCOMPAT185 -DDB_LIBRARY_COMPATIBILITY_API" if (defined $ENV{'DB_FILE_COMPAT185'} && $ENV{'DB_FILE_COMPAT185'} =~ /^\s*(on|true|1)\s*$/i) || $Info{'COMPAT185'} =~ /^\s*(on|true|1)\s*$/i ; my $PREFIX = $Info{'PREFIX'} ; my $HASH = $Info{'HASH'} ; $VER_INFO = "-DmDB_Prefix_t=${PREFIX} -DmDB_Hash_t=${HASH}" ; print <<EOM if 0 ; INCLUDE [$INC_DIR] LIB [$LIB_DIR] HASH [$HASH] PREFIX [$PREFIX] DBNAME [$DB_NAME] EOM print "Looks Good.\n" ; } sub UpDowngrade { my @files = @_ ; # our is stable from 5.6.0 onward # warnings is stable from 5.6.1 onward # Note: this code assumes that each statement it modifies is not # split across multiple lines. my $warn_sub ; my $our_sub ; if ($] < 5.006001) { # From: use|no warnings "blah" # To: local ($^W) = 1; # use|no warnings "blah" # # and # # From: warnings::warnif(x,y); # To: $^W && carp(y); # warnif -- x $warn_sub = sub { s/^(\s*)(no\s+warnings)/${1}local (\$^W) = 0; #$2/ ; s/^(\s*)(use\s+warnings)/${1}local (\$^W) = 1; #$2/ ; s/^(\s*)warnings::warnif\s*\((.*?)\s*,\s*(.*?)\)\s*;/${1}\$^W && carp($3); # warnif - $2/ ; }; } else { # From: local ($^W) = 1; # use|no warnings "blah" # To: use|no warnings "blah" # # and # # From: $^W && carp(y); # warnif -- x # To: warnings::warnif(x,y); $warn_sub = sub { s/^(\s*)local\s*\(\$\^W\)\s*=\s*\d+\s*;\s*#\s*((no|use)\s+warnings.*)/$1$2/ ; s/^(\s*)\$\^W\s+\&\&\s*carp\s*\((.*?)\)\s*;\s*#\s*warnif\s*-\s*(.*)/${1}warnings::warnif($3, $2);/ ; }; } if ($] < 5.006000) { $our_sub = sub { if ( /^(\s*)our\s+\(\s*([^)]+\s*)\)/ ) { my $indent = $1; my $vars = join ' ', split /\s*,\s*/, $2; $_ = "${indent}use vars qw($vars);\n"; } }; } else { $our_sub = sub { if ( /^(\s*)use\s+vars\s+qw\((.*?)\)/ ) { my $indent = $1; my $vars = join ', ', split ' ', $2; $_ = "${indent}our ($vars);\n"; } }; } foreach (@files) { doUpDown($our_sub, $warn_sub, $_) } } sub doUpDown { my $our_sub = shift; my $warn_sub = shift; local ($^I) = ".bak" ; local (@ARGV) = shift; while (<>) { print, last if /^__(END|DATA)__/ ; &{ $our_sub }(); &{ $warn_sub }(); print ; } return if eof ; while (<>) { print } } # end of file Makefile.PL