IO::Compress modules
[p5sagit/p5-mst-13.2.git] / ext / Compress / IO / Zlib / private / MakeUtil.pm
CommitLineData
25f0751f 1package MakeUtil ;
2package main ;
3
4use strict ;
5
6use Config qw(%Config);
7use File::Copy;
8
9
10BEGIN
11{
12 eval { require File::Spec::Functions ; File::Spec::Functions->import() } ;
13 if ($@)
14 {
15 *catfile = sub { return "$_[0]/$_[1]" }
16 }
17}
18
19require VMS::Filespec if $^O eq 'VMS';
20
21
22unless($ENV{PERL_CORE}) {
23 $ENV{PERL_CORE} = 1 if grep { $_ eq 'PERL_CORE=1' } @ARGV;
24}
25
26$ENV{SKIP_FOR_CORE} = 1 if $ENV{PERL_CORE} || $ENV{MY_PERL_CORE} ;
27
28
29
30sub MY::libscan
31{
32 my $self = shift;
33 my $path = shift;
34
35 return undef
36 if $path =~ /(~|\.bak|_bak)$/ ||
37 $path =~ /\..*\.sw(o|p)$/ ||
38 $path =~ /\B\.svn\b/;
39
40 return $path;
41}
42
43sub MY::postamble
44{
45 return ''
46 if $ENV{PERL_CORE} ;
47
48 my @files = getPerlFiles('MANIFEST');
49
50 my $postamble = '
51
52MyTrebleCheck:
53 @echo Checking for $$^W in files: '. "@files" . '
54 @perl -ne \' \
55 exit 1 if /^\s*local\s*\(\s*\$$\^W\s*\)/; \
56 \' ' . " @files || " . ' \
57 (echo found unexpected $$^W ; exit 1)
58 @echo All is ok.
59
60';
61
62 return $postamble;
63}
64
65sub getPerlFiles
66{
67 my @manifests = @_ ;
68
69 my @files = ();
70
71 for my $manifest (@manifests)
72 {
73 my $prefix = './';
74
75 $prefix = $1
76 if $manifest =~ m#^(.*/)#;
77
78 open M, "<$manifest"
79 or die "Cannot open '$manifest': $!\n";
80 while (<M>)
81 {
82 chomp ;
83 next if /^\s*#/ || /^\s*$/ ;
84
85 s/^\s+//;
86 s/\s+$//;
87
88 /^(\S+)\s*(.*)$/;
89
90 my ($file, $rest) = ($1, $2);
91
92 if ($file =~ /\.(pm|pl|t)$/ and $file !~ /MakeUtil.pm/)
93 {
94 push @files, "$prefix$file";
95 }
96 elsif ($rest =~ /perl/i)
97 {
98 push @files, "$prefix$file";
99 }
100
101 }
102 close M;
103 }
104
105 return @files;
106}
107
108sub UpDowngrade
109{
110 return if defined $ENV{TipTop};
111
112 my @files = @_ ;
113
114 # our and use bytes/utf8 is stable from 5.6.0 onward
115 # warnings is stable from 5.6.1 onward
116
117 # Note: this code assumes that each statement it modifies is not
118 # split across multiple lines.
119
120
121 my $warn_sub = '';
122 my $our_sub = '' ;
123
124 my $upgrade ;
125 my $downgrade ;
258133d1 126 my $do_downgrade ;
25f0751f 127
128 my $caller = (caller(1))[3] || '';
129
130 if ($caller =~ /downgrade/)
131 {
132 $downgrade = 1;
133 }
134 elsif ($caller =~ /upgrade/)
135 {
136 $upgrade = 1;
137 }
258133d1 138 else
139 {
140 $do_downgrade = 1
141 if $] < 5.006001 ;
142 }
143
25f0751f 144# else
145# {
146# my $opt = shift @ARGV || '' ;
147# $upgrade = ($opt =~ /^-upgrade/i);
148# $downgrade = ($opt =~ /^-downgrade/i);
149# push @ARGV, $opt unless $downgrade || $upgrade;
150# }
151
258133d1 152
153 if ($downgrade || $do_downgrade) {
25f0751f 154 # From: use|no warnings "blah"
155 # To: local ($^W) = 1; # use|no warnings "blah"
156 $warn_sub = sub {
157 s/^(\s*)(no\s+warnings)/${1}local (\$^W) = 0; #$2/ ;
158 s/^(\s*)(use\s+warnings)/${1}local (\$^W) = 1; #$2/ ;
159 };
160 }
258133d1 161 #elsif ($] >= 5.006001 || $upgrade) {
162 elsif ($upgrade) {
25f0751f 163 # From: local ($^W) = 1; # use|no warnings "blah"
164 # To: use|no warnings "blah"
165 $warn_sub = sub {
166 s/^(\s*)local\s*\(\$\^W\)\s*=\s*\d+\s*;\s*#\s*((no|use)\s+warnings.*)/$1$2/ ;
167 };
168 }
169
258133d1 170 if ($downgrade || $do_downgrade) {
25f0751f 171 $our_sub = sub {
172 if ( /^(\s*)our\s+\(\s*([^)]+\s*)\)/ ) {
173 my $indent = $1;
174 my $vars = join ' ', split /\s*,\s*/, $2;
175 $_ = "${indent}use vars qw($vars);\n";
176 }
177 elsif ( /^(\s*)((use|no)\s+(bytes|utf8)\s*;.*)$/)
178 {
179 $_ = "$1# $2\n";
180 }
181 };
182 }
258133d1 183 #elsif ($] >= 5.006000 || $upgrade) {
184 elsif ($upgrade) {
25f0751f 185 $our_sub = sub {
186 if ( /^(\s*)use\s+vars\s+qw\((.*?)\)/ ) {
187 my $indent = $1;
188 my $vars = join ', ', split ' ', $2;
189 $_ = "${indent}our ($vars);\n";
190 }
191 elsif ( /^(\s*)#\s*((use|no)\s+(bytes|utf8)\s*;.*)$/)
192 {
193 $_ = "$1$2\n";
194 }
195 };
196 }
197
198 if (! $our_sub && ! $warn_sub) {
199 warn "Up/Downgrade not needed.\n";
200 if ($upgrade || $downgrade)
201 { exit 0 }
202 else
203 { return }
204 }
205
206 foreach (@files) {
207 #if (-l $_ )
208 { doUpDown($our_sub, $warn_sub, $_) }
209 #else
210 #{ doUpDownViaCopy($our_sub, $warn_sub, $_) }
211 }
212
213 warn "Up/Downgrade complete.\n" ;
214 exit 0 if $upgrade || $downgrade;
215
216}
217
218
219sub doUpDown
220{
221 my $our_sub = shift;
222 my $warn_sub = shift;
223
224 return if -d $_[0];
225
226 local ($^I) = ($^O eq 'VMS') ? "_bak" : ".bak";
227 local (@ARGV) = shift;
228
229 while (<>)
230 {
231 print, last if /^__(END|DATA)__/ ;
232
233 &{ $our_sub }() if $our_sub ;
234 &{ $warn_sub }() if $warn_sub ;
235 print ;
236 }
237
238 return if eof ;
239
240 while (<>)
241 { print }
242}
243
244sub doUpDownViaCopy
245{
246 my $our_sub = shift;
247 my $warn_sub = shift;
248 my $file = shift ;
249
250 use File::Copy ;
251
252 return if -d $file ;
253
254 my $backup = $file . ($^O eq 'VMS') ? "_bak" : ".bak";
255
256 copy($file, $backup)
257 or die "Cannot copy $file to $backup: $!";
258
259 my @keep = ();
260
261 {
262 open F, "<$file"
263 or die "Cannot open $file: $!\n" ;
264 while (<F>)
265 {
266 if (/^__(END|DATA)__/)
267 {
268 push @keep, $_;
269 last ;
270 }
271
272 &{ $our_sub }() if $our_sub ;
273 &{ $warn_sub }() if $warn_sub ;
274 push @keep, $_;
275 }
276
277 if (! eof F)
278 {
279 while (<F>)
280 { push @keep, $_ }
281 }
282 close F;
283 }
284
285 {
286 open F, ">$file"
287 or die "Cannot open $file: $!\n";
288 print F @keep ;
289 close F;
290 }
291}
292
293package MakeUtil ;
294
2951;
296
297