Just sharing some code to extend ExtUtils::MakeMaker.
I wanted two things: 1. apply the PM_FILTER on the EXE_FILES as well, 2. install a file in /etc.
After reading the documentation, looking at EU::MM source and numerous tries-and-errors, I ended up with the following sub which is, I think, generic enough to be reused by others:
sub MY::postamble {
my ($mm, %args) = @_;
my $postamble = "";
# apply the filter to the EXE_FILES as well
for my $exe (@{ $mm->{EXE_FILES} }) {
my $old_rule = '$(CP) '.$exe.' $(INST_SCRIPT)/'.$exe;
my $new_rule = '$(PM_FILTER) <'.$exe.' >$(INST_SCRIPT)/'.$exe;
for my $makeline (@{ $mm->{RESULT} }) {
$makeline =~ s/\Q$old_rule/$new_rule/;
}
}
# add testcover target if available
$postamble .= eval {
require ExtUtils::MakeMaker::Coverage;
ExtUtils::MakeMaker::Coverage::testcover();
} || "";
# install data files (in /etc, /usr/share, ...)
# first, we must add a target in install::
for my $makeline (@{ $mm->{RESULT} }) {
$makeline =~ s/(install *::.+)\n/$1 priv_data_files\n/;
}
# then, declare the target with the files
$postamble .= "\nINSTALL = install -D -p\n\npriv_data_files:\n";
for my $file (@{ $args{files} }) {
$postamble .= "\t\$(INSTALL) $file /$file\n";
}
return $postamble
}
The first code chunk is the part that applies the filter on the executables. I was afraid that replacing CP with the filter could have wrong consequences, so I have to read through the already rendered Makefile, stored in RESULT, in order to replace the good rules.
The second chunk manually add the testcover provided by Steve Peters' ExtUtils::MakeMaker::Coverage, as I'm redefining my own postamble().
The last chunk is the one that install generic data files. It expect files to have been passed to WriteMakefile() this way:
WriteMakefile(
...
postamble => { files => [ ... ] },
...
);
Unless I've missed something, such features are not directly available in EU::MM or in a CPAN module. Do you people think these could be useful as modules?