1#! perl -w 2 3use strict ; 4use ExtUtils::MakeMaker 5.16 ; 5use Config ; 6 7die "DB_File needs Perl 5.004_05 or better. This is $]\n" 8 if $] <= 5.00404; 9 10my $VER_INFO ; 11my $LIB_DIR ; 12my $INC_DIR ; 13my $DB_NAME ; 14my $LIBS ; 15my $COMPAT185 = "" ; 16 17ParseCONFIG() ; 18 19my @files = ('DB_File.pm', glob "t/*.t") ; 20UpDowngrade(@files); 21 22if (defined $DB_NAME) 23 { $LIBS = $DB_NAME } 24else { 25 if ($^O eq 'MSWin32') 26 { $LIBS = '-llibdb' } 27 else 28 { $LIBS = '-ldb' } 29} 30 31# Solaris is special. 32#$LIBS .= " -lthread" if $^O eq 'solaris' ; 33 34# AIX is special. 35$LIBS .= " -lpthread" if $^O eq 'aix' ; 36 37# OS2 is a special case, so check for it now. 38my $OS2 = "" ; 39$OS2 = "-DOS2" if $Config{'osname'} eq 'os2' ; 40 41my $WALL = '' ; 42#$WALL = ' -Wall '; 43 44WriteMakefile( 45 NAME => 'DB_File', 46 LIBS => ["-L${LIB_DIR} $LIBS"], 47 #MAN3PODS => {}, # Pods will be built by installman. 48 INC => "-I$INC_DIR", 49 VERSION_FROM => 'DB_File.pm', 50 XS_VERSION => eval MM->parse_version('DB_File.pm'), 51 XSPROTOARG => '-noprototypes', 52 DEFINE => "-D_NOT_CORE $OS2 $VER_INFO $COMPAT185 $WALL", 53 OBJECT => 'version$(OBJ_EXT) DB_File$(OBJ_EXT)', 54 ((ExtUtils::MakeMaker->VERSION() gt '6.30') 55 ? ('LICENSE' => 'perl') 56 : () 57 ), 58 ( 59 $] >= 5.005 60 ? (ABSTRACT_FROM => 'DB_File.pm', 61 AUTHOR => 'Paul Marquess <pmqs@cpan.org>') 62 : () 63 ), 64 65 66 #OPTIMIZE => '-g', 67 'depend' => { 'Makefile' => 'config.in', 68 'version$(OBJ_EXT)' => 'version.c'}, 69 'clean' => { FILES => 'constants.h constants.xs' }, 70 'macro' => { INSTALLDIRS => 'perl', my_files => "@files" }, 71 'dist' => { COMPRESS => 'gzip', SUFFIX => 'gz', 72 DIST_DEFAULT => 'MyDoubleCheck tardist'}, 73 ); 74 75 76my @names = qw( 77 BTREEMAGIC 78 BTREEVERSION 79 DB_LOCK 80 DB_SHMEM 81 DB_TXN 82 HASHMAGIC 83 HASHVERSION 84 MAX_PAGE_NUMBER 85 MAX_PAGE_OFFSET 86 MAX_REC_NUMBER 87 RET_ERROR 88 RET_SPECIAL 89 RET_SUCCESS 90 R_CURSOR 91 R_DUP 92 R_FIRST 93 R_FIXEDLEN 94 R_IAFTER 95 R_IBEFORE 96 R_LAST 97 R_NEXT 98 R_NOKEY 99 R_NOOVERWRITE 100 R_PREV 101 R_RECNOSYNC 102 R_SETCURSOR 103 R_SNAPSHOT 104 __R_UNUSED 105 ); 106 107if (eval {require ExtUtils::Constant; 1}) { 108 # Check the constants above all appear in @EXPORT in DB_File.pm 109 my %names = map { $_, 1} @names; 110 open F, "<DB_File.pm" or die "Cannot open DB_File.pm: $!\n"; 111 while (<F>) 112 { 113 last if /^\s*\@EXPORT\s+=\s+qw\(/ ; 114 } 115 116 while (<F>) 117 { 118 last if /^\s*\)/ ; 119 /(\S+)/ ; 120 delete $names{$1} if defined $1 ; 121 } 122 close F ; 123 124 if ( keys %names ) 125 { 126 my $missing = join ("\n\t", sort keys %names) ; 127 die "The following names are missing from \@EXPORT in DB_File.pm\n" . 128 "\t$missing\n" ; 129 } 130 131 132 ExtUtils::Constant::WriteConstants( 133 NAME => 'DB_File', 134 NAMES => \@names, 135 C_FILE => 'constants.h', 136 XS_FILE => 'constants.xs', 137 138 ); 139} 140else { 141 use File::Copy; 142 copy ('fallback.h', 'constants.h') 143 or die "Can't copy fallback.h to constants.h: $!"; 144 copy ('fallback.xs', 'constants.xs') 145 or die "Can't copy fallback.xs to constants.xs: $!"; 146} 147 148exit; 149 150 151sub MY::libscan 152{ 153 my $self = shift ; 154 my $path = shift ; 155 156 return undef 157 if $path =~ /(~|\.bak)$/ || 158 $path =~ /^\..*\.swp$/ ; 159 160 return $path; 161} 162 163 164sub MY::postamble { <<'EOM' } ; 165 166MyDoubleCheck: 167 @echo Checking config.in is setup for a release 168 @(grep "^LIB.*/usr/local/BerkeleyDB" config.in && \ 169 grep "^INCLUDE.*/usr/local/BerkeleyDB" config.in && \ 170 grep "^#DBNAME.*" config.in) >/dev/null || \ 171 (echo config.in needs fixing ; exit 1) 172 @echo config.in is ok 173 @echo 174 @echo Checking DB_File.xs is ok for a release. 175 @(perl -ne ' exit 1 if /^\s*#\s*define\s+TRACE/ ; ' DB_File.xs || \ 176 (echo DB_File.xs needs fixing ; exit 1)) 177 @echo DB_File.xs is ok 178 @echo 179 @echo Checking for $$^W in files: $(my_files) 180 @perl -ne ' \ 181 exit 1 if /^\s*local\s*\(\s*\$$\^W\s*\)/;' $(my_files) || \ 182 (echo found unexpected $$^W ; exit 1) 183 @echo No $$^W found. 184 @echo 185 @echo Checking for 'use vars' in files: $(my_files) 186 @perl -ne ' \ 187 exit 0 if /^__(DATA|END)__/; \ 188 exit 1 if /^\s*use\s+vars/;' $(my_files) || \ 189 (echo found unexpected "use vars"; exit 1) 190 @echo No 'use vars' found. 191 @echo 192 @echo All files are OK for a release. 193 @echo 194 195EOM 196 197 198 199sub ParseCONFIG 200{ 201 my ($k, $v) ; 202 my @badkey = () ; 203 my %Info = () ; 204 my @Options = qw( INCLUDE LIB PREFIX HASH DBNAME COMPAT185 ) ; 205 my %ValidOption = map {$_, 1} @Options ; 206 my %Parsed = %ValidOption ; 207 my $CONFIG = 'config.in' ; 208 209 print "Parsing $CONFIG...\n" ; 210 211 # DBNAME & COMPAT185 are optional, so pretend they have 212 # been parsed. 213 delete $Parsed{'DBNAME'} ; 214 delete $Parsed{'COMPAT185'} ; 215 $Info{COMPAT185} = "No" ; 216 217 218 open(F, "$CONFIG") or die "Cannot open file $CONFIG: $!\n" ; 219 while (<F>) { 220 s/^\s*|\s*$//g ; 221 next if /^\s*$/ or /^\s*#/ ; 222 s/\s*#\s*$// ; 223 224 ($k, $v) = split(/\s+=\s+/, $_, 2) ; 225 $k = uc $k ; 226 if ($ValidOption{$k}) { 227 delete $Parsed{$k} ; 228 $Info{$k} = $v ; 229 } 230 else { 231 push(@badkey, $k) ; 232 } 233 } 234 close F ; 235 236 print "Unknown keys in $CONFIG ignored [@badkey]\n" 237 if @badkey ; 238 239 # check parsed values 240 my @missing = () ; 241 die "The following keys are missing from $CONFIG file: [@missing]\n" 242 if @missing = keys %Parsed ; 243 244 $INC_DIR = $ENV{'DB_FILE_INCLUDE'} || $Info{'INCLUDE'} ; 245 $LIB_DIR = $ENV{'DB_FILE_LIB'} || $Info{'LIB'} ; 246 $DB_NAME = $ENV{'DB_FILE_NAME'} || $Info{'DBNAME'} ; 247 $COMPAT185 = "-DCOMPAT185 -DDB_LIBRARY_COMPATIBILITY_API" 248 if (defined $ENV{'DB_FILE_COMPAT185'} && 249 $ENV{'DB_FILE_COMPAT185'} =~ /^\s*(on|true|1)\s*$/i) || 250 $Info{'COMPAT185'} =~ /^\s*(on|true|1)\s*$/i ; 251 my $PREFIX = $Info{'PREFIX'} ; 252 my $HASH = $Info{'HASH'} ; 253 254 $VER_INFO = "-DmDB_Prefix_t=${PREFIX} -DmDB_Hash_t=${HASH}" ; 255 256 print <<EOM if 0 ; 257 INCLUDE [$INC_DIR] 258 LIB [$LIB_DIR] 259 HASH [$HASH] 260 PREFIX [$PREFIX] 261 DBNAME [$DB_NAME] 262 263EOM 264 265 print "Looks Good.\n" ; 266 267} 268 269sub UpDowngrade 270{ 271 my @files = @_ ; 272 273 # our is stable from 5.6.0 onward 274 # warnings is stable from 5.6.1 onward 275 276 # Note: this code assumes that each statement it modifies is not 277 # split across multiple lines. 278 279 280 my $warn_sub ; 281 my $our_sub ; 282 283 if ($] < 5.006001) { 284 # From: use|no warnings "blah" 285 # To: local ($^W) = 1; # use|no warnings "blah" 286 # 287 # and 288 # 289 # From: warnings::warnif(x,y); 290 # To: $^W && carp(y); # warnif -- x 291 $warn_sub = sub { 292 s/^(\s*)(no\s+warnings)/${1}local (\$^W) = 0; #$2/ ; 293 s/^(\s*)(use\s+warnings)/${1}local (\$^W) = 1; #$2/ ; 294 295 s/^(\s*)warnings::warnif\s*\((.*?)\s*,\s*(.*?)\)\s*;/${1}\$^W && carp($3); # warnif - $2/ ; 296 }; 297 } 298 else { 299 # From: local ($^W) = 1; # use|no warnings "blah" 300 # To: use|no warnings "blah" 301 # 302 # and 303 # 304 # From: $^W && carp(y); # warnif -- x 305 # To: warnings::warnif(x,y); 306 $warn_sub = sub { 307 s/^(\s*)local\s*\(\$\^W\)\s*=\s*\d+\s*;\s*#\s*((no|use)\s+warnings.*)/$1$2/ ; 308 s/^(\s*)\$\^W\s+\&\&\s*carp\s*\((.*?)\)\s*;\s*#\s*warnif\s*-\s*(.*)/${1}warnings::warnif($3, $2);/ ; 309 }; 310 } 311 312 if ($] < 5.006000) { 313 $our_sub = sub { 314 if ( /^(\s*)our\s+\(\s*([^)]+\s*)\)/ ) { 315 my $indent = $1; 316 my $vars = join ' ', split /\s*,\s*/, $2; 317 $_ = "${indent}use vars qw($vars);\n"; 318 } 319 }; 320 } 321 else { 322 $our_sub = sub { 323 if ( /^(\s*)use\s+vars\s+qw\((.*?)\)/ ) { 324 my $indent = $1; 325 my $vars = join ', ', split ' ', $2; 326 $_ = "${indent}our ($vars);\n"; 327 } 328 }; 329 } 330 331 foreach (@files) 332 { doUpDown($our_sub, $warn_sub, $_) } 333} 334 335 336sub doUpDown 337{ 338 my $our_sub = shift; 339 my $warn_sub = shift; 340 341 local ($^I) = ".bak" ; 342 local (@ARGV) = shift; 343 344 while (<>) 345 { 346 print, last if /^__(END|DATA)__/ ; 347 348 &{ $our_sub }(); 349 &{ $warn_sub }(); 350 print ; 351 } 352 353 return if eof ; 354 355 while (<>) 356 { print } 357} 358 359# end of file Makefile.PL 360