Re: [Module::Build] PERL_MM_USE_DEFAULT

[email protected] (Tyler MacDonald)
Newsgroups perl.cpan.discuss
Message-ID <[email protected]>
Randy W. Sims <[email protected]> wrote:
> >	This is a problem with CPAN.pm as well; if you try to do the initial
> >setup with PERL_MM_USE_DEFAULT=1, it loops forever on the "Select a mirror"
> >prompt. :-/ I've been meaning to discuss this more / submit a patch, but my
> >backlog has been insane lately...
> We can:
> 
> die "ERROR: This build script not safe for unattended installs. Please 
> notify @{[$self->dist_author]} that they wrote a bad bad Build.PL. 
> Please ask them to provide reasonable defaults or switch to the new 
> ask() method."
>   if $ENV{PERL_MM_USE_DEFAULT}
>   && (called_without_default(y_n) || called_without_default(prompt);

	Sure. What I really want though, is for CPAN.pm to be totally
automatable. If you want a good chuckle, check out the attached
hackety-hackety-hack I whipped together one afternoon to do an autobuild;
the scary thing is it actually works. <g>

	- Tyler
Deploy.PL (text/x-perl, 4.4 KB)
#!/usr/bin/perl

use strict;
use warnings;
use CPAN;
use CPAN::FirstTime;
use YAML;
use Cwd;
use Config;

my $dist_dir = getcwd;

die "I refuse to run unless you set the ACTS_PREFIX environmnent variable"
    unless $ENV{ACTS_PREFIX};

sub _wrap {
    my($sub, $wrapper) = @_;
    my $wrap_call;

    {
        no strict 'refs';
        no warnings 'redefine';
        my $sub_ref = \&{$sub};
        $wrap_call = sub { $wrapper->($sub_ref, @_); };
        *{$sub} = $wrap_call;
    }

    return $wrap_call;
}

local $INC{"CPAN/MyConfig.pm"} = "$ENV{ACTS_PREFIX}/.cpan/CPAN/MyConfig.pm";
$ENV{PERL5OPT} = qq[-I$ENV{ACTS_PREFIX}/lib];
unshift(@INC, "$ENV{ACTS_PREFIX}/lib");


-e "META.yml" or die "No META.yml in the current directory!";

my $meta;
open($meta, "META.yml") or die "failed to open META.yml: $!";
my $yaml = join('', <$meta>);
close($meta);
my $data = YAML::Load($yaml) or die "failed to read metadata";
my %requires = map { %{$_} } grep { $_ } @$data{'requires','build_requires'}
    or die "requirements appear to be missing";

system("./Build distclean") if -e "./Build";

our $MakePL = join(" ",
    qq[PREFIX=$ENV{ACTS_PREFIX}],
    qq[LIB=$ENV{ACTS_PREFIX}/lib],
    qq[INC=$ENV{ACTS_PREFIX}/include ],
    qq[LDDLFLAGS="$Config{lddlflags} -L$ENV{ACTS_PREFIX}/lib"]
);

our $MB = join(" ",
    qq[--install-base $ENV{ACTS_PREFIX}],
    qq[--install-path lib=$ENV{ACTS_PREFIX}/lib],
    qq[--install-path arch=$ENV{ACTS_PREFIX}/lib/arch],
    qq[--extra-compiler-flags=-I$ENV{ACTS_PREFIX}/include],
    qq[--extra-linker-flags=-L$ENV{ACTS_PREFIX}/lib]
);

eval "use CPAN::Config";
_wrap('CPAN::FirstTime::init', sub {
    my($real, @args) = @_;
    push(@args, autoconfig => 1);
    $real->(@args);
});

_wrap('CPAN::Distribution::make', sub {
    my($real, $self, @args) = @_;
    warn "Building ", $self->id, "\n";
    if($self->id =~ m{/Net(?:_|::|-)SSLeay}) {
        warn "This is Net::SSLeay; fudging Makefile.PL arguments\n";
        local $CPAN::Config->{makepl_arg} = qq[/usr -- $MakePL];
        $real->($self, @args);
    } else {
        $real->($self, @args);
    }
});

my $wrapper = sub {
    my($real, @args) = @_;
    if($args[0] =~ m{manual config}) {
        $args[1] = 'no';
    }
    $real->(@args);
};
    
_wrap('ExtUtils::MakeMaker::prompt', $wrapper);
_wrap('CPAN::FirstTime::prompt', $wrapper);

$ENV{PERL_MM_USE_DEFAULT} = 1;
$CPAN::Config = {
  'build_cache' => q[100],
  'build_dir' => qq[$ENV{ACTS_PREFIX}/.cpan/build],
  'cache_metadata' => q[1],
  'cpan_home' => qq[$ENV{ACTS_PREFIX}/.cpan],
  'ftp_passive' => q[1],
  'ftp_proxy' => q[],
  'getcwd' => q[cwd],
  'histfile' => qq[$ENV{ACTS_PREFIX}/.cpan/histfile],
  'histsize' => q[100],
  'http_proxy' => q[],
  'inactivity_timeout' => q[0],
  'index_expire' => q[1],
  'inhibit_startup_message' => q[0],
  'keep_source_where' => qq[$ENV{ACTS_PREFIX}/.cpan/sources],
  'make_arg' => q[],
  'make_install_arg' => q[],
  'makepl_arg' => $MakePL,
  'mbuild_arg' => q[],
  'mbuild_install_arg' => q[],
  'mbuild_install_build_command' => q[./Build],
  'mbuildpl_arg' => $MB,
  'ncftp' => q[],
  'ncftpget' => q[],
  'no_proxy' => q[],
  'prefer_installer' => q[MB],
  'prerequisites_policy' => q[follow],
  'scan_cache'  => q[atstart],
  'show_upload_date' => q[1],
  'term_is_latin' => q[1],
  'urllist' => [q[ftp://ftp.yi.org/CPAN]],
};

CPAN::Shell->reload('index');
## remove this block once M::B 0.28 goes live;
CPAN::Shell->notest('install', 'KWILLIAMS/Module-Build-0.27_07.tar.gz');
CPAN::Shell->force(
    'install', grep { $_ ne 'Module::Build' } keys %requires
);
CPAN::Shell->force('install', 'KWILLIAMS/Module-Build-0.27_07.tar.gz');

{
    # we have to install this twice to make sure it works if it's already
    # installed by the system.
    eval "use DBIx::Migration::Directories::ConfigData; 1;" or die $@;
    DBIx::Migration::Directories::ConfigData->set_config(
        "schema_dir", "$ENV{ACTS_PREFIX}/schemas"
    );
    DBIx::Migration::Directories::ConfigData->write;
    CPAN::Shell->force('install', 'DBIx::Migration::Directories');
}

chdir($dist_dir);

{
    local $ENV{HARNESS_PERL_SWITCHES} = "-MDevel::Cover";
    local $CPAN::Config->{mbuildpl_arg} = 
        "$CPAN::Config->{mbuildpl_arg} --verbose";

    my $dist = CPAN::Distribution->new(
        build_dir => $dist_dir,
        ID => 'Sophos-ACTS',
        archived => 'Fake',
        unwrapped => 'Yes',
        modulebuild =>  1
    );

    local *CPAN::Distribution::unsat_prereq = sub { (); };
    
    $dist->install or die "Failed to install Sophos-ACTS!";
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.