Commit | Line | Data |
d8bf0b8c |
1 | #! perl -w |
07200f1b |
2 | |
d8bf0b8c |
3 | use strict ; |
4 | use ExtUtils::MakeMaker 5.16 ; |
88108326 |
5 | use Config ; |
6 | |
d8bf0b8c |
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() ; |
8e07c86e |
18 | |
d8bf0b8c |
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' } |
50797850 |
29 | } |
1f70e1ea |
30 | |
d8bf0b8c |
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 | |
8e07c86e |
44 | WriteMakefile( |
88108326 |
45 | NAME => 'DB_File', |
d8bf0b8c |
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'), |
88108326 |
51 | XSPROTOARG => '-noprototypes', |
d8bf0b8c |
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 | : () |
f1aa208b |
57 | ), |
58 | ( |
d8bf0b8c |
59 | $] >= 5.005 |
60 | ? (ABSTRACT_FROM => 'DB_File.pm', |
61 | AUTHOR => 'Paul Marquess <pmqs@cpan.org>') |
62 | : () |
f1aa208b |
63 | ), |
d8bf0b8c |
64 | |
f1aa208b |
65 | |
d8bf0b8c |
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'}, |
07200f1b |
73 | ); |
74 | |
d8bf0b8c |
75 | |
07200f1b |
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 |
88108326 |
105 | ); |
8e07c86e |
106 | |
d8bf0b8c |
107 | if (eval {require ExtUtils::Constant; 1}) { |
07200f1b |
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 ; |
039d031f |
123 | |
07200f1b |
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 | |
039d031f |
131 | |
d8bf0b8c |
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 |