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