1 |
#! perl -w |
2 |
|
3 |
use strict ; |
4 |
require 5.006 ; |
5 |
|
6 |
use lib '.'; |
7 |
use private::MakeUtil; |
8 |
use ExtUtils::MakeMaker 5.16 ; |
9 |
use ExtUtils::Install (); # only needed to check for version |
10 |
use Config; |
11 |
|
12 |
my $ZLIB_LIB ; |
13 |
my $ZLIB_INCLUDE ; |
14 |
my $BUILD_ZLIB = 0 ; |
15 |
my $OLD_ZLIB = '' ; |
16 |
my $WALL = '' ; |
17 |
my $GZIP_OS_CODE = -1 ; |
18 |
my $USE_PPPORT_H = ($ENV{PERL_CORE}) ? '' : '-DUSE_PPPORT_H'; |
19 |
my $OPTIMIZE = $Config{'optimize'}; |
20 |
if ($Config{'gccversion'} and $OPTIMIZE =~ /-g (gdb)? 3/x) { |
21 |
$OPTIMIZE =~ s/-g(gdb)?3/-g/g; # [88936] out of memory with -g3 since 2.062 |
22 |
} |
23 |
|
24 |
# Windows uses a different name for the zlib library |
25 |
my $ZLIB_LIBRARY_NAME = $^O eq 'MSWin32' ? 'zlib' : 'z' ; |
26 |
|
27 |
#$WALL = ' -pedantic ' if $Config{'cc'} =~ /gcc/ ; |
28 |
#$WALL = ' -Wall -Wno-comment ' if $Config{'cc'} =~ /gcc/ ; |
29 |
|
30 |
# Ticket #18986 says that ExtUtils::Install 1.39 fixes the in-use issue |
31 |
# on win32/cygwin, so make the code below conditional on the version of |
32 |
# ExtUtils::Install. |
33 |
|
34 |
# Don't ask if MM_USE_DEFAULT is set -- enables perl core building on cygwin |
35 |
if ($^O =~ /cygwin/i and $ExtUtils::Install::VERSION < 1.39 |
36 |
and not ($ENV{PERL_MM_USE_DEFAULT} or $ENV{PERL_CORE})) |
37 |
{ |
38 |
print <<EOM ; |
39 |
|
40 |
I see you are running Cygwin. |
41 |
|
42 |
Please note that this module cannot be installed on Cygwin using the CPAN |
43 |
shell. The CPAN Shell uses Compress::Raw::Zlib internally and it is not |
44 |
possible to delete an active DLL. |
45 |
|
46 |
If you are running the CPAN shell, please exit it and install this module |
47 |
by hand by running 'make install' under the directory |
48 |
|
49 |
~/.cpan/build/Compress-Raw-Zlib-VERSION |
50 |
|
51 |
EOM |
52 |
|
53 |
print "Do you want to continue? [Y/N]: " ; |
54 |
my $answer = <STDIN> ; |
55 |
|
56 |
if ($answer =~ /^yes|y/i) |
57 |
{ |
58 |
print "continuing...\n" |
59 |
} |
60 |
else |
61 |
{ |
62 |
print "exiting...\n" ; |
63 |
exit 1 ; |
64 |
} |
65 |
|
66 |
|
67 |
} |
68 |
|
69 |
ParseCONFIG() ; |
70 |
|
71 |
UpDowngrade(getPerlFiles('MANIFEST')) |
72 |
unless $ENV{PERL_CORE}; |
73 |
|
74 |
WriteMakefile( |
75 |
NAME => 'Compress::Raw::Zlib', |
76 |
VERSION_FROM => 'lib/Compress/Raw/Zlib.pm', |
77 |
INC => "-I$ZLIB_INCLUDE" , |
78 |
DEFINE => "-DNO_VIZ -DZ_SOLO $OLD_ZLIB $WALL -DGZIP_OS_CODE=$GZIP_OS_CODE $USE_PPPORT_H" , |
79 |
XS => { 'Zlib.xs' => 'Zlib.c'}, |
80 |
'depend' => { 'Makefile' => 'config.in' }, |
81 |
'clean' => { FILES => '*.c constants.h constants.xs' }, |
82 |
'dist' => { COMPRESS => 'gzip', |
83 |
TARFLAGS => '-chvf', |
84 |
SUFFIX => 'gz', |
85 |
DIST_DEFAULT => 'MyTrebleCheck tardist', |
86 |
}, |
87 |
|
88 |
( |
89 |
$BUILD_ZLIB |
90 |
? zlib_files($ZLIB_LIB) |
91 |
: (LIBS => [ "-L$ZLIB_LIB -l$ZLIB_LIBRARY_NAME " ]) |
92 |
), |
93 |
OPTIMIZE => $OPTIMIZE, |
94 |
|
95 |
INSTALLDIRS => ($] >= 5.009 && $] < 5.011 ? 'perl' : 'site'), |
96 |
|
97 |
META_MERGE => { |
98 |
no_index => { |
99 |
directory => [ 't', 'private' ], |
100 |
}, |
101 |
}, |
102 |
|
103 |
((ExtUtils::MakeMaker->VERSION() gt '6.30') ? |
104 |
('LICENSE' => 'perl') : ()), |
105 |
|
106 |
) ; |
107 |
|
108 |
sub version_Macro |
109 |
{ |
110 |
my $ver = shift ; |
111 |
|
112 |
return [ "#if ZLIB_VERNUM >= 0x$ver\n", "#endif\n" ]; |
113 |
} |
114 |
|
115 |
my @names = qw( |
116 |
|
117 |
DEF_WBITS |
118 |
MAX_MEM_LEVEL |
119 |
MAX_WBITS |
120 |
OS_CODE |
121 |
|
122 |
Z_ASCII |
123 |
Z_BEST_COMPRESSION |
124 |
Z_BEST_SPEED |
125 |
Z_BINARY |
126 |
Z_BLOCK |
127 |
Z_BUF_ERROR |
128 |
Z_DATA_ERROR |
129 |
Z_DEFAULT_COMPRESSION |
130 |
Z_DEFAULT_STRATEGY |
131 |
Z_DEFLATED |
132 |
Z_ERRNO |
133 |
Z_FILTERED |
134 |
Z_FINISH |
135 |
Z_FIXED |
136 |
Z_FULL_FLUSH |
137 |
Z_HUFFMAN_ONLY |
138 |
Z_MEM_ERROR |
139 |
Z_NEED_DICT |
140 |
Z_NO_COMPRESSION |
141 |
Z_NO_FLUSH |
142 |
Z_NULL |
143 |
Z_OK |
144 |
Z_PARTIAL_FLUSH |
145 |
Z_RLE |
146 |
Z_STREAM_END |
147 |
Z_STREAM_ERROR |
148 |
Z_SYNC_FLUSH |
149 |
Z_UNKNOWN |
150 |
Z_VERSION_ERROR |
151 |
|
152 |
); |
153 |
#ZLIB_VERNUM |
154 |
|
155 |
my %verSpecificNames = ( |
156 |
Z_TREES => '1240', |
157 |
); |
158 |
|
159 |
if (eval {require ExtUtils::Constant; 1}) { |
160 |
# Check the constants above all appear in @EXPORT in Zlib.pm |
161 |
my %names = %verSpecificNames, map { $_, 1} @names, 'ZLIB_VERSION'; |
162 |
open F, "<lib/Compress/Raw/Zlib.pm" or die "Cannot open Zlib.pm: $!\n"; |
163 |
while (<F>) |
164 |
{ |
165 |
last if /^\s*\@EXPORT\s+=\s+qw\(/ ; |
166 |
} |
167 |
|
168 |
while (<F>) |
169 |
{ |
170 |
last if /^\s*\)/ ; |
171 |
/(\S+)/ ; |
172 |
delete $names{$1} if defined $1 ; |
173 |
} |
174 |
close F ; |
175 |
|
176 |
if ( keys %names ) |
177 |
{ |
178 |
my $missing = join ("\n\t", sort keys %names) ; |
179 |
die "The following names are missing from \@EXPORT in Zlib.pm\n" . |
180 |
"\t$missing\n" ; |
181 |
} |
182 |
|
183 |
push @names, { name => 'ZLIB_VERSION', type => 'PV' }; |
184 |
|
185 |
push @names, map { { name => $_, |
186 |
macro => version_Macro $verSpecificNames{$_} |
187 |
} |
188 |
} |
189 |
keys %verSpecificNames ; |
190 |
|
191 |
ExtUtils::Constant::WriteConstants( |
192 |
NAME => 'Zlib', |
193 |
NAMES => \@names, |
194 |
C_FILE => 'constants.h', |
195 |
XS_FILE => 'constants.xs', |
196 |
|
197 |
); |
198 |
|
199 |
} |
200 |
else { |
201 |
foreach my $name (qw( constants.h constants.xs )) |
202 |
{ |
203 |
my $from = catfile('fallback', $name); |
204 |
copy ($from, $name) |
205 |
or die "Can't copy $from to $name: $!"; |
206 |
} |
207 |
} |
208 |
|
209 |
sub ParseCONFIG |
210 |
{ |
211 |
my ($k, $v) ; |
212 |
my @badkey = () ; |
213 |
my %Info = () ; |
214 |
my @Options = qw( INCLUDE LIB BUILD_ZLIB OLD_ZLIB GZIP_OS_CODE ) ; |
215 |
my %ValidOption = map {$_, 1} @Options ; |
216 |
my %Parsed = %ValidOption ; |
217 |
my $CONFIG = 'config.in' ; |
218 |
|
219 |
print "Parsing $CONFIG...\n" ; |
220 |
|
221 |
open(F, "<$CONFIG") or die "Cannot open file $CONFIG: $!\n" ; |
222 |
while (<F>) { |
223 |
s/^\s*|\s*$//g ; |
224 |
next if /^\s*$/ or /^\s*#/ ; |
225 |
s/\s*#\s*$// ; |
226 |
|
227 |
($k, $v) = split(/\s+=\s+/, $_, 2) ; |
228 |
$k = uc $k ; |
229 |
if ($ValidOption{$k}) { |
230 |
delete $Parsed{$k} ; |
231 |
$Info{$k} = $v ; |
232 |
} |
233 |
else { |
234 |
push(@badkey, $k) ; |
235 |
} |
236 |
} |
237 |
close F ; |
238 |
|
239 |
print "Unknown keys in $CONFIG ignored [@badkey]\n" |
240 |
if @badkey ; |
241 |
|
242 |
# check parsed values |
243 |
my @missing = () ; |
244 |
die "The following keys are missing from $CONFIG [@missing]\n" |
245 |
if @missing = keys %Parsed ; |
246 |
|
247 |
$ZLIB_INCLUDE = defined $ENV{'ZLIB_INCLUDE'} |
248 |
? $ENV{'ZLIB_INCLUDE'} |
249 |
: $Info{'INCLUDE'} ; |
250 |
$ZLIB_LIB = defined $ENV{'ZLIB_LIB'} |
251 |
?$ENV{'ZLIB_LIB'} |
252 |
: $Info{'LIB'} ; |
253 |
|
254 |
if ($^O eq 'VMS') { |
255 |
$ZLIB_INCLUDE = VMS::Filespec::vmspath($ZLIB_INCLUDE); |
256 |
$ZLIB_LIB = VMS::Filespec::vmspath($ZLIB_LIB); |
257 |
} |
258 |
|
259 |
my $y = defined $ENV{'OLD_ZLIB'} |
260 |
? $ENV{'OLD_ZLIB'} |
261 |
: $Info{'OLD_ZLIB'} ; |
262 |
$OLD_ZLIB = '-DOLD_ZLIB' if $y and $y =~ /^yes|on|true|1$/i; |
263 |
|
264 |
my $x = defined $ENV{'BUILD_ZLIB'} |
265 |
? $ENV{'BUILD_ZLIB'} |
266 |
: $Info{'BUILD_ZLIB'} ; |
267 |
|
268 |
if ($x and $x =~ /^yes|on|true|1$/i ) { |
269 |
|
270 |
$BUILD_ZLIB = 1 ; |
271 |
|
272 |
# ZLIB_LIB & ZLIB_INCLUDE must point to the same place when |
273 |
# BUILD_ZLIB is specified. |
274 |
die "INCLUDE & LIB must be the same when BUILD_ZLIB is True\n" |
275 |
if $ZLIB_LIB ne $ZLIB_INCLUDE ; |
276 |
|
277 |
# Check the zlib source directory exists |
278 |
die "LIB/INCLUDE directory '$ZLIB_LIB' does not exits\n" |
279 |
unless -d $ZLIB_LIB ; |
280 |
|
281 |
# check for a well known file |
282 |
die "LIB/INCLUDE directory, '$ZLIB_LIB', doesn't seem to have the zlib source files\n" |
283 |
unless -e catfile($ZLIB_LIB, 'zlib.h') ; |
284 |
|
285 |
|
286 |
# write the Makefile |
287 |
print "Building Zlib enabled\n" ; |
288 |
} |
289 |
|
290 |
$GZIP_OS_CODE = defined $ENV{'GZIP_OS_CODE'} |
291 |
? $ENV{'GZIP_OS_CODE'} |
292 |
: $Info{'GZIP_OS_CODE'} ; |
293 |
|
294 |
die "GZIP_OS_CODE not 'AUTO_DETECT' or a number between 0 and 255\n" |
295 |
unless uc $GZIP_OS_CODE eq 'AUTO_DETECT' |
296 |
|| ( $GZIP_OS_CODE =~ /^(\d+)$/ && $1 >= 0 && $1 <= 255) ; |
297 |
|
298 |
if (uc $GZIP_OS_CODE eq 'AUTO_DETECT') |
299 |
{ |
300 |
print "Auto Detect Gzip OS Code..\n" ; |
301 |
$GZIP_OS_CODE = getOSCode() ; |
302 |
} |
303 |
|
304 |
my $name = getOSname($GZIP_OS_CODE); |
305 |
print "Setting Gzip OS Code to $GZIP_OS_CODE [$name]\n" ; |
306 |
|
307 |
print <<EOM if 0 ; |
308 |
INCLUDE [$ZLIB_INCLUDE] |
309 |
LIB [$ZLIB_LIB] |
310 |
GZIP_OS_CODE [$GZIP_OS_CODE] |
311 |
OLD_ZLIB [$OLD_ZLIB] |
312 |
BUILD_ZLIB [$BUILD_ZLIB] |
313 |
|
314 |
EOM |
315 |
|
316 |
print "Looks Good.\n" ; |
317 |
|
318 |
} |
319 |
|
320 |
|
321 |
|
322 |
sub zlib_files |
323 |
{ |
324 |
my $dir = shift ; |
325 |
|
326 |
my @h_files = (); |
327 |
my @c_files = (); |
328 |
|
329 |
if (-f catfile($dir, "infback.c")) { |
330 |
# zlib 1.2.0 or greater |
331 |
# |
332 |
@h_files = qw(crc32.h inffast.h inflate.h trees.h zconf.in.h |
333 |
zutil.h deflate.h inffixed.h inftrees.h zconf.h |
334 |
zlib.h |
335 |
); |
336 |
@c_files = qw(adler32 crc32 infback inflate uncompr |
337 |
compress deflate inffast inftrees |
338 |
trees zutil |
339 |
); |
340 |
} |
341 |
else { |
342 |
# zlib 1.1.x |
343 |
|
344 |
@h_files = qw(deflate.h infcodes.h inftrees.h zconf.h zutil.h |
345 |
infblock.h inffast.h infutil.h zlib.h |
346 |
); |
347 |
@c_files = qw(adler32 compress crc32 uncompr |
348 |
deflate trees zutil inflate infblock |
349 |
inftrees infcodes infutil inffast |
350 |
); |
351 |
} |
352 |
|
353 |
@h_files = map { catfile($dir, $_) } @h_files ; |
354 |
my @o_files = map { "$_\$(OBJ_EXT)" } 'Zlib', @c_files; |
355 |
@c_files = map { "$_.c" } 'Zlib', @c_files ; |
356 |
|
357 |
foreach my $file (@c_files) |
358 |
{ copy(catfile($dir, $file), '.') } |
359 |
|
360 |
return ( |
361 |
#'H' => [ @h_files ], |
362 |
'C' => [ @c_files ] , |
363 |
#'OBJECT' => qq[ @o_files ], |
364 |
'OBJECT' => q[ $(O_FILES) ], |
365 |
|
366 |
|
367 |
) ; |
368 |
} |
369 |
|
370 |
|
371 |
|
372 |
use vars qw ( @GZIP_OS_Names %OSnames) ; |
373 |
|
374 |
BEGIN |
375 |
{ |
376 |
@GZIP_OS_Names = ( |
377 |
[ '' => 0, 'MS-DOS' ], |
378 |
[ 'amigaos' => 1, 'Amiga' ], |
379 |
[ 'VMS' => 2, 'VMS' ], |
380 |
[ '' => 3, 'Unix/Default' ], |
381 |
[ '' => 4, 'VM/CMS' ], |
382 |
[ '' => 5, 'Atari TOS' ], |
383 |
[ 'os2' => 6, 'HPFS (OS/2, NT)' ], |
384 |
[ 'MacOS' => 7, 'Macintosh' ], |
385 |
[ '' => 8, 'Z-System' ], |
386 |
[ '' => 9, 'CP/M' ], |
387 |
[ '' => 10, 'TOPS-20' ], |
388 |
[ '' => 11, 'NTFS (NT)' ], |
389 |
[ '' => 12, 'SMS QDOS' ], |
390 |
[ '' => 13, 'Acorn RISCOS' ], |
391 |
[ 'MSWin32' => 14, 'VFAT file system (Win95, NT)' ], |
392 |
[ '' => 15, 'MVS' ], |
393 |
[ 'beos' => 16, 'BeOS' ], |
394 |
[ '' => 17, 'Tandem/NSK' ], |
395 |
[ '' => 18, 'THEOS' ], |
396 |
[ '' => 255, 'Unknown OS' ], |
397 |
); |
398 |
|
399 |
%OSnames = map { $$_[1] => $$_[2] } |
400 |
@GZIP_OS_Names ; |
401 |
} |
402 |
|
403 |
sub getOSCode |
404 |
{ |
405 |
my $default = 3 ; # Unix is the default |
406 |
|
407 |
my $uname = $^O; |
408 |
|
409 |
for my $h (@GZIP_OS_Names) |
410 |
{ |
411 |
my ($pattern, $code, $name) = @$h; |
412 |
|
413 |
return $code |
414 |
if $pattern && $uname eq $pattern ; |
415 |
} |
416 |
|
417 |
return $default ; |
418 |
} |
419 |
|
420 |
sub getOSname |
421 |
{ |
422 |
my $code = shift ; |
423 |
|
424 |
return $OSnames{$code} || 'Unknown OS' ; |
425 |
} |
426 |
|
427 |
# end of file Makefile.PL |
428 |
|