The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!/usr/bin/perl -w
use 5.005;
use ExtUtils::MakeMaker;
use File::Spec::Functions 'catfile';
use strict;

use Config;
(unpack "B*", pack "N", $Config{ptrsize}) =~ /^0+1(0+)$/
    or die "Your pointer size of $Config{ptrsize} is very confusing";
my $ptr_bits = length $1;

write_header(
    'refcounted_he.h' =>
    extract_chunk_from_file(catfile($Config{archlib}, 'CORE', 'hv.h'), qr/struct refcounted_he \{/, qr/\};/)
);


my %MakefileOpts = (
    NAME => 'Devel::SizeMe',
    VERSION_FROM => 'lib/Devel/SizeMe/Core.pm',
    DEFINE => "-DALIGN_BITS=$ptr_bits",
    PREREQ_PM => {
        'autodie' => '2.12',
        'XSLoader' => 0,
        'Moo' => '1.000007',
        'Test::More' => '0.98',
        'JSON::XS' => 0,
        'HTML::Entities' => 0,
        'Devel::Dwarn' => 0,
        'DBI' => '0',
        'DBD::SQLite' => '1.37',
        # Removed for now as it stops people using SizeMe with 5.8
        # sizeme_graph.pl will eventually become a separate module
        #'Mojolicious::Lite' => 0,
    },
    EXE_FILES => [ 'bin/sizeme_store.pl', 'bin/sizeme_graph.pl' ],
    clean => {
        FILES => 'refcounted_he.h',
    },
    META_MERGE => {
        resources => {
            'meta-spec' => { version => 2 },
            repository  => {
                type => 'git',
                url => 'git://github.com/timbunce/devel-sizeme.git',
                web => 'https://github.com/timbunce/devel-sizeme',
            },
            bugtracker => {
                web => 'https://github.com/timbunce/devel-sizeme/issues',
            },
            homepage    => 'https://github.com/timbunce/devel-sizeme',
        },
    },
    MIN_PERL_VERSION => '5.008',
    LICENSE => 'perl',
    dist  => {
        DIST_DEFAULT => 'clean distcheck disttest tardist',
        PREOP        => '$(MAKE) -f Makefile.old distdir',
        COMPRESS     => 'gzip -v9',
        SUFFIX       => 'gz',
    },
);

if (-d ".git") {
    $MakefileOpts{OPTIMIZE} = "-g";
    warn "Forcing OPTIMIZE=$MakefileOpts{OPTIMIZE}\n";
}

WriteMakefile1(%MakefileOpts);


sub WriteMakefile1 {
    #Written by Alexandr Ciornii, version 0.21. Added by eumm-upgrade.
    my %params       = @_;
    my $eumm_version = $ExtUtils::MakeMaker::VERSION;
    $eumm_version = eval $eumm_version;
    die "EXTRA_META is deprecated" if ( exists( $params{EXTRA_META} ) );
    die "License not specified"    if ( !exists( $params{LICENSE} ) );
    if ( $params{BUILD_REQUIRES} and ( $eumm_version < 6.5503 ) ) {
        #EUMM 6.5502 has problems with BUILD_REQUIRES
        $params{PREREQ_PM} = { %{ $params{PREREQ_PM} || {} }, %{ $params{BUILD_REQUIRES} } };
        delete $params{BUILD_REQUIRES};
    }

    # more or less taken from Moose' Makefile.PL
    if ( $params{CONFLICTS} ) {
        my $ok = CheckConflicts(%params);
        exit(0) if ( $params{PREREQ_FATAL} and not $ok );
        my $cpan_smoker = grep { $_ =~ m/(?:CR_SMOKER|CPAN_REPORTER|AUTOMATED_TESTING)/ } keys %ENV;
        unless ( $cpan_smoker || $ENV{PERL_MM_USE_DEFAULT} ) {
            sleep 4 unless ($ok);
        }
        %{$params{META_MERGE}{conflicts}} = %{$params{CONFLICTS}};
        delete $params{CONFLICTS};
    }

    delete $params{CONFIGURE_REQUIRES} if ( $eumm_version < 6.52 );
    delete $params{MIN_PERL_VERSION}   if ( $eumm_version < 6.48 );
    delete $params{META_MERGE}         if ( $eumm_version < 6.46 );
    delete $params{META_ADD}           if ( $eumm_version < 6.46 );
    delete $params{LICENSE}            if ( $eumm_version < 6.31 );

    WriteMakefile(%params);
}


my $conflictMsg = <<EOCM;
***
    This version of Devel::SizeMe conflicts with the version of
    module %s (%s) you have installed.

    It's strongly recommended that you update it after
    installing this version of Devel::SizeMe.
***
EOCM

sub CheckConflicts {
    my %params    = @_;
    my %conflicts = %{ $params{CONFLICTS} };
    my $found     = 0;

    while ( my ( $module, $version ) = each(%conflicts) ) {
        undef $@;
        eval "require $module";
        next if $@;
        my $installed = eval "\$" . $module . "::VERSION";
        if ( $installed le $version ) {
            ++$found;
            my $msg = $conflictMsg;
            my $warning = sprintf( $msg, $module, $installed );
            warn $warning;
        }
    }

    return !$found;
}


sub extract_chunk_from_file {
    my ($file, $start_regex, $end_regex) = @_;
    $file =~ s/^~/$ENV{HOME}/ if $ENV{HOME};
    open my $fh, '<', $file or die $!;

    my $def;
    while (<$fh>) {
        next unless /$start_regex/ .. /$end_regex/;
        $def .= $_;
    }
    close $fh or die $!;

    return $def;
}


sub write_header {
    my ($filename, $contents) = @_;
    my $guard_name = uc $filename;
    $guard_name =~ tr/./_/;

    open my $fh, '>', $filename or die $!;
    print { $fh } "#ifndef ${guard_name}\n";
    print { $fh } "#define ${guard_name}\n";
    print { $fh } $contents if defined $contents;
    print { $fh } "#endif /* ${guard_name} */\n";
    close $fh or die $!;
}


# =====================================================================

package MY;

sub postamble {
    return qq{

ptest:  all
\t prove --blib --jobs 4 --shuffle

    \n};
}