Bio::Root
Build
Toolbar
Summary
Bio::Root::Build - A common Module::Build subclass base for BioPerl distributions
Package variables
No package variables defined.
Synopsis
Description
This is a subclass of Module::Build so we can override certain methods and do
fancy stuff
It was first written against Module::Build::Base v0.2805. Many of the methods
here are copy/pasted from there in their entirety just to change one or two
minor things, since for the most part Module::Build::Base code is hard to
cleanly override.
Methods
| BEGIN | | Code |
| find_pm_files | No description | Code |
| choose_scripts | No description | Code |
| script_files | No description | Code |
| process_script_files | No description | Code |
| features | No description | Code |
| check_autofeatures | No description | Code |
| check_installed_status | No description | Code |
| prereq_failures | No description | Code |
| install_prereq | No description | Code |
| install_required | No description | Code |
| install_optional | No description | Code |
| under_cpan | No description | Code |
| prompt | No description | Code |
| find_dist_packages | No description | Code |
| _parse_conditions | No description | Code |
| prepare_metadata | No description | Code |
| _construct | No description | Code |
| write_config | No description | Code |
| add_to_manifest_skip | No description | Code |
| ACTION_manifest | No description | Code |
| _write_default_maniskip | No description | Code |
| ACTION_install | No description | Code |
| add_post_install_script | No description | Code |
| run_post_install_scripts | No description | Code |
| test_internet | No description | Code |
| dist_dir | No description | Code |
| ppm_name | No description | Code |
| ACTION_ppd | No description | Code |
| htmlify_pods | No description | Code |
| ACTION_ppmdist | No description | Code |
| install_types | No description | Code |
| make_ppd | No description | Code |
| ACTION_dist | No description | Code |
| make_zip | No description | Code |
| prompt_for_network | No description | Code |
Methods description
None available.
Methods code
BEGIN { eval "use base Module::Build; 1" or die "This package requires Module::Build v0.2805 or greater to install itself.\n$@";
use Cwd;
use lib Cwd::cwd(); } |
| find_pm_files | description | prev | next | Top |
sub find_pm_files
{ my $self = shift;
foreach my $pm (@{$self->rscan_dir('Bio', qr/\.pm$/)}) { $self->{properties}{pm_files}->{$pm} = File::Spec->catfile('lib', $pm); }
$self->_find_file_by_type('pm', 'lib');
}
} |
sub choose_scripts
{ my $self = shift;
my $accept = shift;
opendir(my $scripts_dir, 'scripts') or die "Can't open directory 'scripts': $!\n";
my $int_ok = 0;
my @group_dirs;
while (my $thing = readdir($scripts_dir)) {
next if $thing =~ /^\./;
next if $thing eq 'CVS';
if ($thing =~ /PLS$|pl$/) {
$int_ok = 0;
last;
}
$thing = File::Spec->catfile('scripts', $thing);
if (-d $thing) {
$int_ok = 1;
push(@group_dirs, $thing);
}
}
closedir($scripts_dir);
my $question = $int_ok ? "Install [a]ll BioPerl scripts, [n]one, or choose groups [i]nteractively?" : "Install [a]ll BioPerl scripts or [n]one?";
my $prompt = $accept ? 'a' : $self->prompt($question, 'a');
if ($prompt =~ /^[aA]/) {
$self->log_info(" - will install all scripts\n");
$self->notes(chosen_scripts => 'all');
}
elsif ($prompt =~ /^[iI]/) {
$self->log_info(" - will install interactively:\n");
my @chosen_scripts;
foreach my $group_dir (@group_dirs) {
my $group = File::Basename::basename($group_dir);
print " * group '$group' has:\n";
my @script_files = @{$self->rscan_dir($group_dir, qr/\.PLS$|\.pl$/)}; foreach my $script_file (@script_files) {
my $script = File::Basename::basename($script_file);
print " $script\n";
}
my $result = $self->prompt(" Install scripts for group '$group'? [y]es [n]o [q]uit", 'n');
die if $result =~ /^[qQ]/;
if ($result =~ /^[yY]/) {
$self->log_info(" + will install group '$group'\n");
push(@chosen_scripts, @script_files);
}
else {
$self->log_info(" - will not install group '$group'\n");
}
}
my $chosen_scripts = @chosen_scripts ? join("|", @chosen_scripts) : 'none';
$self->notes(chosen_scripts => $chosen_scripts);
}
else {
$self->log_info(" - won't install any scripts\n");
$self->notes(chosen_scripts => 'none');
}
print "\n";
}
} |
sub script_files
{ my $self = shift;
unless (-d 'scripts') {
return {};
}
my $chosen_scripts = $self->notes('chosen_scripts');
if ($chosen_scripts) {
return if $chosen_scripts eq 'none';
return { map {$_, 1} split(/\|/, $chosen_scripts) } unless $chosen_scripts eq 'all';
}
return $_ = { map {$_,1} @{$self->rscan_dir('scripts', qr/\.PLS$|\.pl$/)} }; }
} |
sub process_script_files
{ my $self = shift;
my $files = $self->find_script_files;
return unless keys %$files;
my $script_dir = File::Spec->catdir($self->blib, 'script');
File::Path::mkpath( $script_dir );
foreach my $file (keys %$files) {
my $result = $self->copy_if_modified($file, $script_dir, 'flatten') or next;
$self->fix_shebang_line($result) unless $self->os_type eq 'VMS';
$self->make_executable($result);
my $final = File::Basename::basename($result);
$final =~ s/\.PLS$/\.pl/; $final =~ s/^/bp_/ unless $final =~ /^bp/; $final = File::Spec->catfile($script_dir, $final);
if (-e $final) {
unlink $final || warn "[WARNING] Deleting '$final' failed!\n";
}
File::Copy::move($result, $final) or die "Can't rename '$result' to '$final': $!";
}
}
} |
sub features
{ my $self = shift;
my $ph = $self->{phash};
if (@_) {
my $key = shift;
if ($ph->{features}->exists($key)) {
return $ph->{features}->access($key, @_);
}
if (my $info = $ph->{auto_features}->access($key)) {
my $failures = $self->prereq_failures($info);
my $disabled = grep( /^(?:\w+_)?(?:$checking_types)$/, keys %$failures ) ? 1 : 0;
return !$disabled;
}
return $ph->{features}->access($key, @_);
}
my %features;
my %auto_features = $ph->{auto_features}->access();
while (my ($name, $info) = each %auto_features) {
my $failures = $self->prereq_failures($info);
my $disabled = grep( /^(?:\w+_)?(?:$checking_types)$/, keys %$failures ) ? 1 : 0;
$features{$name} = $disabled ? 0 : 1;
}
%features = (%features, $ph->{features}->access());
return wantarray ? %features :\% features;
}
*feature =\& features;
} |
sub check_autofeatures
{ my ($self) = @_;
my $features = $self->auto_features;
return unless %$features;
$self->log_info("Checking features:\n");
my $max_name_len = 0; $max_name_len = ( length($_) > $max_name_len ) ? length($_) : $max_name_len for keys %$features;
while (my ($name, $info) = each %$features) {
$self->log_info(" $name" . '.' x ($max_name_len - length($name) + 4));
if ($name eq 'PL_files') {
print "got $name => $info\n";
print "info has:\n";
while (my ($key, $val) = each %$info) {
print " $key => $val\n";
}
}
if ( my $failures = $self->prereq_failures($info) ) {
my $disabled = grep( /^(?:\w+_)?(?:$checking_types)$/, keys %$failures ) ? 1 : 0;
$self->log_info( $disabled ? "disabled\n" : "enabled\n" );
my $log_text;
while (my ($type, $prereqs) = each %$failures) {
while (my ($module, $status) = each %$prereqs) {
my $required = ($type =~ /^(?:\w+_)?(?:requires|conflicts)$/) ? 1 : 0;
my $prefix = ($required) ? '-' : '*';
$log_text .= " $prefix $status->{message}\n";
}
}
$self->log_warn($log_text) if $log_text && ! $self->quiet;
}
else {
$self->log_info("enabled\n");
}
}
$self->log_info("\n");
}
} |
sub check_installed_status
{ my $self = shift;
open (my $olderr, ">&". fileno(STDERR));
open(STDERR, "/dev/null");
my $return = $self->SUPER::check_installed_status(@_);
open(STDERR, ">&". fileno($olderr));
return $return;
}
} |
sub prereq_failures
{ my ($self, $info) = @_;
my @types = (@{ $self->prereq_action_types }, @extra_types);
$info ||= {map {$_, $self->$_()} @types};
my $out = {};
foreach my $type (@types) {
my $prereqs = $info->{$type} || next;
my $status = {};
if ($type eq 'test') {
unless (keys %$out) {
if (ref($prereqs) eq 'CODE') {
$status->{message} = &{$prereqs};
$info->{$type} = $status->{message};
}
else {
$status->{message} = $prereqs;
}
$out->{$type}{'test'} = $status if $status->{message};
}
}
elsif ($type eq 'options') {
my @not_ok;
foreach my $wanted_option (@{$prereqs}) {
unless ($self->args($wanted_option)) {
push(@not_ok, $wanted_option);
}
}
if (@not_ok > 0) {
$status->{message} = "Command line option(s) '@not_ok' not supplied";
$out->{$type}{'options'} = $status;
}
}
elsif ($type eq 'excludes_os') {
foreach my $os (@{$prereqs}) {
if ($^O =~ /$os/i) {
$status->{message} = "This feature isn't supported under your OS ($os)";
$out->{$type}{'excludes_os'} = $status;
last;
}
}
}
else {
while ( my ($modname, $spec) = each %$prereqs ) {
$status = $self->check_installed_status($modname, $spec);
if ($type =~ /^(?:\w+_)?conflicts$/) {
next if !$status->{ok};
$status->{conflicts} = delete $status->{need};
$status->{message} = "$modname ($status->{have}) conflicts with this distribution";
}
elsif ($type =~ /^(?:\w+_)?recommends$/) {
next if $status->{ok};
my ($preferred_version, $why, $by_what) = split("/", $spec);
$by_what = join(", ", split(",", $by_what));
$by_what =~ s/, (\S+)$/ and $1/;
$status->{message} = (!ref($status->{have}) && $status->{have} eq '<none>'
? "Optional prerequisite $modname is not installed"
: "$modname ($status->{have}) is installed, but we prefer to have $preferred_version");
$status->{message} .= "\n (wanted for $why, used by $by_what)";
if ($by_what =~ /\[circular dependency!\]/) {
$preferred_version = -1;
}
my $installed = $self->install_optional($modname, $preferred_version, $status->{message});
next if $installed eq 'ok';
$status->{message} = $installed unless $installed eq 'skip';
}
elsif ($type =~ /^feature_requires/) {
next if $status->{ok};
delete $info->{test};
}
else {
next if $status->{ok};
my $installed = $self->install_required($modname, $spec, $status->{message});
next if $installed eq 'ok';
$status->{message} = $installed;
}
$out->{$type}{$modname} = $status;
}
}
}
return keys %{$out} ? $out : return;
}
} |
sub install_prereq
{ my ($self, $desired, $version, $required) = @_;
if ($self->under_cpan) {
$self->{properties}{requires}->{$desired} = $version;
$self->log_info(" I'll get CPAN to prepend the installation of this\n");
return 'ok';
}
else {
my $question = $required ? "$desired is absolutely required prior to installation: shall I install it now using a CPAN shell?" :
"To install $desired I'll need to open a CPAN shell right now; is that OK?";
my $do_install = $self->y_n($question.' y/n', 'y');
if ($do_install) {
require Cwd;
require CPAN;
my $cwd = Cwd::cwd();
CPAN::Shell->install($desired);
my $msg;
my $expanded = CPAN::Shell->expand("Module", $desired);
if ($expanded && $expanded->uptodate) {
$self->log_info("\n\n*** (back in BioPerl Build.PL) ***\n * You chose to install $desired and it installed fine\n");
$msg = 'ok';
}
else {
$self->log_info("\n\n*** (back in BioPerl Build.PL) ***\n");
$msg = "You chose to install $desired but it failed to install";
}
chdir $cwd or die "Cannot chdir() back to $cwd: $!";
return $msg;
}
else {
return $required ? "You chose not to install the REQUIRED module $desired: you'd better install it yourself manually!" :
"Even though you wanted the optional module $desired, you chose not to actually install it: do it yourself manually.";
}
}
}
} |
sub install_required
{ my ($self, $desired, $version, $msg) = @_;
$self->log_info(" - ERROR: $msg\n");
return $self->install_prereq($desired, $version, 1);
}
} |
sub install_optional
{ my ($self, $desired, $version, $msg) = @_;
unless (defined $self->{ask_optional}) {
$self->{ask_optional} = $self->args->{accept}
? 'n' : $self->prompt("Install [a]ll optional external modules, [n]one, or choose [i]nteractively?", 'n');
}
return 'skip' if $self->{ask_optional} =~ /^n/i;
my $install;
if ($self->{ask_optional} =~ /^a/i) {
$self->log_info(" * $msg\n");
$install = 1;
}
else {
$install = $self->y_n(" * $msg\n Do you want to install it? y/n", 'n');
}
my $orig_version = $version;
$version = 0 if $version == -1;
if ($install && ! ($self->{ask_optional} =~ /^a/i && $orig_version == -1)) {
return $self->install_prereq($desired, $version);
}
else {
my $circular = ($self->{ask_optional} =~ /^a/i && $orig_version == -1) ? " - this is a circular dependency so doesn't get installed when installing 'all' modules. If you really want it, choose modules interactively." : '';
$self->log_info(" * You chose not to install $desired$circular\n");
return 'ok';
}
}
} |
sub under_cpan
{ my $self = shift;
unless (defined $self->{under_cpan}) {
my $cpan_env = $ENV{PERl5_CPAN_IS_RUNNING};
if ($ENV{PERL5_CPANPLUS_IS_RUNNING}) {
$self->{under_cpan} = $cpan_env ? 'CPAN' : 'CPANPLUS';
}
require CPAN;
unless (defined $self->{under_cpan}) {
if ($CPAN::VERSION > '1.89') {
if ($cpan_env) {
$self->{under_cpan} = 'CPAN';
}
else {
$self->{under_cpan} = 0;
}
}
}
unless (defined $self->{under_cpan}) {
if ($CPAN::HandleConfig::VERSION) {
CPAN::HandleConfig->load;
}
else {
CPAN::Config->load;
}
my $lock = File::Spec->catfile($CPAN::Config->{cpan_home}, '.lock');
if (-f $lock) {
my $cwd = File::Spec->canonpath(Cwd::cwd());
my $cpan = File::Spec->canonpath($CPAN::Config->{cpan_home});
$self->{under_cpan} = index($cwd, $cpan) > -1;
}
}
if ($self->{under_cpan}) {
$self->log_info("(I think I'm being run by CPAN/CPANPLUS, so will rely on it to handle prerequisite installation)\n");
}
else {
$self->log_info("(I think you ran Build.PL directly, so will use CPAN to install prerequisites on demand)\n");
$self->{under_cpan} = 0;
}
}
return $self->{under_cpan};
}
} |
sub prompt
{ my $self = shift;
my $mess = shift or die "prompt() called without a prompt message";
my $def;
if ( $self->_is_unattended && !@_ ) {
die <<EOF; ERROR: This build seems to be unattended, but there is no default value for this question. Aborting. EOF }
$def = shift if @_;
($def, my $dispdef) = defined $def ? ($def, "[$def] ") : ('', ' ');
local $|=1;
print "$mess $dispdef";
my $ans = $self->_readline();
if ( !defined($ans) or !length($ans) ) { $ans = $def;
}
return $ans;
}
} |
sub find_dist_packages
{ my $self = shift;
my $manifest = $self->_read_manifest('MANIFEST') or die "Can't find dist packages without a MANIFEST file - run 'manifest' action first";
my %dist_files = map { $self->localize_file_path($_) => $_ } keys %$manifest;
my @pm_files = grep {exists $dist_files{$_}} keys %{ $self->find_pm_files };
my $actual_version = $self->dist_version;
my( %prime, %alt );
foreach my $file (@pm_files) {
next if $dist_files{$file} =~ m{^t/};
my @path = split( /\//, $dist_files{$file} );
(my $prime_package = join( '::', @path[1..$#path] )) =~ s/\.pm$//;
my $pm_info = Module::Build::ModuleInfo->new_from_file( $file );
foreach my $package ( $pm_info->packages_inside ) {
next if $package eq 'main'; next if grep /^_/, split( /::/, $package );
my $version = $pm_info->version( $package );
if ($version && $version != $actual_version) {
$self->log_warn("Package $package had version $version!\n");
}
$version = $actual_version;
if ( $package eq $prime_package ) {
if ( exists( $prime{$package} ) ) {
die "Unexpected conflict in '$package'; multiple versions found.\n";
}
else {
$prime{$package}{file} = $dist_files{$file};
$prime{$package}{version} = $version if defined( $version );
}
}
else {
push( @{$alt{$package}}, { file => $dist_files{$file}, version => $version } );
}
}
}
foreach my $package ( keys( %alt ) ) {
my $result = $self->_resolve_module_versions( $alt{$package} );
if ( exists( $prime{$package} ) ) { if ( $result->{err} ) {
$self->log_warn("Found conflicting versions for package '$package'\n" .
" $prime{$package}{file} ($prime{$package}{version})\n" . $result->{err});
}
elsif ( defined( $result->{version} ) ) {
if ( exists( $prime{$package}{version} ) && defined( $prime{$package}{version} ) ) {
if ( $self->compare_versions( $prime{$package}{version}, '!=', $result->{version} ) ) {
$self->log_warn("Found conflicting versions for package '$package'\n" .
" $prime{$package}{file} ($prime{$package}{version})\n" .
" $result->{file} ($result->{version})\n");
}
}
else {
$prime{$package}{file} = $result->{file};
$prime{$package}{version} = $result->{version};
}
}
else {
}
}
else { if ( $result->{err} ) {
$self->log_warn("Found conflicting versions for package '$package'\n" . $result->{err});
}
$prime{$package}{file} = $result->{file};
$prime{$package}{version} = $result->{version} if defined( $result->{version} );
}
}
for (grep exists $_->{version}, values %prime) {
$_->{version} = $_->{version}->stringify if ref($_->{version});
}
return\% prime;
}
} |
sub _parse_conditions
{ my ($self, $spec) = @_;
($spec) = split("/", $spec);
if ($spec =~ /^\s*([\w.]+)\s*$/) { return (">= $spec");
}
else {
return split /\s*,\s*/, $spec;
}
}
} |
sub prepare_metadata
{ my ($self, $node, $keys) = @_;
my $p = $self->{properties};
my $add_node = sub {
my ($name, $val) = @_;
$node->{$name} = $val;
push @$keys, $name if $keys;
};
foreach (qw(dist_name dist_version dist_author dist_abstract license)) {
(my $name = $_) =~ s/^dist_//;
$add_node->($name, $self->$_());
die "ERROR: Missing required field '$_' for META.yml\n" unless defined($node->{$name}) && length($node->{$name});
}
$node->{version} = '' . $node->{version};
if (defined( $self->license ) && defined( my $url = $self->valid_licenses->{ $self->license } )) {
$node->{resources}{license} = $url;
}
foreach ( @{$self->prereq_action_types} ) {
if (exists $p->{$_} and keys %{ $p->{$_} }) {
if ($_ eq 'recommends') {
my $hash;
while (my ($req, $val) = each %{ $p->{$_} }) {
my ($ver, $why, $mods) = split("/", $val);
for my $used_by (split ',',$mods) {
$used_by =~ s{^(\S+)\s.*$}{$1};
if (exists $hash->{$used_by}) {
push @{$hash->{$used_by}->{requires}}, {$req => $ver};
} else {
$hash->{$used_by} = {description => $why,
requires => [{$req => $ver}]};
}
}
}
$add_node->('optional_features', $hash);
}
else {
$add_node->($_, $p->{$_});
}
}
}
if (exists $p->{dynamic_config}) {
$add_node->('dynamic_config', $p->{dynamic_config});
}
my $pkgs = eval { $self->find_dist_packages };
if ($@) {
$self->log_warn("$@\nWARNING: Possible missing or corrupt 'MANIFEST' file.\n" . "Nothing to enter for 'provides' field in META.yml\n");
}
else {
$node->{provides} = $pkgs if %$pkgs;
};
if (exists $p->{no_index}) {
$add_node->('no_index', $p->{no_index});
}
$add_node->('generated_by', "Module::Build version $Module::Build::VERSION");
$add_node->('meta-spec',
{version => '1.2',
url => 'http://module-build.sourceforge.net/META-spec-v1.2.html',
});
while (my($k, $v) = each %{$self->meta_add}) {
$add_node->($k, $v);
}
while (my($k, $v) = each %{$self->meta_merge}) {
$self->_hash_merge($node, $k, $v);
}
return $node;
}
} |
sub _construct
{ my $self = shift;
my %in_hash = @_;
my $auto_features = $in_hash{auto_features} if defined $in_hash{auto_features};
my %code_refs;
if ($auto_features) {
while (my ($key, $hash) = each %{$auto_features}) {
while (my ($sub_key, $val) = each %{$hash}) {
if (ref($val) && ref($val) eq 'CODE') {
$hash->{$sub_key} = 'CODE_ref';
$code_refs{$key}->{$sub_key} = $val;
}
}
}
}
$self = $self->SUPER::_construct(@_);
my ($p, $ph) = ($self->{properties}, $self->{phash});
if (keys %code_refs) {
while (my ($key, $hash) = each %{$auto_features}) {
if (defined $code_refs{$key}) {
while (my ($sub_key, $code_ref) = each %{$code_refs{$key}}) {
$hash->{$sub_key} = $code_ref;
}
$ph->{auto_features}->{$key} = $hash;
}
}
}
foreach (qw(manifest_skip post_install_scripts)) {
my $file = File::Spec->catfile($self->config_dir, $_);
$ph->{$_} = Module::Build::Notes->new(file => $file);
$ph->{$_}->restore if -e $file;
}
return $self;} |
sub write_config
{ my $self = shift;
$self->SUPER::write_config;
$self->{phash}{$_}->write() foreach qw(manifest_skip post_install_scripts);
my $self_filename = File::Spec->catfile('Bio', 'Root', 'Build.pm');
-e $self_filename || return;
my $filename = File::Spec->catfile($self->{properties}{config_dir}, 'lib', 'Bio', 'Root', 'Build.pm');
my $filedir = File::Basename::dirname($filename);
File::Path::mkpath($filedir);
warn "Can't create directory $filedir: $!" unless -d $filedir;
File::Copy::copy($self_filename, $filename);
warn "Unable to copy 'Bio/Root/Build.pm' to '$filename'\n" unless -e $filename;
}
} |
sub add_to_manifest_skip
{ my $self = shift;
my %files = map {$self->localize_file_path($_), 1} @_;
$self->{phash}{manifest_skip}->write(\%files);
}
} |
sub ACTION_manifest
{ my ($self) = @_;
my $maniskip = 'MANIFEST.SKIP';
if ( -e 'MANIFEST' || -e $maniskip ) {
$self->log_warn("MANIFEST files already exist, will overwrite them\n");
unlink('MANIFEST');
unlink($maniskip);
}
$self->_write_default_maniskip($maniskip);
require ExtUtils::Manifest; local ($^W, $ExtUtils::Manifest::Quiet) = (0,1);
ExtUtils::Manifest::mkmanifest();
}
} |
sub _write_default_maniskip
{ my $self = shift;
$self->SUPER::_write_default_maniskip;
my @extra = keys %{$self->{phash}{manifest_skip}->read};
if (@extra) {
open(my $fh, '>>', 'MANIFEST.SKIP') or die "Could not open MANIFEST.SKIP file\n";
print $fh "\n# Avoid additional run-time generated things\n";
foreach my $line (@extra) {
print $fh $line, "\n";
}
close($fh);
}
}
} |
sub ACTION_install
{ my ($self) = @_;
require ExtUtils::Install;
$self->depends_on('build');
ExtUtils::Install::install($self->install_map, !$self->quiet, 0, $self->{args}{uninst}||0);
$self->run_post_install_scripts;} |
sub add_post_install_script
{ my $self = shift;
my %files = map {$self->localize_file_path($_), 1} @_;
$self->{phash}{post_install_scripts}->write(\%files);} |
sub run_post_install_scripts
{ my $self = shift;
my @scripts = keys %{$self->{phash}{post_install_scripts}->read};
foreach my $script (@scripts) {
$self->run_perl_script($script);
}
}
} |
sub test_internet
{ eval {require LWP::UserAgent;};
if ($@) {
return "LWP::UserAgent not installed";
}
my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->env_proxy;
my $response = $ua->get('http://search.cpan.org/');
unless ($response->is_success) {
return "Could not connect to the internet (http://search.cpan.org/)";
}
return;
}
} |
sub dist_dir
{ my ($self) = @_;
my $version = $self->dist_version;
if ($version =~ /^\d\.\d{6}\d$/) {
$version .= '00';
}
$version =~ s/00(\d)/$1./g;
$version =~ s/\.$//;
if (my ($minor, $rev) = $version =~ /^\d\.(\d)\.\d\.(\d+)$/) {
my $dev = ! ($minor % 2 == 0);
if ($rev == 100) {
my $replace = $dev ? "_$rev" : '';
$version =~ s/\.\d+$/$replace/;
}
elsif ($rev < 100) {
$rev = sprintf("%03d", $rev);
$version =~ s/\.\d+$/_$rev-RC/;
}
else {
$rev -= 100 unless $dev;
my $replace = $dev ? "_$rev" : ".$rev";
$version =~ s/\.\d+$/$replace/;
}
}
return "$self->{properties}{dist_name}-$version";} |
sub ppm_name
{ my $self = shift;
return $self->dist_dir.'-ppm';
}
} |
sub ACTION_ppd
{ my $self = shift;
my $file = $self->make_ppd(%{$self->{args}});
$self->add_to_cleanup($file);
$self->add_to_manifest_skip($file);
}
} |
sub htmlify_pods
{ my $self = shift;
$self->SUPER::htmlify_pods(@_);
$self->add_to_manifest_skip('pod2htm*');
}
} |
sub ACTION_ppmdist
{ my $self = shift;
my @types = $self->install_types(1);
$self->SUPER::ACTION_ppmdist(@_);
$self->install_types(0);
}
} |
sub install_types
{ my ($self, $no_libdoc) = @_;
$self->{no_libdoc} = $no_libdoc if defined $no_libdoc;
my @types = $self->SUPER::install_types;
if ($self->{no_libdoc}) {
my @altered_types;
foreach my $type (@types) {
push(@altered_types, $type) unless $type eq 'libdoc';
}
return @altered_types;
}
return @types;
}
} |
sub make_ppd
{ my ($self, %args) = @_;
require Module::Build::PPMMaker;
my $mbp = Module::Build::PPMMaker->new();
my %dist;
foreach my $info (qw(name author abstract version)) {
my $method = "dist_$info";
$dist{$info} = $self->$method() or die "Can't determine distribution's $info\n";
}
$dist{codebase} = $self->ppm_name.'.tar.gz';
$mbp->_simple_xml_escape($_) foreach $dist{abstract}, $dist{codebase}, @{$dist{author}};
my (undef, undef, undef, $mday, $mon, $year) = localtime();
$year += 1900;
$mon++;
my $date = "$year-$mon-$mday";
my $softpkg_version = $self->dist_dir;
$softpkg_version =~ s/^$dist{name}-//;
my ($bundle_name) = $dist{name} =~ /^.+-(.+)/;
$bundle_name ||= 'core';
$bundle_name =~ s/^(\w)/\U$1/;
my $bundle_dir = "Bundle-BioPerl-$bundle_name-$softpkg_version-ppm";
my $bundle_file = "$bundle_dir.tar.gz";
my $bundle_softpkg_name = "Bundle-BioPerl-$bundle_name";
$bundle_name = "Bundle::BioPerl::$bundle_name";
my $ppd = <<"PPD"; <SOFTPKG NAME=\"$dist{name}\" VERSION=\"$softpkg_version\" DATE=\"$date\"> <TITLE>$dist{name}</TITLE> <ABSTRACT>$dist{abstract}</ABSTRACT> @{[ join "\n", map " <AUTHOR>$_</AUTHOR>", @{$dist{author}} ]} <PROVIDE NAME=\"$dist{name}::\" VERSION=\"$dist{version}\"/> PPD
foreach my $pm (@{$self->rscan_dir('Bio', qr/\.pm$/)}) { # convert these filepaths to Module names $pm =~ s/\//::/g; $pm =~ s/\.pm//;
$ppd .= sprintf(<<'EOF', $pm, $dist{version});
<PROVIDE NAME="%s" VERSION="%s"/> EOF } # rest of softpkg $ppd .= <<"PPD"; <IMPLEMENTATION>
<ARCHITECTURE NAME=\"MSWin32-x86-multi-thread-5.8\"/> <CODEBASE HREF=\"$dist{codebase}\"/>
<REQUIRE NAME=\"$bundle_name\" VERSION=\"$dist{version}\"/> </IMPLEMENTATION>
</SOFTPKG> PPD # now a new softpkg for the bundle $ppd .= <<"PPD";
<SOFTPKG NAME=\"$bundle_softpkg_name\" VERSION=\"$softpkg_version\" DATE=\"$date\">
<TITLE>$bundle_name</TITLE> <ABSTRACT>Bundle of pre-requisites for $dist{name}</ABSTRACT>
@{[ join "\n", map " <AUTHOR>$_</AUTHOR>", @{$dist{author}} ]}
<PROVIDE NAME=\"$bundle_name\" VERSION=\"$dist{version}\"/> <IMPLEMENTATION> <ARCHITECTURE NAME=\"MSWin32-x86-multi-thread-5.8\"/>
<CODEBASE HREF=\"$bundle_file\"/> PPD # required section # we do both requires and recommends to make installation on Windows as # easy (mindless) as possible for my $type ('requires', 'recommends') { my $prereq = $self->$type; while (my ($modname, $version) = each %$prereq) {
next if $modname eq 'perl';
($version) = split("/", $version) if $version =~ /\//;
unless ($modname =~ /::/) {
$modname .= '::';
}
if ($modname eq 'Bio::Root::Version') {
$version = $dist{version};
}
$ppd .= sprintf(<<'EOF', $modname, $version || '');
<REQUIRE NAME="%s" VERSION="%s"/> EOF } } # footer $ppd .= <<'EOF'; </IMPLEMENTATION> </SOFTPKG>
EOF
my $ppd_file = "$dist{name}.ppd";
my $fh = IO::File->new(">$ppd_file") or die "Cannot write to $ppd_file: $!";
print $fh $ppd;
close $fh;
$self->delete_filetree($bundle_dir);
mkdir($bundle_dir) or die "Cannot create '$bundle_dir': $!";
$self->make_tarball($bundle_dir);
$self->delete_filetree($bundle_dir);
$self->add_to_cleanup($bundle_file);
$self->add_to_manifest_skip($bundle_file);
return $ppd_file;
}
} |
sub ACTION_dist
{ my ($self) = @_;
$self->depends_on('manifest');
$self->depends_on('distdir');
my $dist_dir = $self->dist_dir;
$self->make_zip($dist_dir);
$self->make_tarball($dist_dir);
$self->delete_filetree($dist_dir);
}
} |
sub make_zip
{ my ($self, $dir, $file) = @_;
$file ||= $dir;
$self->log_info("Creating $file.zip\n");
my $zip_flags = $self->verbose ? '-r' : '-rq';
$self->do_system($self->split_like_shell("zip"), $zip_flags, "$file.zip", $dir);
$self->log_info("Creating $file.bz2\n");
require Archive::Tar;
$Archive::Tar::DO_NOT_USE_PREFIX = 0;
my $files = $self->rscan_dir($dir);
Archive::Tar->create_archive("$file.tar", 0, @$files);
$self->do_system($self->split_like_shell("bzip2"), "-k", "$file.tar");
}
} |
| prompt_for_network | description | prev | next | Top |
sub prompt_for_network
{ my ($self, $accept) = @_;
my $proceed = $accept ? 0 : $self->y_n("Do you want to run tests that require connection to servers across the internet\n(likely to cause some failures)? y/n", 'n');
if ($proceed) {
$self->notes(network => 1);
$self->log_info(" - will run internet-requiring tests\n");
my $use_email = $self->y_n("Do you want to run tests requiring a valid email address? y/n",'n');
if ($use_email) {
my $address = $self->prompt("Enter email address:");
$self->notes(email => $address);
}
}
else {
$self->notes(network => 0);
$self->log_info(" - will not run internet-requiring tests\n");
}
}
1;} |
General documentation
User feedback is an integral part of the evolution of this and other
Bioperl modules. Send your comments and suggestions preferably to
the Bioperl mailing list. Your participation is much appreciated.
bioperl-l@bioperl.org - General discussion
http://bioperl.org/wiki/Mailing_lists - About the mailing lists
Please direct usage questions or support issues to the mailing list:
bioperl-l@bioperl.org
rather than to the module maintainer directly. Many experienced and
reponsive experts will be able look at the problem and quickly
address it. Please include a thorough description of the problem
with code and data examples if at all possible.
Report bugs to the Bioperl bug tracking system to help us keep track
of the bugs and their resolution. Bug reports can be submitted via
the web:
http://bugzilla.open-bio.org/
The rest of the documentation details each of the object methods.
Internal methods are usually preceded with a _