NAME
Dist::Zilla::Plugin::MakeMaker::Awesome - A more awesome MakeMaker
plugin for Dist::Zilla
DESCRIPTION
Dist::Zilla's MakeMaker plugin is limited, if you want to stray from the
marked path and do something that would normally be done in a "package
MY" section or otherwise run custom code in your Makefile.PL you're out
of luck.
This plugin is 100% compatable with Dist::Zilla::Plugin::MakeMaker, but
if you need something more complex you can just subclass it:
Then, in your dist.ini:
;; Replace [MakeMaker]
;[MakeMaker]
[MakeMaker::Awesome]
More complex use, adding a "package MY" section to your Makefile.PL:
In your dist.ini:
[=inc::MyDistMakeMaker / MyDistMakeMaker]
Then in your inc/MyDistMakeMaker.pm, real example from Hailo (which has
"[=inc::HailoMakeMaker / HailoMakeMaker]" in its dist.ini):
package inc::HailoMakeMaker;
use Moose;
extends 'Dist::Zilla::Plugin::MakeMaker::Awesome';
override _build_MakeFile_PL_template => sub {
my ($self) = @_;
my $template = super();
$template .= <<'TEMPLATE';
package MY;
sub test {
my $inherited = shift->SUPER::test(@_);
# Run tests with Moose and Mouse
$inherited =~ s/^test_dynamic :: pure_all\n\t(.*?)\n/test_dynamic :: pure_all\n\tANY_MOOSE=Mouse $1\n\tANY_MOOSE=Moose $1\n/m;
return $inherited;
}
TEMPLATE
return $template;
};
__PACKAGE__->meta->make_immutable;
Or maybe you're writing an XS distro and want to pass custom arguments
to "WriteMakefile()", here's an example of adding a "LIBS" argument in
re::engine::PCRE:
package inc::PCREMakeMaker;
use Moose;
extends 'Dist::Zilla::Plugin::MakeMaker::Awesome';
override _build_WriteMakefile_args => sub { +{
# Add LIBS => to WriteMakefile() args
%{ super() },
LIBS => [ '-lpcre' ],
} };
__PACKAGE__->meta->make_immutable;
And another example from re::engine::Plan9:
package inc::Plan9MakeMaker;
use Moose;
extends 'Dist::Zilla::Plugin::MakeMaker::Awesome';
override _build_WriteMakefile_args => sub {
my ($self) = @_;
our @DIR = qw(libutf libfmt libregexp);
our @OBJ = map { s/\.c$/.o/; $_ }
grep { ! /test/ }
glob "lib*/*.c";
return +{
%{ super() },
DIR => [ @DIR ],
INC => join(' ', map { "-I$_" } @DIR),
# This used to be '-shared lib*/*.o' but that doesn't work on Win32
LDDLFLAGS => "-shared @OBJ",
};
};
__PACKAGE__->meta->make_immutable;
If you have custom code in your ExtUtils::MakeMaker-based Makefile.PL
that Dist::Zilla can't replace via its default facilities you'll be able
replace it by using this module.
Even if your Makefile.PL isn't ExtUtils::MakeMaker-based you should be
able to override it. You'll just have to provide a new
"_build_MakeFile_PL_template".
OVERRIDE
These are the methods you can currently override in your custom inc/
module. The work that this module does is entirely done in small modular
methods that can be overriden in your subclass. Here are some of the
highlights:
_build_MakeFile_PL_template
Returns Text::Template string used to construct the Makefile.PL.
_build_WriteMakefile_args
A "HashRef" of arguments that'll be passed to ExtUtils::MakeMaker's
"WriteMakefile" function.
_build_WriteMakefile_dump
Takes the return value of "_build_WriteMakefile_args" and constructs a
Str that'll be included in the Makefile.PL by
"_build_MakeFile_PL_template".
test_dirs
exe_files
The test/bin/share dirs and exe_files. These'll all be passed to
/"_build_WriteMakefile_args" later.
_build_share_dir_block
An "ArrayRef[Str]" with two elements to be used by
"_build_MakeFile_PL_template". The first will declare your ShareDir and
the second will add a magic "package MY" section to install it. Deep
magic.
OTHER
The main entry point is "setup_installer" via the
Dist::Zilla::Role::InstallTool role. There are also other magic
Dist::Zilla roles, check the source for more info.
DIAGNOSTICS
attempt to add Makefile.PL multiple times
This error from Dist::Zilla means that you've used both
"[MakeMaker]" and "[MakeMaker::Awesome]". You've either included
"MakeMaker" directly in dist.ini, or you have plugin bundle that
includes it. See @Filter for how to filter it out.
BUGS
This plugin would suck less if Dist::Zilla didn't use a INI-based config
system so you could add a stuff like this in your main configuration
file like you can with Module::Install.
The .ini file format can only support key-value pairs whereas any
complex use of ExtUtils::MakeMaker requires running custom Perl code and
passing complex data structures to "WriteMakefile".
AUTHOR
Ævar Arnfjörð Bjarmason <avar@cpan.org>
LICENSE AND COPYRIGHT
Copyright 2010 Ævar Arnfjörð Bjarmason <avar@cpan.org>
This program is free software, you can redistribute it and/or modify it
under the same terms as Perl itself.