Commit | Line | Data |
ee7ea0b1 |
1 | #!perl -w |
2 | |
6e770d9c |
3 | BEGIN { require 5.006 } |
3357b1b1 |
4 | use strict; |
5 | use Config qw(%Config); |
6 | use ExtUtils::MakeMaker; |
7 | |
ee7ea0b1 |
8 | my $PERL_CORE = grep $_ eq "PERL_CORE=1", @ARGV; |
9 | |
3357b1b1 |
10 | my @extra; |
9a03235d |
11 | @extra = (DEFINE => "-DU32_ALIGNMENT_REQUIRED") unless free_u32_alignment(); |
92dc3567 |
12 | |
55315086 |
13 | if ($^O eq 'VMS') { |
14 | if (defined($Config{ccname})) { |
614d5782 |
15 | if (grep(/VMS_VAX/, @INC) && ($Config{ccname} eq 'DEC')) { |
16 | # VAX compiler optimizer even as late as v6.4 gets stuck |
9a03235d |
17 | push(@extra, OPTIMIZE => "/Optimize=(NODISJOINT)"); |
55315086 |
18 | } |
19 | } |
20 | } |
3357b1b1 |
21 | |
77e6095e |
22 | push(@extra, 'INSTALLDIRS' => 'perl') if $] >= 5.008; |
ee7ea0b1 |
23 | push(@extra, 'MAN3PODS' => {}) if $PERL_CORE; # Pods built by installman. |
9a03235d |
24 | |
3357b1b1 |
25 | WriteMakefile( |
26 | 'NAME' => 'Digest::MD5', |
27 | 'VERSION_FROM' => 'MD5.pm', |
ee7ea0b1 |
28 | 'PREREQ_PM' => { 'File::Spec' => 0, |
29 | 'Digest::base' => '1.00', |
30 | }, |
3357b1b1 |
31 | @extra, |
32 | 'dist' => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', }, |
33 | ); |
3357b1b1 |
34 | |
9a03235d |
35 | |
36 | |
37 | sub free_u32_alignment |
38 | { |
ee7ea0b1 |
39 | $|=1; |
40 | if (exists $Config{d_u32align}) { |
41 | print "Perl's config says that U32 access must "; |
42 | print "not " unless $Config{d_u32align}; |
43 | print "be aligned.\n"; |
44 | return !$Config{d_u32align}; |
45 | } |
46 | |
47 | if ($^O eq 'VMS' || $^O eq 'MSWin32') { |
48 | print "Assumes that $^O implies free alignment for U32 access.\n"; |
49 | return 1; |
50 | } |
51 | |
52 | if ($^O eq 'hpux' && $Config{osvers} < 11.0) { |
53 | print "Will not test for free alignment on older HP-UX.\n"; |
54 | return 0; |
55 | } |
56 | |
57 | print "Testing alignment requirements for U32... "; |
58 | open(ALIGN_TEST, ">u32align.c") or die "$!"; |
59 | print ALIGN_TEST <<'EOT'; close(ALIGN_TEST); |
60 | /*--------------------------------------------------------------*/ |
61 | /* This program allocates a buffer of U8 (char) and then tries */ |
62 | /* to access it through a U32 pointer at every offset. The */ |
63 | /* program is expected to die with a bus error/seg fault for */ |
64 | /* machines that do not support unaligned integer read/write */ |
65 | /*--------------------------------------------------------------*/ |
66 | |
67 | #include <stdio.h> |
68 | #include "EXTERN.h" |
69 | #include "perl.h" |
70 | |
71 | #ifdef printf |
72 | #undef printf |
73 | #endif |
74 | |
75 | int main(int argc, char** argv, char** env) |
76 | { |
77 | #if BYTEORDER == 0x1234 || BYTEORDER == 0x4321 |
78 | U8 buf[] = "\0\0\0\1\0\0\0\0"; |
79 | U32 *up; |
80 | int i; |
81 | |
82 | if (sizeof(U32) != 4) { |
83 | printf("sizeof(U32) is not 4, but %d\n", sizeof(U32)); |
84 | exit(1); |
85 | } |
86 | |
87 | fflush(stdout); |
88 | |
89 | for (i = 0; i < 4; i++) { |
90 | up = (U32*)(buf + i); |
91 | if (! ((*up == 1 << (8*i)) || /* big-endian */ |
92 | (*up == 1 << (8*(3-i))) /* little-endian */ |
93 | ) |
94 | ) |
95 | { |
96 | printf("read failed (%x)\n", *up); |
97 | exit(2); |
98 | } |
99 | } |
100 | |
101 | /* write test */ |
102 | for (i = 0; i < 4; i++) { |
103 | up = (U32*)(buf + i); |
104 | *up = 0xBeef; |
105 | if (*up != 0xBeef) { |
106 | printf("write failed (%x)\n", *up); |
107 | exit(3); |
108 | } |
109 | } |
110 | |
111 | printf("no restrictions\n"); |
112 | exit(0); |
113 | #else |
114 | printf("unusual byteorder, playing safe\n"); |
115 | exit(1); |
116 | #endif |
117 | return 0; |
118 | } |
119 | /*--------------------------------------------------------------*/ |
120 | EOT |
121 | |
122 | my $cc_cmd = "$Config{cc} $Config{ccflags} -I$Config{archlibexp}/CORE"; |
123 | my $exe = "u32align$Config{exe_ext}"; |
124 | $cc_cmd .= " -o $exe"; |
125 | my $rc; |
126 | $rc = system("$cc_cmd $Config{ldflags} u32align.c $Config{libs}"); |
127 | if ($rc) { |
128 | print "Can't compile test program. Will ensure alignment to play safe.\n\n"; |
129 | unlink("u32align.c", $exe, "u32align$Config{obj_ext}"); |
130 | return 0; |
131 | } |
132 | |
133 | $rc = system("./$exe"); |
134 | unlink("u32align.c", $exe, "u32align$Config{obj_ext}"); |
135 | |
136 | return 1 unless $rc; |
137 | |
138 | if ($rc > 0x80) { |
6e770d9c |
139 | (my $cp = $rc) >>= 8; |
140 | print "Test program exit status was $cp\n"; |
141 | } |
142 | if ($rc & 0x80) { |
143 | $rc &= ~0x80; |
144 | unlink("core") && print "Core dump deleted\n"; |
ee7ea0b1 |
145 | } |
6e770d9c |
146 | print "signal $rc\n" if $rc && $rc < 0x80; |
9a03235d |
147 | return 0; |
148 | } |