The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

# Test problems in Makefile.PL's and hint files.
BEGIN {
unshift @INC, 't/lib';
}
chdir 't';
use strict;
use MakeMaker::Test::Utils qw(makefile_name make make_run run hash2files);
use Config;
use utf8;
BEGIN {
plan skip_all => 'Need perlio and perl 5.8+.'
if "$]" < 5.008 or !$Config{useperlio};
plan skip_all => 'cross-compiling and make not available'
if !MM->can_run(make()) && $ENV{PERL_CORE} && $Config{'usecrosscompile'};
plan tests => 8;
}
use TieOut;
my $MM = bless { DIR => ['.'] }, 'MM';
my $DIRNAME = 'Problem-Module';
my %FILES = (
'Makefile.PL' => <<'PL_END',
use ExtUtils::MakeMaker;
use utf8;
WriteMakefile(
NAME => 'Problem::Module',
ABSTRACT_FROM => 'lib/Problem/Module.pm',
AUTHOR => q{Danijel Tašov},
EXE_FILES => [ qw(bin/probscript) ],
INSTALLMAN1DIR => "some", # even if disabled in $Config{man1dir}
MAN1EXT => 1, # set to 0 if man pages disabled
);
PL_END
'lib/Problem/Module.pm' => <<'pm_END',
use utf8;
=pod
=encoding utf8
=head1 NAME
Problem::Module - Danijel Tašov's great new module
=cut
1;
pm_END
'bin/probscript' => <<'pl_END',
#!/usr/bin/perl
use utf8;
=encoding utf8
=head1 NAME
文档 - Problem script
pl_END
);
hash2files($DIRNAME, \%FILES);
END {
ok( chdir File::Spec->updir, 'chdir updir' );
ok( rmtree($DIRNAME), 'teardown' );
}
ok( chdir $DIRNAME, "chdir'd to $DIRNAME" ) ||
diag("chdir failed: $!");
if ("$]" >= 5.008) {
eval { require ExtUtils::MakeMaker::Locale; };
note "ExtUtils::MakeMaker::Locale vars: $ExtUtils::MakeMaker::Locale::ENCODING_LOCALE;$ExtUtils::MakeMaker::Locale::ENCODING_LOCALE_FS;$ExtUtils::MakeMaker::Locale::ENCODING_CONSOLE_IN;$ExtUtils::MakeMaker::Locale::ENCODING_CONSOLE_OUT\n" unless $@;
note "Locale env vars: " . join(';', map {
"$_=$ENV{$_}"
} grep { /LANG|LC/ } keys %ENV) . "\n";
}
# Make sure when Makefile.PL's break, they issue a warning.
# Also make sure Makefile.PL's in subdirs still have '.' in @INC.
{
my $stdout = tie *STDOUT, 'TieOut' or die;
my $warning = '';
local $SIG{__WARN__} = sub { $warning .= join '', @_ };
$MM->eval_in_subdirs;
my $warnlines = grep { !/does not map to/ } split "\n", $warning;
is $warnlines, 0, 'no warning' or diag $warning;
open my $json_fh, '<:utf8', 'MYMETA.json' or die $!;
my $json = do { local $/; <$json_fh> };
close $json_fh;
no utf8; # leave the data below as bytes and let Encode sort it out
require Encode;
my $str = Encode::decode( 'utf8', "Danijel Tašov's" );
like( $json, qr/$str/, 'utf8 abstract' );
untie *STDOUT;
}
my $make = make_run();
my $make_out = run($make);
diag $make_out unless is $? >> 8, 0, 'Exit code of make == 0';
my $manfile = File::Spec->catfile(qw(blib man1 probscript.1));
SKIP: {
skip 'Manpage not generated', 1 unless -f $manfile;
skip 'Pod::Man >= 2.17 needed', 1 unless do {
require Pod::Man; $Pod::Man::VERSION >= 2.17;
};
open my $man_fh, '<:utf8', $manfile or die "open $manfile: $!";
my $man = do { local $/; <$man_fh> };
close $man_fh;
no utf8; # leave the data below as bytes and let Encode sort it out
require Encode;
my $str = Encode::decode( 'utf8', "文档" );
like( $man, qr/$str/, 'utf8 man-snippet' );
}
$make_out = run("$make realclean");
diag $make_out unless is $? >> 8, 0, 'Exit code of make == 0';
sub makefile_content {
open my $fh, '<', makefile_name or die;
return <$fh>;
}