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 bin_dirs share_dirs exe_files The test/bin/share dirs and exe_files. These'll all be passed to /"_build_WriteMakefile_args" later. dir_plugins Used for Dist::Zilla::Plugin::ShareDir support. Don't touch it if you don't need some deep ShareDir magic. _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. 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.