From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

#!/usr/bin/perl -w
use strict;
use lib 't/lib';
use MBTest;
blib_load('Module::Build');
blib_load('Module::Build::ConfigData');
my $tmp;
{
my ($have_c_compiler, $tmp_exec) = check_compiler();
if ( ! $have_c_compiler ) {
plan skip_all => 'No compiler found';
} elsif ( ! eval {require PAR::Dist; PAR::Dist->VERSION(0.17)} ) {
plan skip_all => "PAR::Dist 0.17 or up not installed to check .par's.";
} elsif ( ! eval {require Archive::Zip} ) {
plan skip_all => "Archive::Zip required.";
} else {
plan tests => 3;
}
require Cwd;
$tmp = MBTest->tmpdir( $tmp_exec ? () : (DIR => Cwd::cwd) );
}
use DistGen;
my $dist = DistGen->new( dir => $tmp, xs => 1 );
$dist->add_file( 'hello', <<'---' );
#!perl -w
print "Hello, World!\n";
__END__
=pod
=head1 NAME
hello
=head1 DESCRIPTION
Says "Hello"
=cut
---
$dist->change_build_pl
({
module_name => $dist->name,
version => '0.01',
license => 'perl',
scripts => [ 'hello' ],
});
$dist->regen;
$dist->chdir_in;
use File::Spec::Functions qw(catdir);
my @installstyle = qw(lib perl5);
my $mb = Module::Build->new_from_context(
verbose => 0,
quiet => 1,
installdirs => 'site',
);
my $filename = $mb->dispatch('pardist');
ok( -f $filename, '.par distributions exists' );
my $distname = $dist->name;
ok( $filename =~ /^\Q$distname\E/, 'Distribution name seems correct' );
#--------------------------------------------------------------------------#
# must work around broken Archive::Zip (1.28) which breaks PAR::Dist
#--------------------------------------------------------------------------#
SKIP: {
my $zip = Archive::Zip->new;
my $tmp2 = MBTest->tmpdir;
local %SIG;
$SIG{__WARN__} = sub { print STDERR $_[0] unless $_[0] =~ /\bstat\b/ };
skip "broken Archive::Zip", 1
unless eval { $zip->read($filename) == Archive::Zip::AZ_OK() }
&& eval { $zip->extractTree('', "$tmp2/") == Archive::Zip::AZ_OK() }
&& -r File::Spec->catfile( $tmp2, 'blib', 'META.yml' );
my $meta;
eval { $meta = PAR::Dist::get_meta($filename) };
ok(
(not $@ and defined $meta and not $meta eq ''),
'Distribution contains META.yml'
);
}