1 # -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*-
2 package CPAN::Mirrored::By;
5 $VERSION = sprintf "%.2f", substr(q$Rev: 485 $,4)/100;
11 sub continent { shift->[0] }
12 sub country { shift->[1] }
13 sub url { shift->[2] }
15 package CPAN::FirstTime;
18 use ExtUtils::MakeMaker ();
20 use File::Basename ();
23 use vars qw($VERSION);
24 $VERSION = sprintf "%.2f", substr(q$Rev: 485 $,4)/100;
28 CPAN::FirstTime - Utility for CPAN::Config file Initialization
32 CPAN::FirstTime::init()
36 The init routine asks a few questions and writes a CPAN/Config.pm or
37 CPAN/MyConfig.pm file (depending on what it is currently using).
42 use vars qw( %prompts );
45 my($configpm, %args) = @_;
47 # extra arg in 'o conf init make' selects only $item =~ /make/
48 my $matcher = $args{args} && @{$args{args}} ? $args{args}[0] : '';
49 CPAN->debug("matcher[$matcher]") if $CPAN::DEBUG;
51 unless ($CPAN::VERSION) {
54 eval {require CPAN::Config;};
66 print $prompts{manual_config};
70 local *_real_prompt = \&ExtUtils::MakeMaker::prompt;
71 if ( $args{autoconfig} ) {
74 $manual_conf = prompt("Are you ready for manual configuration?", "yes");
78 if ($manual_conf =~ /^y/i) {
82 $CPAN::Config->{urllist} ||= [];
85 # prototype should match that of &MakeMaker::prompt
86 *_real_prompt = sub ($;$) {
88 my($ret) = defined $a ? $a : "";
89 $CPAN::Frontend->myprint(sprintf qq{%s [%s]\n\n}, $q, $ret);
90 eval { require Time::HiRes };
92 Time::HiRes::sleep(0.1);
99 $CPAN::Frontend->myprint($prompts{config_intro})
100 if !$matcher or 'config_intro' =~ /$matcher/;
102 my $cpan_home = $CPAN::Config->{cpan_home}
103 || File::Spec->catdir($ENV{HOME}, ".cpan");
106 if (!$matcher or 'config_intro' =~ /$matcher/) {
107 $CPAN::Frontend->myprint(qq{
109 I see you already have a directory
111 Shall we use it as the general CPAN build and cache directory?
116 # no cpan-home, must prompt and get one
117 $CPAN::Frontend->myprint($prompts{cpan_home_where});
120 $default = $cpan_home;
121 while ($ans = prompt("CPAN build and cache directory?",$default)) {
122 unless (File::Spec->file_name_is_absolute($ans)) {
124 my $cwd = Cwd::cwd();
125 my $absans = File::Spec->catdir($cwd,$ans);
126 warn "The path '$ans' is not an absolute path. Please specify an absolute path\n";
130 eval { File::Path::mkpath($ans); }; # dies if it can't
132 warn "Couldn't create directory $ans.\nPlease retry.\n";
135 if (-d $ans && -w _) {
138 warn "Couldn't find directory $ans\n"
139 . "or directory is not writable. Please retry.\n";
142 $CPAN::Config->{cpan_home} = $ans;
144 $CPAN::Frontend->myprint($prompts{keep_source_where});
146 $CPAN::Config->{keep_source_where}
147 = File::Spec->catdir($CPAN::Config->{cpan_home},"sources");
149 $CPAN::Config->{build_dir}
150 = File::Spec->catdir($CPAN::Config->{cpan_home},"build");
153 # Cache size, Index expire
156 $CPAN::Frontend->myprint($prompts{build_cache_intro})
157 if !$matcher or 'build_cache_intro' =~ /$matcher/;
159 # large enough to build large dists like Tk
160 my_dflt_prompt(build_cache => 100, $matcher);
162 # XXX This the time when we refetch the index files (in days)
163 $CPAN::Config->{'index_expire'} = 1;
165 $CPAN::Frontend->myprint($prompts{scan_cache_intro})
166 if !$matcher or 'build_cache_intro' =~ /$matcher/;
168 my_prompt_loop(scan_cache => 'atstart', $matcher, 'atstart|never');
174 if (!$matcher or 'build_cache_intro' =~ /$matcher/) {
176 $CPAN::Frontend->myprint($prompts{cache_metadata});
178 defined($default = $CPAN::Config->{cache_metadata}) or $default = 1;
180 $ans = prompt("Cache metadata (yes/no)?", ($default ? 'yes' : 'no'));
181 } while ($ans !~ /^[yn]/i);
182 $CPAN::Config->{cache_metadata} = ($ans =~ /^y/i ? 1 : 0);
188 $CPAN::Frontend->myprint($prompts{term_is_latin})
189 if !$matcher or 'term_is_latin' =~ /$matcher/;
191 defined($default = $CPAN::Config->{term_is_latin}) or $default = 1;
193 $ans = prompt("Your terminal expects ISO-8859-1 (yes/no)?",
194 ($default ? 'yes' : 'no'));
195 } while ($ans !~ /^[yn]/i);
196 $CPAN::Config->{term_is_latin} = ($ans =~ /^y/i ? 1 : 0);
199 # save history in file 'histfile'
202 $CPAN::Frontend->myprint($prompts{histfile_intro});
204 defined($default = $CPAN::Config->{histfile}) or
205 $default = File::Spec->catfile($CPAN::Config->{cpan_home},"histfile");
206 $ans = prompt("File to save your history?", $default);
207 $CPAN::Config->{histfile} = $ans;
209 if ($CPAN::Config->{histfile}) {
210 defined($default = $CPAN::Config->{histsize}) or $default = 100;
211 $ans = prompt("Number of lines to save?", $default);
212 $CPAN::Config->{histsize} = $ans;
216 # do an ls on the m or the d command
218 $CPAN::Frontend->myprint($prompts{show_upload_date_intro});
220 defined($default = $CPAN::Config->{show_upload_date}) or
222 $ans = prompt("Always try to show upload date with 'd' and 'm' command (yes/no)?",
223 ($default ? 'yes' : 'no'));
224 $CPAN::Config->{show_upload_date} = ($ans =~ /^[y1]/i ? 1 : 0);
226 #my_prompt_loop(show_upload_date => 'n', $matcher,
227 #'follow|ask|ignore');
230 # prerequisites_policy
231 # Do we follow PREREQ_PM?
234 $CPAN::Frontend->myprint($prompts{prerequisites_policy_intro})
235 if !$matcher or 'prerequisites_policy_intro' =~ /$matcher/;
237 my_prompt_loop(prerequisites_policy => 'ask', $matcher,
238 'follow|ask|ignore');
245 $CPAN::Frontend->myprint($prompts{external_progs})
246 if !$matcher or 'external_progs' =~ /$matcher/;
249 local $^W if $^O eq 'MacOS';
250 my(@path) = split /$Config{'path_sep'}/, $ENV{'PATH'};
251 local $^W = $old_warn;
253 for $progname (qw/bzip2 gzip tar unzip make
254 curl lynx wget ncftpget ncftp ftp
257 if ($^O eq 'MacOS') {
258 $CPAN::Config->{$progname} = 'not_here';
261 next if $matcher && $progname !~ /$matcher/;
263 my $progcall = $progname;
264 # we don't need ncftp if we have ncftpget
265 next if $progname eq "ncftp" && $CPAN::Config->{ncftpget} gt " ";
266 my $path = $CPAN::Config->{$progname}
267 || $Config::Config{$progname}
269 if (File::Spec->file_name_is_absolute($path)) {
270 # testing existence is not good enough, some have these exe
273 # warn "Warning: configured $path does not exist\n" unless -e $path;
280 $progcall = $Config::Config{$progname} if $Config::Config{$progname};
283 $path ||= find_exe($progcall,[@path]);
284 $CPAN::Frontend->mywarn("Warning: $progcall not found in PATH\n") unless
285 $path; # not -e $path, because find_exe already checked that
286 $ans = prompt("Where is your $progname program?",$path) || $path;
287 $CPAN::Config->{$progname} = $ans;
289 my $path = $CPAN::Config->{'pager'} ||
290 $ENV{PAGER} || find_exe("less",[@path]) ||
291 find_exe("more",[@path]) || ($^O eq 'MacOS' ? $ENV{EDITOR} : 0 )
293 $ans = prompt("What is your favorite pager program?",$path);
294 $CPAN::Config->{'pager'} = $ans;
295 $path = $CPAN::Config->{'shell'};
296 if (File::Spec->file_name_is_absolute($path)) {
297 warn "Warning: configured $path does not exist\n" unless -e $path;
300 $path ||= $ENV{SHELL};
301 $path ||= $ENV{COMSPEC} if $^O eq "MSWin32";
302 if ($^O eq 'MacOS') {
303 $CPAN::Config->{'shell'} = 'not_here';
305 $path =~ s,\\,/,g if $^O eq 'os2'; # Cosmetic only
306 $ans = prompt("What is your favorite shell?",$path);
307 $CPAN::Config->{'shell'} = $ans;
311 # Arguments to make etc.
314 $CPAN::Frontend->myprint($prompts{prefer_installer_intro})
315 if !$matcher or 'prerequisites_policy_intro' =~ /$matcher/;
317 my_prompt_loop(prefer_installer => 'EUMM', $matcher, 'MB|EUMM');
320 $CPAN::Frontend->myprint($prompts{makepl_arg_intro})
321 if !$matcher or 'makepl_arg_intro' =~ /$matcher/;
323 my_dflt_prompt(makepl_arg => "", $matcher);
325 my_dflt_prompt(make_arg => "", $matcher);
327 require CPAN::HandleConfig;
328 if (exists $CPAN::HandleConfig::keys{make_install_make_command}) {
329 # as long as Windows needs $self->_build_command, we cannot
330 # support sudo on windows :-)
331 my_dflt_prompt(make_install_make_command => $CPAN::Config->{make} || "",
335 my_dflt_prompt(make_install_arg => $CPAN::Config->{make_arg} || "",
338 $CPAN::Frontend->myprint($prompts{mbuildpl_arg_intro})
339 if !$matcher or 'mbuildpl_arg_intro' =~ /$matcher/;
341 my_dflt_prompt(mbuildpl_arg => "", $matcher);
343 my_dflt_prompt(mbuild_arg => "", $matcher);
345 if (exists $CPAN::HandleConfig::keys{mbuild_install_build_command}) {
346 # as long as Windows needs $self->_build_command, we cannot
347 # support sudo on windows :-)
348 my_dflt_prompt(mbuild_install_build_command => "./Build", $matcher);
351 my_dflt_prompt(mbuild_install_arg => "", $matcher);
357 $CPAN::Frontend->myprint($prompts{inactivity_timeout_intro})
358 if !$matcher or 'inactivity_timeout_intro' =~ /$matcher/;
360 # my_dflt_prompt(inactivity_timeout => 0);
362 $default = $CPAN::Config->{inactivity_timeout} || 0;
363 $CPAN::Config->{inactivity_timeout} =
364 prompt("Timeout for inactivity during {Makefile,Build}.PL?",$default);
368 $CPAN::Frontend->myprint($prompts{proxy_intro})
369 if !$matcher or 'proxy_intro' =~ /$matcher/;
371 for (qw/ftp_proxy http_proxy no_proxy/) {
372 next if $matcher and $_ =~ /$matcher/;
374 $default = $CPAN::Config->{$_} || $ENV{$_};
375 $CPAN::Config->{$_} = prompt("Your $_?",$default);
378 if ($CPAN::Config->{ftp_proxy} ||
379 $CPAN::Config->{http_proxy}) {
381 $default = $CPAN::Config->{proxy_user} || $CPAN::LWP::UserAgent::USER;
383 $CPAN::Frontend->myprint($prompts{proxy_user});
385 if ($CPAN::Config->{proxy_user} = prompt("Your proxy user id?",$default)) {
386 $CPAN::Frontend->myprint($prompts{proxy_pass});
388 if ($CPAN::META->has_inst("Term::ReadKey")) {
389 Term::ReadKey::ReadMode("noecho");
391 $CPAN::Frontend->myprint($prompts{password_warn});
393 $CPAN::Config->{proxy_pass} = prompt_no_strip("Your proxy password?");
394 if ($CPAN::META->has_inst("Term::ReadKey")) {
395 Term::ReadKey::ReadMode("restore");
397 $CPAN::Frontend->myprint("\n\n");
405 conf_sites() unless $fastread;
407 # We don't ask these now, the defaults are very likely OK.
408 $CPAN::Config->{inhibit_startup_message} = 0;
409 $CPAN::Config->{getcwd} = 'cwd';
410 $CPAN::Config->{ftp_passive} = 1;
412 $CPAN::Frontend->myprint("\n\n");
413 CPAN::HandleConfig->commit($configpm);
417 my ($item, $dflt, $m) = @_;
418 my $default = $CPAN::Config->{$item} || $dflt;
421 if (!$m || $item =~ /$m/) {
422 $CPAN::Config->{$item} = prompt($prompts{$item}, $default);
424 $CPAN::Config->{$item} = $default;
429 my ($item, $dflt, $m, $ok) = @_;
430 my $default = $CPAN::Config->{$item} || $dflt;
434 if (!$m || $item =~ /$m/) {
435 do { $ans = prompt($prompts{$item}, $default);
436 } until $ans =~ /$ok/;
437 $CPAN::Config->{$item} = $ans;
439 $CPAN::Config->{$item} = $default;
445 my $m = 'MIRRORED.BY';
446 my $mby = File::Spec->catfile($CPAN::Config->{keep_source_where},$m);
447 File::Path::mkpath(File::Basename::dirname($mby));
448 if (-f $mby && -f $m && -M $m < -M $mby) {
450 File::Copy::copy($m,$mby) or die "Could not update $mby: $!";
454 my $overwrite_local = 0;
455 if ($mby && -f $mby && -M _ <= 60 && -s _ > 0) {
456 my $mtime = localtime((stat _)[9]);
457 my $prompt = qq{Found $mby as of $mtime
459 I\'d use that as a database of CPAN sites. If that is OK for you,
460 please answer 'y', but if you want me to get a new database now,
461 please answer 'n' to the following question.
463 Shall I use the local database in $mby?};
464 my $ans = prompt($prompt,"y");
465 $overwrite_local = 1 unless $ans =~ /^y/i;
468 if ($overwrite_local) {
469 print qq{Trying to overwrite $mby\n};
470 $mby = CPAN::FTP->localize($m,$mby,3);
471 $overwrite_local = 0;
472 } elsif ( ! -f $mby ){
473 print qq{You have no $mby\n I\'m trying to fetch one\n};
474 $mby = CPAN::FTP->localize($m,$mby,3);
475 } elsif (-M $mby > 60 && $loopcount == 0) {
476 print qq{Your $mby is older than 60 days,\n I\'m trying to fetch one\n};
477 $mby = CPAN::FTP->localize($m,$mby,3);
479 } elsif (-s $mby == 0) {
480 print qq{You have an empty $mby,\n I\'m trying to fetch one\n};
481 $mby = CPAN::FTP->localize($m,$mby,3);
486 read_mirrored_by($mby);
493 #warn "in find_exe exe[$exe] path[@$path]";
495 my $abs = File::Spec->catfile($dir,$exe);
496 if (($abs = MM->maybe_command($abs))) {
503 my($items,$prompt,$default,$require_nonempty,$empty_warning)=@_;
511 # display, at most, 15 items at a time
512 my $limit = $#{ $items } - $pos;
513 $limit = 15 if $limit > 15;
515 # show the next $limit items, get the new position
516 $pos = display_some($items, $limit, $pos);
517 $pos = 0 if $pos >= @$items;
519 my $num = prompt($prompt,$default);
521 @nums = split (' ', $num);
522 my $i = scalar @$items;
523 (warn "invalid items entered, try again\n"), next
524 if grep (/\D/ || $_ < 1 || $_ > $i, @nums);
525 if ($require_nonempty) {
526 (warn "$empty_warning\n");
530 # a blank line continues...
539 my ($items, $limit, $pos) = @_;
542 my @displayable = @$items[$pos .. ($pos + $limit)];
543 for my $item (@displayable) {
544 printf "(%d) %s\n", ++$pos, $item;
546 printf("%d more items, hit SPACE RETURN to show them\n",
553 sub read_mirrored_by {
554 my $local = shift or return;
555 my(%all,$url,$expected_size,$default,$ans,$host,
556 $dst,$country,$continent,@location);
557 my $fh = FileHandle->new;
558 $fh->open($local) or die "Couldn't open $local: $!";
561 ($host) = /^([\w\.\-]+)/ unless defined $host;
562 next unless defined $host;
563 next unless /\s+dst_(dst|location)/;
564 /location\s+=\s+\"([^\"]+)/ and @location = (split /\s*,\s*/, $1) and
565 ($continent, $country) = @location[-1,-2];
566 $continent =~ s/\s\(.*//;
567 $continent =~ s/\W+$//; # if Jarkko doesn't know latitude/longitude
568 /dst_dst\s+=\s+\"([^\"]+)/ and $dst = $1;
569 next unless $host && $dst && $continent && $country;
570 $all{$continent}{$country}{$dst} = CPAN::Mirrored::By->new($continent,$country,$dst);
572 $dst=$continent=$country="";
575 $CPAN::Config->{urllist} ||= [];
577 if (@previous_urls = @{$CPAN::Config->{urllist}}) {
578 $CPAN::Config->{urllist} = [];
581 print $prompts{urls_intro};
583 my (@cont, $cont, %cont, @countries, @urls, %seen);
584 my $no_previous_warn =
585 "Sorry! since you don't have any existing picks, you must make a\n" .
586 "geographic selection.";
587 @cont = picklist([sort keys %all],
588 "Select your continent (or several nearby continents)",
594 foreach $cont (@cont) {
595 my @c = sort keys %{$all{$cont}};
596 @cont{@c} = map ($cont, 0..$#c);
597 @c = map ("$_ ($cont)", @c) if @cont > 1;
598 push (@countries, @c);
602 @countries = picklist (\@countries,
603 "Select your country (or several nearby countries)",
607 %seen = map (($_ => 1), @previous_urls);
608 # hmmm, should take list of defaults from CPAN::Config->{'urllist'}...
609 foreach $country (@countries) {
610 (my $bare_country = $country) =~ s/ \(.*\)//;
611 my @u = sort keys %{$all{$cont{$bare_country}}{$bare_country}};
612 @u = grep (! $seen{$_}, @u);
613 @u = map ("$_ ($bare_country)", @u)
618 push (@urls, map ("$_ (previous pick)", @previous_urls));
619 my $prompt = "Select as many URLs as you like (by number),
620 put them on one line, separated by blanks, e.g. '1 4 5'";
621 if (@previous_urls) {
622 $default = join (' ', ((scalar @urls) - (scalar @previous_urls) + 1) ..
624 $prompt .= "\n(or just hit RETURN to keep your previous picks)";
627 @urls = picklist (\@urls, $prompt, $default);
628 foreach (@urls) { s/ \(.*\)//; }
629 push @{$CPAN::Config->{urllist}}, @urls;
633 my %seen = map (($_ => 1), @{$CPAN::Config->{urllist}});
636 my $prompt = "Enter another URL or RETURN to quit:";
638 $prompt = qq{CPAN.pm needs at least one URL where it can fetch CPAN files from.
640 Please enter your CPAN site:};
642 $ans = prompt ($prompt, "");
645 $ans =~ s|/?\z|/|; # has to end with one slash
646 $ans = "file:$ans" unless $ans =~ /:/; # without a scheme is a file:
647 if ($ans =~ /^\w+:\/./) {
648 push @urls, $ans unless $seen{$ans}++;
650 printf(qq{"%s" doesn\'t look like an URL at first sight.
651 I\'ll ignore it for now.
652 You can add it to your %s
653 later if you\'re sure it\'s right.\n},
655 $INC{'CPAN/MyConfig.pm'} || $INC{'CPAN/Config.pm'} || "configuration file",
659 } while $ans || !%seen;
661 push @{$CPAN::Config->{urllist}}, @urls;
662 # xxx delete or comment these out when you're happy that it works
663 print "New set of picks:\n";
664 map { print " $_\n" } @{$CPAN::Config->{urllist}};
669 $_[0] =~ s/^\s+//; # no leading spaces
670 $_[0] =~ s/\s+\z//; # no trailing spaces
675 my $ans = _real_prompt(@_);
683 sub prompt_no_strip ($;$) {
684 return _real_prompt(@_);
694 CPAN is the world-wide archive of perl resources. It consists of about
695 100 sites that all replicate the same contents all around the globe.
696 Many countries have at least one CPAN site already. The resources
697 found on CPAN are easily accessible with the CPAN.pm module. If you
698 want to use CPAN.pm, you have to configure it properly.
700 If you do not want to enter a dialog now, you can answer 'no' to this
701 question and I\'ll try to autoconfigure. (Note: you can revisit this
702 dialog anytime later by typing 'o conf init' at the cpan prompt.)
708 The following questions are intended to help you with the
709 configuration. The CPAN module needs a directory of its own to cache
710 important index files and maybe keep a temporary mirror of CPAN files.
711 This may be a site-wide directory or a personal directory.
715 # cpan_home => qq{ },
717 cpan_home_where => qq{
719 First of all, I\'d like to create this directory. Where?
723 keep_source_where => qq{
725 If you like, I can cache the source files after I build them. Doing
726 so means that, if you ever rebuild that module in the future, the
727 files will be taken from the cache. The tradeoff is that it takes up
728 space. How much space would you like to allocate to this cache? (If
729 you don\'t want me to keep a cache, answer 0.)
733 build_cache_intro => qq{
735 How big should the disk cache be for keeping the build directories
736 with all the intermediate files\?
741 "Cache size for build directory (in MB)?",
744 scan_cache_intro => qq{
746 By default, each time the CPAN module is started, cache scanning is
747 performed to keep the cache size in sync. To prevent this, answer
752 scan_cache => "Perform cache scanning (atstart or never)?",
754 cache_metadata => qq{
756 To considerably speed up the initial CPAN shell startup, it is
757 possible to use Storable to create a cache of metadata. If Storable
758 is not available, the normal index mechanism will be used.
764 The next option deals with the charset (aka character set) your
765 terminal supports. In general, CPAN is English speaking territory, so
766 the charset does not matter much, but some of the aliens out there who
767 upload their software to CPAN bear names that are outside the ASCII
768 range. If your terminal supports UTF-8, you should say no to the next
769 question. If it supports ISO-8859-1 (also known as LATIN1) then you
770 should say yes. If it supports neither, your answer does not matter
771 because you will not be able to read the names of some authors
772 anyway. If you answer no, names will be output in UTF-8.
776 histfile_intro => qq{
778 If you have one of the readline packages (Term::ReadLine::Perl,
779 Term::ReadLine::Gnu, possibly others) installed, the interactive CPAN
780 shell will have history support. The next two questions deal with the
781 filename of the history file and with its size. If you do not want to
782 set this variable, please hit SPACE RETURN to the following question.
786 histfile => qq{File to save your history?},
788 show_upload_date_intro => qq{
790 The 'd' and the 'm' command normally only show you information they
791 have in their in-memory database and thus will never connect to the
792 internet. If you set the 'show_upload_date' variable to true, 'm' and
793 'd' will additionally show you the upload date of the module or
794 distribution. Per default this feature is off because it may require a
795 net connection to get at the upload date.
800 "Always try to show upload date with 'd' and 'm' command (yes/no)?",
802 prerequisites_policy_intro => qq{
804 The CPAN module can detect when a module which you are trying to build
805 depends on prerequisites. If this happens, it can build the
806 prerequisites for you automatically ('follow'), ask you for
807 confirmation ('ask'), or just ignore them ('ignore'). Please set your
808 policy to one of the three values.
812 prerequisites_policy =>
813 "Policy on building prerequisites (follow, ask or ignore)?",
815 external_progs => qq{
817 The CPAN module will need a few external programs to work properly.
818 Please correct me, if I guess the wrong path for a program. Don\'t
819 panic if you do not have some of them, just press ENTER for those. To
820 disable the use of a download program, you can type a space followed
825 prefer_installer_intro => qq{
827 When you have Module::Build installed and a module comes with both a
828 Makefile.PL and a Build.PL, which shall have precedence? The two
829 installer modules we have are the old and well established
830 ExtUtils::MakeMaker (for short: EUMM) understands the Makefile.PL and
831 the next generation installer Module::Build (MB) works with the
837 qq{In case you could choose, which installer would you prefer (EUMM or MB)?},
839 makepl_arg_intro => qq{
841 Every Makefile.PL is run by perl in a separate process. Likewise we
842 run \'make\' and \'make install\' in separate processes. If you have
843 any parameters \(e.g. PREFIX, LIB, UNINST or the like\) you want to
844 pass to the calls, please specify them here.
846 If you don\'t understand this question, just press ENTER.
850 Parameters for the 'perl Makefile.PL' command?
851 Typical frequently used settings:
853 PREFIX=~/perl # non-root users (please see manual for more hints)
857 make_arg => qq{Parameters for the 'make' command?
858 Typical frequently used setting:
860 -j3 # dual processor system
865 make_install_make_command => qq{Do you want to use a different make command for 'make install'?
866 Cautious people will probably prefer:
872 /path1/to/sudo -u admin_account /path2/to/make
874 or some such. Your choice: },
877 make_install_arg => qq{Parameters for the 'make install' command?
878 Typical frequently used setting:
880 UNINST=1 # to always uninstall potentially conflicting files
885 mbuildpl_arg_intro => qq{
887 The next questions deal with Module::Build support.
889 A Build.PL is run by perl in a separate process. Likewise we run
890 './Build' and './Build install' in separate processes. If you have any
891 parameters you want to pass to the calls, please specify them here.
895 mbuildpl_arg => qq{Parameters for the 'perl Build.PL' command?
896 Typical frequently used settings:
898 --install_base /home/xxx # different installation directory
902 mbuild_arg => qq{Parameters for the './Build' command?
905 --extra_linker_flags -L/usr/foo/lib # non-standard library location
910 mbuild_install_build_command => qq{Do you want to use a different command for './Build install'?
911 Sudo users will probably prefer:
917 /path1/to/sudo -u admin_account ./Build
919 or some such. Your choice: },
922 mbuild_install_arg => qq{Parameters for the './Build install' command?
923 Typical frequently used setting:
925 --uninst 1 # uninstall conflicting files
931 inactivity_timeout_intro => qq{
933 Sometimes you may wish to leave the processes run by CPAN alone
934 without caring about them. Because the Makefile.PL sometimes contains
935 question you\'re expected to answer, you can set a timer that will
936 kill a 'perl Makefile.PL' process after the specified time in seconds.
938 If you set this value to 0, these processes will wait forever. This is
939 the default and recommended setting.
943 inactivity_timeout =>
944 qq{Timeout for inactivity during {Makefile,Build}.PL? },
949 If you\'re accessing the net via proxies, you can specify them in the
950 CPAN configuration or via environment variables. The variable in
951 the \$CPAN::Config takes precedence.
957 If your proxy is an authenticating proxy, you can store your username
958 permanently. If you do not want that, just press RETURN. You will then
959 be asked for your username in every future session.
965 Your password for the authenticating proxy can also be stored
966 permanently on disk. If this violates your security policy, just press
967 RETURN. You will then be asked for the password in every future
974 Now we need to know where your favorite CPAN sites are located. Push
975 a few sites onto the array (just in case the first on the array won\'t
976 work). If you are mirroring CPAN to your local workstation, specify a
979 First, pick a nearby continent and country (you can pick several of
980 each, separated by spaces, or none if you just want to keep your
981 existing selections). Then, you will be presented with a list of URLs
982 of CPAN mirrors in the countries you selected, along with previously
983 selected URLs. Select some of those URLs, or just keep the old list.
984 Finally, you will be prompted for any extra URLs -- file:, ftp:, or
985 http: -- that host a CPAN mirror.
991 Warning: Term::ReadKey seems not to be available, your password will
992 be echoed to the terminal!
998 die "Coding error in \@prompts declaration. Odd number of elements, above"
1001 %prompts = @prompts;
1003 if (scalar(keys %prompts) != scalar(@prompts)/2) {
1007 for my $item (0..$#prompts) {
1009 die "$prompts[$item] is duplicated\n"
1010 if $already{$prompts[$item]}++;