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 .= <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
LICENSE AND COPYRIGHT
Copyright 2010 Ævar Arnfjörð Bjarmason
This program is free software, you can redistribute it and/or modify it
under the same terms as Perl itself.