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