MANIFEST.SKIPを、最新のもの+自前のものにする

色々書きたいもの溜まってるけど、さっきやったExtUtilsに関する修正を書いてみる。


自前のMANIFEST.SKIPが無い場合、ExtUtils-Manifestに同梱されているものが使われる。で、自前のMANIFEST.SKIPを普通に作ってしまうと、ExtUtils-Manifestの方で更新されても追従できなくなってしまう。


そこで、MYの仕組みを使ってこういうの↓をMakefile.PLに書いた。

use File::Basename qw(dirname);

sub MY::dist_basics {
    my ( $self, @args ) = @_;
    my $dist_basics = $self->MM::dist_basics(@args);

    $dist_basics =~ s{^(manifest\s*:.*?)$}{$1 MANIFEST.SKIP}msx;

    ( my $format = <<'END_OF_DIST_BASICS') =~ s/^[ ]{4}/\t/gmsx;
MANIFEST.SKIP: %s/MANIFEST.SKIP
    cat $< > $@
    echo '# Avoid archives of this distribution' >> $@
    echo '^%s-' >> $@
END_OF_DIST_BASICS

    $dist_basics .= sprintf $format, dirname( $self->{MAKEMAKER} ),
      $self->{FULLEXT};

    return $dist_basics;
}

(ちなみに (my $str = '...') =~ s/^[ ]{4}/\t/gmsx は結構使う。タブ文字と空白文字は混乱の元なので、タブ文字は使わないことにしている)


これでMakefileが

manifest : MANIFEST.SKIP
        $(PERLRUN) "-MExtUtils::Manifest=mkmanifest" -e mkmanifest

MANIFEST.SKIP: /usr/local/lib/perl5/5.10.0/ExtUtils/MANIFEST.SKIP
        cat $< > $@
        echo '# Avoid archives of this distribution' >> $@
        echo '^MyApp-' >> $@

となるので、make manifestする度に最新のMANIFEST.SKIPに追従できる。