|
Packit |
f354a3 |
#!perl -w
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
use strict;
|
|
Packit |
f354a3 |
use Config qw(%Config);
|
|
Packit |
f354a3 |
use ExtUtils::MakeMaker;
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
my @extra;
|
|
Packit |
f354a3 |
push(@extra, DEFINE => "-DU32_ALIGNMENT_REQUIRED") unless free_u32_alignment();
|
|
Packit |
f354a3 |
push(@extra, INSTALLDIRS => 'perl') if $] >= 5.008 && $] < 5.012;
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
if ($^O eq 'VMS') {
|
|
Packit |
f354a3 |
if (defined($Config{ccname})) {
|
|
Packit |
f354a3 |
if (grep(/VMS_VAX/, @INC) && ($Config{ccname} eq 'DEC')) {
|
|
Packit |
f354a3 |
# VAX compiler optimizer even as late as v6.4 gets stuck
|
|
Packit |
f354a3 |
push(@extra, OPTIMIZE => "/Optimize=(NODISJOINT)");
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
WriteMakefile(
|
|
Packit |
f354a3 |
'NAME' => 'Digest::MD5',
|
|
Packit |
f354a3 |
'VERSION_FROM' => 'MD5.pm',
|
|
Packit |
f354a3 |
'ABSTRACT' => 'Perl interface to the MD-5 algorithm',
|
|
Packit |
f354a3 |
'AUTHOR' => 'Gisle Aas <gisle@activestate.com>',
|
|
Packit |
f354a3 |
'LICENSE' => 'perl',
|
|
Packit |
f354a3 |
'MIN_PERL_VERSION' => 5.006,
|
|
Packit |
f354a3 |
'PREREQ_PM' => {
|
|
Packit |
f354a3 |
'Digest::base' => '1.00',
|
|
Packit |
f354a3 |
'XSLoader' => 0,
|
|
Packit |
f354a3 |
},
|
|
Packit |
f354a3 |
'META_MERGE' => {
|
|
Packit |
f354a3 |
resources => {
|
|
Packit |
f354a3 |
repository => 'https://github.com/gisle/digest-md5',
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
},
|
|
Packit |
f354a3 |
@extra,
|
|
Packit |
f354a3 |
);
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
sub free_u32_alignment
|
|
Packit |
f354a3 |
{
|
|
Packit |
f354a3 |
$|=1;
|
|
Packit |
f354a3 |
if (exists $Config{d_u32align}) {
|
|
Packit |
f354a3 |
print "Perl's config says that U32 access must ";
|
|
Packit |
f354a3 |
print "not " unless $Config{d_u32align};
|
|
Packit |
f354a3 |
print "be aligned.\n";
|
|
Packit |
f354a3 |
return !$Config{d_u32align};
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
if ($^O eq 'VMS' || $^O eq 'MSWin32') {
|
|
Packit |
f354a3 |
print "Assumes that $^O implies free alignment for U32 access.\n";
|
|
Packit |
f354a3 |
return 1;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
if ($^O eq 'hpux' && $Config{osvers} < 11.0) {
|
|
Packit |
f354a3 |
print "Will not test for free alignment on older HP-UX.\n";
|
|
Packit |
f354a3 |
return 0;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
print "Testing alignment requirements for U32... ";
|
|
Packit |
f354a3 |
open(ALIGN_TEST, ">u32align.c") or die "$!";
|
|
Packit |
f354a3 |
print ALIGN_TEST <<'EOT'; close(ALIGN_TEST);
|
|
Packit |
f354a3 |
/*--------------------------------------------------------------*/
|
|
Packit |
f354a3 |
/* This program allocates a buffer of U8 (char) and then tries */
|
|
Packit |
f354a3 |
/* to access it through a U32 pointer at every offset. The */
|
|
Packit |
f354a3 |
/* program is expected to die with a bus error/seg fault for */
|
|
Packit |
f354a3 |
/* machines that do not support unaligned integer read/write */
|
|
Packit |
f354a3 |
/*--------------------------------------------------------------*/
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
#include <stdio.h>
|
|
Packit |
f354a3 |
#include "EXTERN.h"
|
|
Packit |
f354a3 |
#include "perl.h"
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
#ifdef printf
|
|
Packit |
f354a3 |
#undef printf
|
|
Packit |
f354a3 |
#endif
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
int main(int argc, char** argv, char** env)
|
|
Packit |
f354a3 |
{
|
|
Packit |
f354a3 |
#if BYTEORDER == 0x1234 || BYTEORDER == 0x4321
|
|
Packit |
f354a3 |
volatile U8 buf[] = "\0\0\0\1\0\0\0\0";
|
|
Packit |
f354a3 |
volatile U32 *up;
|
|
Packit |
f354a3 |
int i;
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
if (sizeof(U32) != 4) {
|
|
Packit |
f354a3 |
printf("sizeof(U32) is not 4, but %d\n", sizeof(U32));
|
|
Packit |
f354a3 |
exit(1);
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
fflush(stdout);
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
for (i = 0; i < 4; i++) {
|
|
Packit |
f354a3 |
up = (U32*)(buf + i);
|
|
Packit |
f354a3 |
if (! ((*up == 1 << (8*i)) || /* big-endian */
|
|
Packit |
f354a3 |
(*up == 1 << (8*(3-i))) /* little-endian */
|
|
Packit |
f354a3 |
)
|
|
Packit |
f354a3 |
)
|
|
Packit |
f354a3 |
{
|
|
Packit |
f354a3 |
printf("read failed (%x)\n", *up);
|
|
Packit |
f354a3 |
exit(2);
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
/* write test */
|
|
Packit |
f354a3 |
for (i = 0; i < 4; i++) {
|
|
Packit |
f354a3 |
up = (U32*)(buf + i);
|
|
Packit |
f354a3 |
*up = 0xBeef;
|
|
Packit |
f354a3 |
if (*up != 0xBeef) {
|
|
Packit |
f354a3 |
printf("write failed (%x)\n", *up);
|
|
Packit |
f354a3 |
exit(3);
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
printf("no restrictions\n");
|
|
Packit |
f354a3 |
exit(0);
|
|
Packit |
f354a3 |
#else
|
|
Packit |
f354a3 |
printf("unusual byteorder, playing safe\n");
|
|
Packit |
f354a3 |
exit(1);
|
|
Packit |
f354a3 |
#endif
|
|
Packit |
f354a3 |
return 0;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
/*--------------------------------------------------------------*/
|
|
Packit |
f354a3 |
EOT
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
my $cc_cmd = "$Config{cc} $Config{ccflags} -I$Config{archlibexp}/CORE";
|
|
Packit |
f354a3 |
my $exe = "u32align$Config{exe_ext}";
|
|
Packit |
f354a3 |
$cc_cmd .= " -o $exe";
|
|
Packit |
f354a3 |
my $rc;
|
|
Packit |
f354a3 |
$rc = system("$cc_cmd $Config{ldflags} u32align.c $Config{libs}");
|
|
Packit |
f354a3 |
if ($rc) {
|
|
Packit |
f354a3 |
print "Can't compile test program. Will ensure alignment to play safe.\n\n";
|
|
Packit |
f354a3 |
unlink("u32align.c", $exe, "u32align$Config{obj_ext}");
|
|
Packit |
f354a3 |
return 0;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
$rc = system("./$exe");
|
|
Packit |
f354a3 |
unlink("u32align.c", $exe, "u32align$Config{obj_ext}");
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
return 1 unless $rc;
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
if ($rc > 0x80) {
|
|
Packit |
f354a3 |
(my $cp = $rc) >>= 8;
|
|
Packit |
f354a3 |
print "Test program exit status was $cp\n";
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
if ($rc & 0x80) {
|
|
Packit |
f354a3 |
$rc &= ~0x80;
|
|
Packit |
f354a3 |
unlink("core") && print "Core dump deleted\n";
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
print "signal $rc\n" if $rc && $rc < 0x80;
|
|
Packit |
f354a3 |
return 0;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
BEGIN {
|
|
Packit |
f354a3 |
# compatibility with older versions of MakeMaker
|
|
Packit |
f354a3 |
my $developer = -d ".git";
|
|
Packit |
f354a3 |
my %mm_req = (
|
|
Packit |
f354a3 |
LICENCE => 6.31,
|
|
Packit |
f354a3 |
META_MERGE => 6.45,
|
|
Packit |
f354a3 |
META_ADD => 6.45,
|
|
Packit |
f354a3 |
MIN_PERL_VERSION => 6.48,
|
|
Packit |
f354a3 |
);
|
|
Packit |
f354a3 |
undef(*WriteMakefile);
|
|
Packit |
f354a3 |
*WriteMakefile = sub {
|
|
Packit |
f354a3 |
my %arg = @_;
|
|
Packit |
f354a3 |
for (keys %mm_req) {
|
|
Packit |
f354a3 |
unless (eval { ExtUtils::MakeMaker->VERSION($mm_req{$_}) }) {
|
|
Packit |
f354a3 |
warn "$_ $@" if $developer;
|
|
Packit |
f354a3 |
delete $arg{$_};
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
ExtUtils::MakeMaker::WriteMakefile(%arg);
|
|
Packit |
f354a3 |
};
|
|
Packit |
f354a3 |
}
|