3 use warnings FATAL => 'all';
5 use ExtUtils::MakeMaker ();
8 our $VERSION = '0.002000';
9 $VERSION = eval $VERSION;
11 my $MM_VER = eval $ExtUtils::MakeMaker::VERSION;
14 author manifest_include readme_generator
19 warnings->import(FATAL => 'all');
20 shift->export_to_level(1,@_);
37 '' => qr{Changes|MANIFEST|README|LICENSE|META\.yml},
38 'maint' => qr{[^.].*},
41 sub manifest_include {
45 sub readme_generator {
46 die "readme_generator unsupported" if @_ && $_[0];
49 sub write_manifest_skip {
51 my @files = @Manifest;
53 while (my ($dir, $spec) = splice(@files, 0, 2)) {
54 my $re = ($dir ? $dir.'/' : '').
55 ((ref($spec) eq 'Regexp')
59 # print ref as well as stringification in case of overload ""
60 : die "spec must be string or regexp, was: ${spec} (${\ref $spec})");
63 my $dist_name = $mm->{DISTNAME};
64 my $include = join '|', map "${_}\$", @parts;
65 my $final = "^(?:\Q$dist_name\E-v?[0-9_.]+/|(?!$include))";
66 open my $skip, '>', 'MANIFEST.SKIP'
67 or die "can't open MANIFEST.SKIP: $!";
68 print $skip "${final}\n";
75 @MM::ISA = (__PACKAGE__);
78 my ($class, $args) = @_;
79 return $class->SUPER::new({
81 MIN_PERL_VERSION => '5.006',
82 AUTHOR => ($MM_VER >= 6.5702 ? $Distar::Author : join(', ', @$Distar::Author)),
83 ABSTRACT_FROM => $args->{VERSION_FROM},
85 test => { TESTS => ($args->{test}{TESTS}||'t/*.t').' xt/*.t xt/*/*.t' },
86 realclean => { FILES => (
87 ($args->{realclean}{FILES}||'')
88 . ' Distar/ MANIFEST.SKIP MANIFEST MANIFEST.bak'
95 Distar::write_manifest_skip($self);
96 $self->SUPER::flush(@_);
101 my $targets = $self->SUPER::special_targets(@_);
102 my $phony_targets = join ' ', qw(
117 $targets =~ s/^(\.PHONY *:.*)/$1 $phony_targets/m;
125 if (open my $fh, '<', 'maint/Makefile.include') {
126 $include = "\n# --- Makefile.include:\n\n" . do { local $/; <$fh> };
127 $include =~ s/\n?\z/\n/;
131 grep { $include !~ /^bump$_(?: +\w+)*:/m } ('', 'minor', 'major');
134 REMAKE => join(' ', '$(PERLRUN)', 'Makefile.PL', map { $self->quote_literal($_) } @ARGV),
135 BRANCH => $self->{BRANCH} ||= 'master',
136 CHANGELOG => $self->{CHANGELOG} ||= 'Changes',
137 DEV_NULL_STDOUT => ($self->{DEV_NULL} ? '>'.File::Spec->devnull : ''),
141 $self->SUPER::dist_test(@_),
142 "\n\n# --- Distar section:\n\n",
143 (map "$_ = $vars{$_}\n", sort keys %vars),
146 preflight: check-version check-manifest check-cpan-upload
147 $(ABSPERLRUN) Distar/helpers/preflight $(VERSION) --changelog=$(CHANGELOG) --branch=$(BRANCH)
149 $(ABSPERLRUN) Distar/helpers/check-version $(VERSION) $(TO_INST_PM) $(EXE_FILES)
151 $(ABSPERLRUN) Distar/helpers/check-manifest
153 $(NOECHO) cpan-upload -h $(DEV_NULL_STDOUT)
155 $(MAKE) disttest RELEASE_TESTING=1 PASTHRU="$(PASTHRU) TEST_FILES=\"$(TEST_FILES)\""
156 release: preflight releasetest
157 $(RM_RF) $(DISTVNAME)
158 $(MAKE) $(DISTVNAME).tar$(SUFFIX)
159 git commit -a -m "Release commit for $(VERSION)"
160 git tag v$(VERSION) -m "release v$(VERSION)"
161 cpan-upload $(DISTVNAME).tar$(SUFFIX)
162 git push origin v$(VERSION) HEAD
164 readmefile: create_distdir
165 $(NOECHO) $(MAKE) $(DISTVNAME)/README
166 $(DISTVNAME)/README: $(VERSION_FROM)
167 $(NOECHO) $(MKPATH) $(DISTVNAME)
168 pod2text $(VERSION_FROM) >$(DISTVNAME)/README
169 $(NOECHO) cd $(DISTVNAME) && $(ABSPERLRUN) ../Distar/helpers/add-to-manifest README
170 disttest: distmanicheck
171 distmanicheck: create_distdir
172 cd $(DISTVNAME) && $(ABSPERLRUN) "-MExtUtils::Manifest=manicheck" -e "exit manicheck"
174 $(ABSPERLRUN) Distar/helpers/add-changelog-heading --git $(VERSION) $(CHANGELOG)
176 cd Distar && git pull
177 $(RM_F) $(FIRST_MAKEFILE)
180 map(sprintf(<<'END', "bump$_", ($_ || '$(V)')), @bump_targets),
182 $(ABSPERLRUN) Distar/helpers/bump-version --git $(VERSION) %s
183 $(RM_F) $(FIRST_MAKEFILE)
197 Distar - Additions to ExtUtils::MakeMaker for dist authors
203 use ExtUtils::MakeMaker;
204 (do 'maint/Makefile.PL.include' or die $@) unless -f 'META.yml';
208 F<maint/Makefile.PL.include>:
210 BEGIN { -e 'Distar' or system("git clone git://git.shadowcat.co.uk/p5sagit/Distar.git") }
211 use lib 'Distar/lib';
214 author 'A. U. Thor <author@cpan.org>';
216 manifest_include t => 'test-helper.pl';
217 manifest_include corpus => '.txt';
222 $ make bump # bump version
223 $ make bump V=2.000000 # bump to specific version
224 $ make bumpminor # bump minor version component
225 $ make bumpmajor # bump major version component
226 $ make nextrelease # add version heading to Changes file
227 $ make releasetest # build dist and test (with xt/ and RELEASE_TESTING=1)
228 $ make preflight # check that repo and file state is release ready
229 $ make release # check releasetest and preflight, then build and
230 # upload to CPAN, tag release, push tag and branch
234 L<ExtUtils::MakeMaker> works well enough as development tool for
235 builting and testing, but using it to release is annoying and error prone.
236 Distar adds just enough to L<ExtUtils::MakeMaker> for it to be a usable dist
237 author tool. This includes extra commands for releasing and safety checks, and
238 automatic generation of some files. It doesn't require any non-core modules and
239 is compatible with old versions of perl.
243 =head2 author( $author )
245 Set the author to include in generated META files. Can be a single entry, or
248 =head2 manifest_include( $dir, $pattern )
250 Add a pattern to include files in the MANIFEST file, and thus in the generated
253 The pattern can be either a regex, or a path suffix. It will be applied to the
254 full path past the directory specified.
256 The default files that are always included are: F<.pm> and F<.pod> files in
257 F<lib>, F<.t> files in F<t> and F<xt>, F<.pm> files in F<t/lib> and F<xt/lib>,
258 F<Changes>, F<MANIFEST>, F<README>, F<LICENSE>, F<META.yml>, and F<.PL> files in
259 the dist root, and all files in F<maint>.
261 =head1 AUTOGENERATED FILES
265 =item F<MANIFEST.SKIP>
267 The F<MANIFEST.SKIP> will be automatically generated to exclude any files not
268 explicitly allowed via C<manifest_include> or the included defaults. It will be
269 created (or updated) at C<perl Makefile.PL> time.
273 The F<README> file will be generated at dist generation time, inside the built
274 dist. It will be generated using C<pod2text> on the main module.
276 If a F<README> file exists in the repo, it will be used directly instead of
281 =head1 MAKE COMMMANDS
285 test will be adjusted to include F<xt/> tests by default. This will only apply
286 for authors, not users installing from CPAN.
290 Releases the dist. Before releasing, checks will be done on the dist using the
291 C<preflight> and C<releasetest> commands.
293 Releasing will generate a dist tarball and upload it to CPAN using cpan-upload.
294 It will also create a git tag for the release, and push the tag and branch.
298 Performs a number of checks on the files and repository, ensuring it is in a
299 sane state to do a release. The checks are:
303 =item * All version numbers match
305 =item * The F<MANIFEST> file is up to date
307 =item * The branch is correct
309 =item * There is no existing tag for the version
311 =item * There are no unmerged upstream changes
313 =item * There are no outstanding local changes
315 =item * There is an appropriate staged Changes heading
317 =item * cpan-upload is available
323 Test the dist preparing for a release. This generates a dist dir and runs the
324 tests from inside it. This ensures all appropriate files are included inside
325 the dist. C<RELEASE_TESTING> will be set in the environment.
329 Adds an appropriate changelog heading for the release, and prompts to stage the
334 Bumps the version number. This will try to preserve the length and format of
335 the version number. The least significant digit will be incremented.
337 Optionally accepts a C<V> option to set the version to a specific value.
339 The version changes will automatically be committed. Unstaged modifications to
340 the files will be left untouched.
344 Like bump, but increments the minor segment of the version. This will treat
345 numeric versions as x.yyyzzz format, incrementing the yyy segment.
349 Like bumpminor, but bumping the major segment.
353 Updates Distar and re-runs C<perl Makefile.PL>
357 IRC: #web-simple on irc.perl.org
359 Git repository: L<git://git.shadowcat.co.uk/p5sagit/Distar>
361 Git browser: L<http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=p5sagit/Distar.git;a=summary>
365 mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
369 haarg - Graham Knop (cpan:HAARG) <haarg@cpan.org>
371 ether = Karen Etheridge (cpan:ETHER) <ether@cpan.org>
373 frew - Arthur Axel "fREW" Schmidt (cpan:FREW) <frioux@gmail.com>
375 Mithaldu - Christian Walde (cpan:MITHALDU) <walde.christian@googlemail.com>
379 Copyright (c) 2011-2015 the Distar L</AUTHOR> and L</CONTRIBUTORS>
384 This library is free software and may be distributed under the same terms
385 as perl itself. See L<http://dev.perl.org/licenses/>.