Blame Makefile.PL

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
}