1#!perl -w
2
3use strict;
4use Config qw(%Config);
5use ExtUtils::MakeMaker;
6
7my @extra;
8push(@extra, DEFINE => "-DU32_ALIGNMENT_REQUIRED") unless free_u32_alignment();
9push(@extra, INSTALLDIRS => 'perl') if $] >= 5.008 && $] < 5.012;
10
11if ($^O eq 'VMS') {
12    if (defined($Config{ccname})) {
13        if (grep(/VMS_VAX/, @INC) && ($Config{ccname} eq 'DEC')) {
14            # VAX compiler optimizer even as late as v6.4 gets stuck
15            push(@extra, OPTIMIZE => "/Optimize=(NODISJOINT)");
16        }
17    }
18}
19
20
21WriteMakefile(
22    'NAME'	   => 'Digest::MD5',
23    'VERSION_FROM' => 'MD5.pm',
24    'ABSTRACT'     => 'Perl interface to the MD-5 algorithm',
25    'AUTHOR'       => 'Gisle Aas <gisle@activestate.com>',
26    'LICENSE'      => 'perl',
27    'MIN_PERL_VERSION' => 5.006,
28    'PREREQ_PM'    => {
29			'Digest::base' => '1.00',
30			'XSLoader' => 0,
31		      },
32    'META_MERGE'   => {
33        resources  => {
34            repository => 'https://github.com/gisle/digest-md5',
35        }
36    },
37    @extra,
38);
39
40
41
42sub free_u32_alignment
43{
44    $|=1;
45    if (exists $Config{d_u32align}) {
46       print "Perl's config says that U32 access must ";
47       print "not " unless $Config{d_u32align};
48       print "be aligned.\n";
49       return !$Config{d_u32align};
50    }
51
52    if ($^O eq 'VMS' || $^O eq 'MSWin32') {
53       print "Assumes that $^O implies free alignment for U32 access.\n";
54       return 1;
55    }
56
57    if ($^O eq 'hpux' && $Config{osvers} < 11.0) {
58       print "Will not test for free alignment on older HP-UX.\n";
59       return 0;
60    }
61
62    print "Testing alignment requirements for U32... ";
63    open(ALIGN_TEST, ">u32align.c") or die "$!";
64    print ALIGN_TEST <<'EOT'; close(ALIGN_TEST);
65/*--------------------------------------------------------------*/
66/*  This program allocates a buffer of U8 (char) and then tries */
67/*  to access it through a U32 pointer at every offset.  The    */
68/*  program  is expected to die with a bus error/seg fault for  */
69/*  machines that do not support unaligned integer read/write   */
70/*--------------------------------------------------------------*/
71
72#include <stdio.h>
73#include "EXTERN.h"
74#include "perl.h"
75
76#ifdef printf
77 #undef printf
78#endif
79
80int main(int argc, char** argv, char** env)
81{
82#if BYTEORDER == 0x1234 || BYTEORDER == 0x4321
83    volatile U8 buf[] = "\0\0\0\1\0\0\0\0";
84    volatile U32 *up;
85    int i;
86
87    if (sizeof(U32) != 4) {
88	printf("sizeof(U32) is not 4, but %d\n", sizeof(U32));
89	exit(1);
90    }
91
92    fflush(stdout);
93
94    for (i = 0; i < 4; i++) {
95	up = (U32*)(buf + i);
96	if (! ((*up == 1 << (8*i)) ||   /* big-endian */
97	       (*up == 1 << (8*(3-i)))  /* little-endian */
98	      )
99	   )
100	{
101	    printf("read failed (%x)\n", *up);
102	    exit(2);
103	}
104    }
105
106    /* write test */
107    for (i = 0; i < 4; i++) {
108	up = (U32*)(buf + i);
109	*up = 0xBeef;
110	if (*up != 0xBeef) {
111	    printf("write failed (%x)\n", *up);
112	    exit(3);
113	}
114    }
115
116    printf("no restrictions\n");
117    exit(0);
118#else
119    printf("unusual byteorder, playing safe\n");
120    exit(1);
121#endif
122    return 0;
123}
124/*--------------------------------------------------------------*/
125EOT
126
127    my $cc_cmd = "$Config{cc} $Config{ccflags} -I$Config{archlibexp}/CORE";
128    my $exe = "u32align$Config{exe_ext}";
129    $cc_cmd .= " -o $exe";
130    my $rc;
131    $rc = system("$cc_cmd $Config{ldflags} u32align.c $Config{libs}");
132    if ($rc) {
133	print "Can't compile test program.  Will ensure alignment to play safe.\n\n";
134	unlink("u32align.c", $exe, "u32align$Config{obj_ext}");
135	return 0;
136    }
137
138    $rc = system("./$exe");
139    unlink("u32align.c", $exe, "u32align$Config{obj_ext}");
140
141    return 1 unless $rc;
142
143    if ($rc > 0x80) {
144	(my $cp = $rc) >>= 8;
145	print "Test program exit status was $cp\n";
146    }
147    if ($rc & 0x80) {
148	$rc &= ~0x80;
149	unlink("core") && print "Core dump deleted\n";
150    }
151    print "signal $rc\n" if $rc && $rc < 0x80;
152    return 0;
153}
154
155BEGIN {
156    # compatibility with older versions of MakeMaker
157    my $developer = -d ".git";
158    my %mm_req = (
159        LICENCE => 6.31,
160        META_MERGE => 6.45,
161        META_ADD => 6.45,
162        MIN_PERL_VERSION => 6.48,
163    );
164    undef(*WriteMakefile);
165    *WriteMakefile = sub {
166        my %arg = @_;
167        for (keys %mm_req) {
168            unless (eval { ExtUtils::MakeMaker->VERSION($mm_req{$_}) }) {
169                warn "$_ $@" if $developer;
170                delete $arg{$_};
171            }
172        }
173        ExtUtils::MakeMaker::WriteMakefile(%arg);
174    };
175}
176