Sponsoring The Perl Toolchain Summit 2025: Help make this important event another success Learn more

my ($optdep_msg, $opt_testdeps);
if ($args->{skip_author_deps}) {
$optdep_msg = <<'EOW';
******************************************************************************
******************************************************************************
*** ***
*** IGNORING AUTHOR MODE: no optional test dependencies will be forced. ***
*** ***
*** If you are using this checkout with the intention of submitting a DBIC ***
*** patch, you are *STRONGLY ENCOURAGED* to install all dependencies, so ***
*** that every possible unit-test will run. ***
*** ***
******************************************************************************
******************************************************************************
EOW
}
else {
$optdep_msg = <<'EOW';
******************************************************************************
******************************************************************************
*** ***
*** AUTHOR MODE: all optional test dependencies converted to hard requires ***
*** ( to disable re-run Makefile.PL with --skip-author-deps ) ***
*** ***
******************************************************************************
******************************************************************************
EOW
my %reqs_for_group = %{DBIx::Class::Optional::Dependencies->req_group_list};
# exclude the rdbms_* groups which are for DBIC users
$opt_testdeps = {
map { %{$reqs_for_group{$_}} } grep { !/^rdbms_|^dist_/ } keys %reqs_for_group
};
print "Including all optional deps\n";
$reqs->{test_requires} = {
%{$reqs->{test_requires}},
%$opt_testdeps
};
}
# nasty hook into both M::AI init and the prompter, so that the optdep message
# comes at the right places (on top and then right above the prompt)
{
no warnings 'redefine';
no strict 'refs';
for (qw/_prompt import/) {
my $meth = "Module::AutoInstall::$_";
my $orig = \&{$meth};
*{$meth} = sub {
print $optdep_msg;
goto $orig;
};
}
}
# this will run after the Makefile is written and the main Makefile.PL terminates
#
END {
# shit already hit the fan
return if $?;
# Re-write META.yml at the end to _exclude_ all forced build-requires (we do not
# want to ship this) We are also not using M::I::AuthorRequires as this will be
# an extra dep, and deps in Makefile.PL still suck
# Also always test the result so we stop shipping borked dependency lists to CPAN
# FIXME test_requires is not yet part of META
my %original_build_requires = ( %$build_requires, %$test_requires );
my @all_build_requires = @{delete Meta->{values}{build_requires}||[]};
my %removed_build_requires;
for (@all_build_requires) {
if ($original_build_requires{$_->[0]}) {
push @{Meta->{values}{build_requires}}, $_;
}
else {
$removed_build_requires{$_->[0]} = $_->[1]
unless $_->[0] eq 'ExtUtils::MakeMaker';
}
}
if (keys %removed_build_requires) {
print "Regenerating META with author requires excluded\n";
# M::I understands unicode in meta but does not write with the right
# layers - fhtagn!!!
local $SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /Wide character in print/ };
Meta->write;
}
# strip possible crlf from META
if ($^O eq 'MSWin32' or $^O eq 'cygwin') {
local $ENV{PERLIO} = 'unix';
system( $^X, qw( -MExtUtils::Command -e dos2unix -- META.yml), );
}
# test that we really took things away (just in case, happened twice somehow)
if (! -f 'META.yml') {
warn "No META.yml generated?! aborting...\n";
unlink 'Makefile';
exit 1;
}
my $meta = do { local @ARGV = 'META.yml'; local $/; <> };
$meta =~ /^\Qname: DBIx-Class\E$/m or do {
warn "Seemingly malformed META.yml...?\n";
unlink 'Makefile';
exit 1;
};
# this is safe as there is a fatal check earlier in the main Makefile.PL
# to make sure there are no duplicates (i.e. $opt_testdeps does not contain
# any real dependencies)
my @illegal_leftovers = grep
{ $meta =~ /^ \s+ \Q$_\E \: \s+ /mx }
( sort keys %$opt_testdeps )
;
if (@illegal_leftovers) {
warn join ("\n",
"\n\nFATAL FAIL! It looks like some author dependencies made it to the META.yml:\n",
map { "\t$_" } @illegal_leftovers
) . "\n\n";
unlink 'Makefile';
exit 1;
}
}
# keep the Makefile.PL eval happy
1;