1#!perl -w
2
3BEGIN { require 5.004 }
4use strict;
5use Config qw(%Config);
6use ExtUtils::MakeMaker;
7
8my $PERL_CORE = grep $_ eq "PERL_CORE=1", @ARGV;
9
10my @extra;
11@extra = (DEFINE => "-DU32_ALIGNMENT_REQUIRED") unless free_u32_alignment();
12
13if ($^O eq 'VMS') {
14    if (defined($Config{ccname})) {
15        if (grep(/VMS_VAX/, @INC) && ($Config{ccname} eq 'DEC')) {
16            # VAX compiler optimizer even as late as v6.4 gets stuck
17            push(@extra, OPTIMIZE => "/Optimize=(NODISJOINT)");
18        }
19    }
20}
21
22push(@extra, 'INSTALLDIRS'  => 'perl') if $] >= 5.008;
23push(@extra, 'MAN3PODS' => {}) if $PERL_CORE; # Pods built by installman.
24
25WriteMakefile(
26    'NAME'	   => 'Digest::MD5::M4p',
27    'VERSION_FROM' => 'M4p.pm',
28    'PREREQ_PM'    => { 'File::Spec' => 0,
29			'Digest::base' => '1.00',
30		      },
31    @extra,
32    'dist'         => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', },
33);
34
35
36
37sub free_u32_alignment
38{
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
75int 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/*--------------------------------------------------------------*/
120EOT
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) {
139	$rc >>= 8;
140	print "Test program exit status was $rc\n";
141    } else {
142	if ($rc & 0x80) {
143	    $rc &= ~0x80;
144	    print "Core dump deleted\n";
145	    unlink("core");
146	}
147	print "signal $rc\n";
148    }
149    return 0;
150}
151