Module::Install::TestTargets is cool *hack*. But it's code is too complex and the code using it is not maintainable.
So here is yet another approach for this issue using Daiku.
↓Makefile using Daiku and other ExUtils::* modules.
use Daiku;
use autodie ':all';
use ExtUtils::InstallPaths;
use CPAN::Meta ();
use File::Find::Rule ();
use File::Spec::Functions qw/catfile catdir rel2abs/;
use ExtUtils::Helpers 0.007 qw/make_executable split_like_shell build_script manify man1_pagename man3_pagename/;
use ExtUtils::Install qw/pm_to_blib install/;
sub load_meta {
my ($metafile) = grep { -e $_ } qw/META.json META.yml/ or die "No META information provided\n";
return CPAN::Meta->load_file($metafile);
}
my @MODULES = File::Find::Rule::find(file => name => [qw/*.pm *.pod/], in => 'lib');
my @SCRIPTS = File::Find::Rule::find(file => name => '*', in => 'script');
task 'all' => ['build'];
task 'init' => ['Makefile'] => sub {
0
};
task 'build' => [@MODULES, @SCRIPTS] => sub {
my %opt;
pm_to_blib({ map { $_ => catfile('blib', $_) } @MODULES, @SCRIPTS }, catdir(qw/blib lib auto/));
make_executable($_) for File::Find::Rule::find(file => in => catdir(qw/blib script/));
manify($_, catdir('blib', 'bindoc', man1_pagename($_)), 1, \%opt) for @SCRIPTS;
manify($_, catdir('blib', 'libdoc', man3_pagename($_)), 3, \%opt) for @MODULES;
chmod +(stat $_)[2] & ~0222, $_ for map { catfile('blib', $_) } @SCRIPTS, @MODULES;
};
task 'install' => ['build'] => sub {
my %opt;
my $meta = load_meta();
my $paths = ExtUtils::InstallPaths->new(%opt, dist_name => $meta->name);
install($paths->install_map, @opt{'verbose', 'dry_run', 'uninst'});
};
# silly hack
file 'Makefile' => ['Makefile.PL'] => sub {
open my $fh, '>', 'Makefile';
for (qw/all test clean install/) {
print {$fh} "$_:\n"
. "\t$^X $0 $_\n\n";
}
close $fh;
};
task 'clean' => sub {
for (qw/Makefile/) {
unlink $_ if -f $_
}
};
task 'test' => ['build'] => sub {
system 'prove -Ilib t/';
};
build(shift @ARGV || 'init');
↓META.json describes dependencies.
{
"resources" : {
"license" : "http://dev.perl.org/licenses/"
},
"no_index" : {
"directory" : [
"inc",
"t",
"xt"
]
},
"meta-spec" : {
"version" : "1.4",
"url" : "http://module-build.sourceforge.net/META-spec-v1.4.html"
},
"distribution_type" : "module",
"version" : "0.01",
"name" : "example",
"author" : [
"Tokuhiro Matsuno <tokuhirom AAJKLFJEF GMAIL COM>"
],
"license" : "perl",
"build_requires" : {
"Test::More" : "0.96",
"ExtUtils::MakeMaker" : "6.42"
},
"requires" : {
"perl" : "5.8.1",
"Mouse" : "0.92"
},
"abstract" : "Make for Perl",
"configure_requires" : {
"ExtUtils::MakeMaker" : "6.42",
"Daiku" : "0.03",
"CPAN::Meta" : 0,
"ExtUtils::Helpers" : "0.007",
"ExtUtils::Install" : 0,
"ExtUtils::InstallPaths" : "0.002",
"File::Find::Rule" : 0,
"File::Slurp" : 0,
"File::Spec::Functions" : 0,
"Getopt::Long" : 0,
"JSON" : "2"
}
}
I think this approach is very useful to development your own application, is not deploying to CPAN.