use warnings;
use Cwd ();
-use List::Util qw/reduce/;
+use List::Util qw<reduce>;
use File::Copy ();
use File::Path ();
use File::Spec;
use CPANPLUS::Error ();
-use base qw/CPANPLUS::Dist::Base/;
+use base qw<CPANPLUS::Dist::Base>;
use CPANPLUS::Dist::Gentoo::Atom;
use CPANPLUS::Dist::Gentoo::Guard;
=head1 VERSION
-Version 0.10
+Version 0.11
=cut
-our $VERSION = '0.10';
+our $VERSION = '0.11';
=head1 SYNOPSIS
+ # Using default values from your make.conf
+ cpan2dist --format=CPANPLUS::Dist::Gentoo --buildprereq Some::Module
+
+ # Specifying your own options
cpan2dist --format=CPANPLUS::Dist::Gentoo \
--dist-opts overlay=/usr/local/portage \
--dist-opts distdir=/usr/portage/distfiles \
--dist-opts manifest=yes \
--dist-opts keywords=x86 \
- --dist-opts header="# Copyright 1999-2008 Gentoo Foundation" \
+ --dist-opts header="# Begin" \
--dist-opts footer="# End" \
Any::Module You::Like
-=head1 DESCRPITON
+=head1 DESCRIPTION
-This module is a CPANPLUS backend that recursively generates Gentoo ebuilds for a given package in the specified overlay (defaults to F</usr/local/portage>), updates the manifest, and even emerges it (together with its dependencies) if the user requires it.
-You need write permissions on the directory where Gentoo fetches its source files (usually F</usr/portage/distfiles>).
-The valid C<KEYWORDS> for the generated ebuilds are by default those given in C<ACCEPT_KEYWORDS>, but you can specify your own with the C<keywords> dist-option.
+This module is a CPANPLUS backend that recursively generates Gentoo ebuilds for a given package in the default overlay, updates the manifest, and even emerges it (together with its dependencies) if the user requires it.
The generated ebuilds are placed into the C<perl-gcpanp> category.
They favour depending on a C<virtual>, on C<perl-core>, C<dev-perl> or C<perl-gcpan> (in that order) rather than C<perl-gcpanp>.
+Existing ebuilds will be searched into the main C<PORTDIR> portage tree and then into the overlays listed in C<PORTDIR_OVERLAY>.
-=head1 INSTALLATION
+=head1 OPTIONS
-Before installing this module, you should append C<perl-gcpanp> to your F</etc/portage/categories> file.
+You can pass specific options to L<cpan2dist> by using the C<--dist-opts> command-line argument followed by a C<key=value> pair, where C<key> is the option name and C<value> is what it is set to.
+C<--dist-opts> can be used several times.
-You have two ways for installing this module :
+The valid option C<key>s are :
=over 4
=item *
-Use the perl overlay located at L<http://git.overlays.gentoo.org/gitweb/?p=proj/perl-overlay.git>.
-It contains an ebuild for L<CPANPLUS::Dist::Gentoo>.
+C<manifest>
+
+A boolean that indicates whether the F<Manifest> file should be generated by running C<ebuild manifest> onto the generated ebuilds.
+
+Defaults to C<yes>.
=item *
-Bootstrap an ebuild for L<CPANPLUS::Dist::Gentoo> using itself.
-Note that if your Gentoo system C<perl> is C<5.8.x>, L<CPANPLUS> and its dependencies are not installed and not even available in the main portage tree.
-So you need to bootstrap them as well.
+C<overlay>
-First, fetch tarballs for L<CPANPLUS> and L<CPANPLUS::Dist::Gentoo> :
+The path of the overlay in which the generated ebuilds will be written.
- $ cd /tmp
- $ wget http://search.cpan.org/CPAN/authors/id/B/BI/BINGOS/CPANPLUS-0.9003.tar.gz
- $ wget http://search.cpan.org/CPAN/authors/id/V/VP/VPIT/CPANPLUS-Dist-Gentoo-0.10.tar.gz
+Defaults to the first overlay listed in C<PORTDIR_OVERLAY> (as returned by C<emerge --info>) or F</usr/local/portage> if this variable is empty.
-Log in as root and unpack them in e.g. your home directory :
+=item *
- # cd
- # tar xzf /tmp/CPANPLUS-0.9003.tar.gz
- # tar xzf /tmp/CPANPLUS-Dist-Gentoo-0.10.tar.gz
+C<distdir>
-Set up environment variables so that the toolchain is temporarily available :
+The directory where C<ebuild> expects to find the source tarballs.
+You need write permissions on this directory.
- # export OLDPATH=$PATH
- # export PATH=/root/CPANPLUS-0.9003/bin:$PATH
- # export PERL5LIB=/root/CPANPLUS-Dist-Gentoo-0.10/blib/lib:/root/CPANPLUS-0.9003/lib:/root/CPANPLUS-0.9003/inc/bundle
+Defaults to the value of C<DISTDIR> (as returned by C<emerge --info>) or F</usr/portage/distfiles> if this variable is empty.
-Make sure you don't have an old C<.cpanplus> configuration visible :
+=item *
- # [ -d /root/.cpanplus ] && mv /root/.cpanplus{,.bak}
+C<keywords>
-Bootstrap L<CPANPLUS> :
+The valid C<KEYWORDS> for the generated ebuilds.
- # cd /root/CPANPLUS-Dist-Gentoo-0.10
- # samples/g-cpanp CPANPLUS
+Defaults to the value of C<ACCEPT_KEYWORDS> (as returned by C<emerge --info>) or C<'x86'> if this variable is empty.
-Reset the environment :
+=item *
- # export PATH=$OLDPATH
- # unset PERL5LIB OLDPATH
+C<header>
-Emerge L<CPANPLUS> with the ebuilds you've just generated :
+A chunk of text that is prepended to every ebuild.
- # emerge -tv CPANPLUS
+Defaults to the generic Gentoo Foundation header.
+
+=item *
-As of september 2009, C<podlators> and C<ExtUtils-MakeMaker> may fail to emerge due to collisions.
-You can work around this by disabling the C<protect-owned> C<FEATURE> for them :
+C<footer>
+
+A chunk of text that is appended to every ebuild.
+
+Defaults to nothing.
+
+=back
- # FEATURES="-protect-owned" emerge podlators
- # FEATURES="-protect-owned" emerge ExtUtils-MakeMaker
+L<cpan2dist> itself takes other options, most notably :
-You may need to run each of these commands two times for them to succeed.
+=over 4
+
+=item *
+
+C<--buildprereq> generates an ebuild for every dependency, even for those that are already up-to-date.
+Setting this option is recommended.
+
+=item *
+
+C<--force> forcefully regenerates ebuilds even if they already exist.
+
+=item *
+
+C<--install> installs the ebuilds after generating them.
+
+=item *
+
+C<--skiptest> skips tests while building, which speeds up the building process.
+
+=item *
+
+C<--verbose> shows a lot more information.
+
+=back
-At this point, you can bootstrap L<CPANPLUS::Dist::Gentoo> using the system L<CPANPLUS> :
+Please refer to L<cpan2dist> documentation for a complete coverage of its abilities.
+
+=head1 INSTALLATION
+
+Before installing this module, you should append C<perl-gcpanp> to your F</etc/portage/categories> file.
+
+You have two ways for installing this module :
+
+=over 4
+
+=item *
+
+Use the perl overlay located at L<http://git.overlays.gentoo.org/gitweb/?p=proj/perl-overlay.git>.
+It contains an ebuild for L<CPANPLUS::Dist::Gentoo> which will most likely be up-to-date given the reactivity of Gentoo's Perl herd.
+
+=item *
+
+Bootstrap an ebuild for L<CPANPLUS::Dist::Gentoo> using itself.
+
+First, make sure your system C<perl> is C<5.10> or greater, so that the L<CPANPLUS> toolchain is available.
+
+ $ perl -v
+ This is perl 5, version 12, subversion 2 (v5.12.2)...
+
+C<perl> C<5.12> is the current stable Perl version in Gentoo.
+If you still have C<perl> C<5.8.x>, you can upgrade it by running the following commands as root :
+
+ # emerge -tv ">=dev-lang/perl-5.10"
+ # perl-cleaner --all
+
+Then, fetch the L<CPANPLUS::Dist::Gentoo> tarball :
+
+ $ cd /tmp
+ $ wget http://search.cpan.org/CPAN/authors/id/V/VP/VPIT/CPANPLUS-Dist-Gentoo-0.11.tar.gz
+
+Log in as root and unpack it in e.g. your home directory :
+
+ # cd
+ # tar xzf /tmp/CPANPLUS-Dist-Gentoo-0.11.tar.gz
+ # cd CPANPLUS-Dist-Gentoo-0.11
+
+Bootstrap L<CPANPLUS::Dist::Gentoo> using the bundled shell script C<g-cpanp> :
+
+ # perl Makefile.PL
+ # make
+ # PERL5LIB=blib/lib samples/g-cpanp CPANPLUS::Dist::Gentoo
+
+Finally, emerge the C<CPANPLUS-Dist-Gentoo> ebuild you've just generated :
- # PERL5LIB=/root/CPANPLUS-Dist-Gentoo-0.10/blib/lib samples/g-cpanp CPANPLUS::Dist::Gentoo
# emerge -tv CPANPLUS-Dist-Gentoo
=back
sub format_available {
return $format_available if defined $format_available;
- for my $prog (qw/emerge ebuild/) {
+ unless (IPC::Cmd->can_capture_buffer) {
+ my $msg = 'IPC::Cmd must be able to capture buffers.';
+ unless (do { local $@; eval { require IPC::Run; 1 } }) {
+ $msg .= ' Try installing IPC::Run (dev-perl/IPC-Run on Gentoo).';
+ }
+ __PACKAGE__->_abort($msg);
+ return $format_available = 0;
+ }
+
+ for my $prog (qw<emerge ebuild>) {
unless (IPC::Cmd::can_run($prog)) {
__PACKAGE__->_abort("$prog is required to write ebuilds");
return $format_available = 0;
}
}
- if (IPC::Cmd->can_capture_buffer) {
+ {
my $buffers;
my ($success, $errmsg) = IPC::Cmd::run(
- command => [ qw/emerge --info/ ],
+ command => [ qw<emerge --info> ],
verbose => 0,
buffer => \$buffers,
);
}
} else {
__PACKAGE__->_abort($errmsg);
+ return $format_available = 0;
}
}
my $stat = $self->status;
my $conf = $self->parent->parent->configure_object;
- $stat->mk_accessors(qw/name version author distribution desc uri src license
- meta min_perl
- fetched_arch
- requires configure_requires recursive_requires
- ebuild_name ebuild_version ebuild_dir ebuild_file
- portdir_overlay
- overlay distdir keywords do_manifest header footer
- force verbose/);
+ $stat->mk_accessors(qw<
+ name version author distribution desc uri src license
+ meta min_perl
+ fetched_arch
+ requires configure_requires recursive_requires
+ ebuild_name ebuild_version ebuild_dir ebuild_file
+ portdir_overlay overlay distdir keywords do_manifest header footer
+ force verbose
+ >);
$stat->force($conf->get_conf('force'));
$stat->verbose($conf->get_conf('verbose'));
$stat->footer($footer);
my $overlay = delete $opts{overlay};
- $overlay = (defined $overlay) ? Cwd::abs_path($overlay) : '/usr/local/portage';
+ if (defined $overlay) {
+ $overlay = Cwd::abs_path($overlay);
+ } else {
+ $overlay = $overlays->[0];
+ $overlay = '/usr/local/portage' unless defined $overlay;
+ }
$stat->overlay($overlay);
my $distdir = delete $opts{distdir};
my $extract_dir = $mod->status->extract;
- for my $name (qw/META.json META.yml/) {
+ for my $name (qw<META.json META.yml>) {
my $meta_file = File::Spec->catdir($extract_dir, $name);
next unless -e $meta_file;
my @portdirs = ($main_portdir, @{$self->status->portdir_overlay});
- for my $category (qw/virtual perl-core dev-perl perl-gcpan/, CATEGORY) {
+ for my $category (qw<virtual perl-core dev-perl perl-gcpan>, CATEGORY) {
my $name = ($category eq 'virtual' ? 'perl-' : '') . $name;
for my $portdir (@portdirs) {
=head1 COPYRIGHT & LICENSE
-Copyright 2008,2009,2010 Vincent Pit, all rights reserved.
+Copyright 2008,2009,2010,2011 Vincent Pit, all rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.