Rename ext/Digest/SHA to ext/Digest-SHA
[p5sagit/p5-mst-13.2.git] / ext / DB_File / Makefile.PL
1 #! perl -w
2
3 use strict ;
4 use ExtUtils::MakeMaker 5.16 ;
5 use Config ;
6
7 die "DB_File needs Perl 5.004_05 or better. This is $]\n" 
8     if $] <= 5.00404; 
9
10 my $VER_INFO ;
11 my $LIB_DIR ;
12 my $INC_DIR ;
13 my $DB_NAME ;
14 my $LIBS ;
15 my $COMPAT185 = "" ;
16
17 ParseCONFIG() ;
18
19 my @files = ('DB_File.pm', glob "t/*.t") ;
20 UpDowngrade(@files);
21
22 if (defined $DB_NAME)
23   { $LIBS = $DB_NAME }
24 else {
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.
38 my $OS2 = "" ;
39 $OS2 = "-DOS2" if $Config{'osname'} eq 'os2' ;
40
41 my $WALL = '' ;
42 #$WALL = ' -Wall ';
43
44 WriteMakefile(
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
76 my @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
107 if (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
140 else {
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
148 exit;
149
150
151 sub 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
164 sub MY::postamble { <<'EOM' } ;
165
166 MyDoubleCheck:
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
195 EOM
196
197
198
199 sub 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
263 EOM
264
265     print "Looks Good.\n" ;
266
267 }
268
269 sub 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
336 sub 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