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