Makefile.PL es un programa Perl y por tanto puede
- en caso de duda - cuestionar al usuario sobre decisiones
que se refieren a la instalación. El siguiente ejemplo
pertenece a la distribución de Net::SSH::Perl:
# $Id: Makefile.PL,v 1.28 2005/02/20 19:56:02 dbrobins Exp $
use strict;
use 5.006;
use ExtUtils::MakeMaker qw(prompt WriteMakefile);
my %prereq = (
'Digest::MD5' => 0,
'IO::Socket' => 0,
);
my %SSH_PREREQ = (
1 => {
'String::CRC32' => '1.2',
'Math::GMP' => '1.04',
'Scalar::Util' => 0,
},
2 => {
'Digest::SHA1' => '2.10',
.................. => ......,
},
);
$SSH_PREREQ{3} = { map %{$SSH_PREREQ{$_}}, 1..2 };
print<<MSG;
This is Net::SSH::Perl.
As of version 1.00, Net::SSH::Perl supports both the SSH1 and
SSH2 protocols natively. The two protocols have different
module prerequisitives, so you need to decide which protocol(s)
................................................................
MSG
printf " [%d] SSH%d\n", $_, $_ for 1..2;
printf " [3] Both SSH1 and SSH2\n";
my $p = prompt("\nWhich protocol(s) do you plan to use?", 3);
print "\n";
@prereq{keys %{$SSH_PREREQ{$p}}} = values %{$SSH_PREREQ{$p}};
my @cryptmod = (
[ 'IDEA', 'Crypt::IDEA' ],
[ 'DES','Crypt::DES' ],
[ 'DES3', 'Crypt::DES' ],
[ 'Blowfish', 'Crypt::Blowfish' ],
[ 'RC4', '' ],
);
print<<MSG;
Some of the Net::SSH::Perl ciphers depend on a Crypt:: module from
....................................................................
MSG
my $i = 1;
for my $ciph(sort { $a->[0] <=> $b->[0] } @cryptmod) {
printf " [%d] %s\n", $i++, $ciph->[0];
}
my $c = prompt("\nEnter your choices, separated by spaces:", 1);
print "\n";
for my $id(split /\s+/, $c) {
next unless $cryptmod[$id-1]->[1];
$prereq{$cryptmod[$id-1]->[1]} = '0';
}
print "Checking for optional modules\n\n";
unless (have_module('Digest::BubbleBabble', 0.01)) {
print<<MSG, "\n";
Digest::BubbleBabble is required if you want to generate bubble babble
key fingerprints with pssh-keygen.
MSG
if (read_yes_or_no("Would you like to install it? (y/n)", "y")) {
$prereq{'Digest::BubbleBabble'} = '0.01';
}
print "\n";
}
unless (have_module('Crypt::RSA', 1.37)) {
print<<MSG, "\n";
Crypt::RSA is required if you wish to use the ssh-rsa public
key algorithm (ssh-dss is used by default).
MSG
if (read_yes_or_no("Would you like to install it? (y/n)", "y")) {
$prereq{'Crypt::RSA'} = '1.37';
}
print "\n";
}
WriteMakefile(
NAME => 'Net::SSH::Perl',
DISTNAME => 'Net-SSH-Perl',
VERSION_FROM => 'lib/Net/SSH/Perl.pm',
PREREQ_PM => \%prereq,
AUTHOR => 'David Robins <dbrobins@cpan.org>',
ABSTRACT => 'Perl client interface to SSH',
);
sub read_yes_or_no {
my($prompt, $def) = @_;
my $ans = prompt($prompt, $def);
$ans =~ /^y/i;
}
sub have_module {
my($name, $ver) = @_;
eval("use $name" . ($ver ? " $ver;" : ";"));
!$@;
}
El ejemplo muestra el uso de
la función prompt que permite
preguntar al usuario.
Casiano Rodríguez León
