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

#!/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!";
}

Reply via email to