This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
locale.c: savepv() of getenv()
[perl5.git] / cpan / 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.8.3 or better. This is $]\n" 
8     if $] < 5.008003; 
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         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
78 my @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
109 if (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
142 else {
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
150 exit;
151
152
153 sub 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
166 sub MY::postamble { <<'EOM' } ;
167
168 MyDoubleCheck:
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
197 EOM
198
199
200
201 sub 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
265 EOM
266
267     print "Looks Good.\n" ;
268
269 }
270
271 sub 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
338 sub 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