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 : ''),
142 $self->SUPER::dist_test(@_),
143 "\n\n# --- Distar section:\n\n",
144 (map "$_ = $vars{$_}\n", sort keys %vars),
147 preflight: check-version check-manifest check-cpan-upload
148 $(ABSPERLRUN) Distar/helpers/preflight $(VERSION) --changelog=$(CHANGELOG) --branch=$(BRANCH)
150 $(ABSPERLRUN) Distar/helpers/check-version $(VERSION) $(TO_INST_PM) $(EXE_FILES)
152 $(ABSPERLRUN) Distar/helpers/check-manifest
154 $(NOECHO) cpan-upload -h $(DEV_NULL_STDOUT)
156 $(MAKE) disttest RELEASE_TESTING=1 PASTHRU="$(PASTHRU) TEST_FILES=\"$(TEST_FILES)\""
159 git commit -a -m "Release commit for $(VERSION)"
160 git tag v$(VERSION) -m "release v$(VERSION)"
161 $(RM_RF) $(DISTVNAME)
162 $(MAKE) $(DISTVNAME).tar$(SUFFIX)
163 $(NOECHO) $(MAKE) pushrelease FAKE_RELEASE=$(FAKE_RELEASE)
166 pushrelease$(FAKE_RELEASE) ::
167 cpan-upload $(DISTVNAME).tar$(SUFFIX)
168 git push origin v$(VERSION) HEAD
170 readmefile: create_distdir
171 $(NOECHO) $(MAKE) $(DISTVNAME)/README
172 $(DISTVNAME)/README: $(VERSION_FROM)
173 $(NOECHO) $(MKPATH) $(DISTVNAME)
174 pod2text $(VERSION_FROM) >$(DISTVNAME)/README
175 $(NOECHO) $(ABSPERLRUN) Distar/helpers/add-to-manifest -d $(DISTVNAME) README
176 disttest: distmanicheck
177 distmanicheck: create_distdir
178 cd $(DISTVNAME) && $(ABSPERLRUN) "-MExtUtils::Manifest=manicheck" -e "exit manicheck"
180 $(ABSPERLRUN) Distar/helpers/add-changelog-heading --git $(VERSION) $(CHANGELOG)
182 cd Distar && git pull
183 $(RM_F) $(FIRST_MAKEFILE)
186 map(sprintf(<<'END', "bump$_", ($_ || '$(V)')), @bump_targets),
188 $(ABSPERLRUN) Distar/helpers/bump-version --git $(VERSION) %s
189 $(RM_F) $(FIRST_MAKEFILE)
203 Distar - Additions to ExtUtils::MakeMaker for dist authors
209 use ExtUtils::MakeMaker;
210 (do 'maint/Makefile.PL.include' or die $@) unless -f 'META.yml';
214 F<maint/Makefile.PL.include>:
216 BEGIN { -e 'Distar' or system("git clone git://git.shadowcat.co.uk/p5sagit/Distar.git") }
217 use lib 'Distar/lib';
220 author 'A. U. Thor <author@cpan.org>';
222 manifest_include t => 'test-helper.pl';
223 manifest_include corpus => '.txt';
228 $ make bump # bump version
229 $ make bump V=2.000000 # bump to specific version
230 $ make bumpminor # bump minor version component
231 $ make bumpmajor # bump major version component
232 $ make nextrelease # add version heading to Changes file
233 $ make releasetest # build dist and test (with xt/ and RELEASE_TESTING=1)
234 $ make preflight # check that repo and file state is release ready
235 $ make release # check releasetest and preflight, then build and
236 # upload to CPAN, tag release, push tag and branch
240 L<ExtUtils::MakeMaker> works well enough as development tool for
241 builting and testing, but using it to release is annoying and error prone.
242 Distar adds just enough to L<ExtUtils::MakeMaker> for it to be a usable dist
243 author tool. This includes extra commands for releasing and safety checks, and
244 automatic generation of some files. It doesn't require any non-core modules and
245 is compatible with old versions of perl.
249 =head2 author( $author )
251 Set the author to include in generated META files. Can be a single entry, or
254 =head2 manifest_include( $dir, $pattern )
256 Add a pattern to include files in the MANIFEST file, and thus in the generated
259 The pattern can be either a regex, or a path suffix. It will be applied to the
260 full path past the directory specified.
262 The default files that are always included are: F<.pm> and F<.pod> files in
263 F<lib>, F<.t> files in F<t> and F<xt>, F<.pm> files in F<t/lib> and F<xt/lib>,
264 F<Changes>, F<MANIFEST>, F<README>, F<LICENSE>, F<META.yml>, and F<.PL> files in
265 the dist root, and all files in F<maint>.
267 =head1 AUTOGENERATED FILES
271 =item F<MANIFEST.SKIP>
273 The F<MANIFEST.SKIP> will be automatically generated to exclude any files not
274 explicitly allowed via C<manifest_include> or the included defaults. It will be
275 created (or updated) at C<perl Makefile.PL> time.
279 The F<README> file will be generated at dist generation time, inside the built
280 dist. It will be generated using C<pod2text> on the main module.
282 If a F<README> file exists in the repo, it will be used directly instead of
287 =head1 MAKE COMMMANDS
291 test will be adjusted to include F<xt/> tests by default. This will only apply
292 for authors, not users installing from CPAN.
296 Releases the dist. Before releasing, checks will be done on the dist using the
297 C<preflight> and C<releasetest> commands.
299 Releasing will generate a dist tarball and upload it to CPAN using cpan-upload.
300 It will also create a git tag for the release, and push the tag and branch.
304 If release is run with FAKE_RELEASE=1 set, it will skip uploading to CPAN and
305 pushing to git. A release commit will still be created and tagged locally.
309 Performs a number of checks on the files and repository, ensuring it is in a
310 sane state to do a release. The checks are:
314 =item * All version numbers match
316 =item * The F<MANIFEST> file is up to date
318 =item * The branch is correct
320 =item * There is no existing tag for the version
322 =item * There are no unmerged upstream changes
324 =item * There are no outstanding local changes
326 =item * There is an appropriate staged Changes heading
328 =item * cpan-upload is available
334 Test the dist preparing for a release. This generates a dist dir and runs the
335 tests from inside it. This ensures all appropriate files are included inside
336 the dist. C<RELEASE_TESTING> will be set in the environment.
340 Adds an appropriate changelog heading for the release, and prompts to stage the
345 Bumps the version number. This will try to preserve the length and format of
346 the version number. The least significant digit will be incremented.
348 Optionally accepts a C<V> option to set the version to a specific value.
350 The version changes will automatically be committed. Unstaged modifications to
351 the files will be left untouched.
355 Like bump, but increments the minor segment of the version. This will treat
356 numeric versions as x.yyyzzz format, incrementing the yyy segment.
360 Like bumpminor, but bumping the major segment.
364 Updates Distar and re-runs C<perl Makefile.PL>
368 IRC: #web-simple on irc.perl.org
370 Git repository: L<git://git.shadowcat.co.uk/p5sagit/Distar>
372 Git browser: L<http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=p5sagit/Distar.git;a=summary>
376 mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
380 haarg - Graham Knop (cpan:HAARG) <haarg@cpan.org>
382 ether = Karen Etheridge (cpan:ETHER) <ether@cpan.org>
384 frew - Arthur Axel "fREW" Schmidt (cpan:FREW) <frioux@gmail.com>
386 Mithaldu - Christian Walde (cpan:MITHALDU) <walde.christian@googlemail.com>
390 Copyright (c) 2011-2015 the Distar L</AUTHOR> and L</CONTRIBUTORS>
395 This library is free software and may be distributed under the same terms
396 as perl itself. See L<http://dev.perl.org/licenses/>.