7 # List explicitly here the variables you want Configure to
8 # generate. Metaconfig only looks for shell variables, so you
9 # have to mention them as if they were shell variables, not
15 # This forces PL files to create target in same directory as PL file.
16 # This is so that make depend always knows where to find PL derivatives.
19 my $file = basename($0, '.PL');
20 $file .= '.com' if $^O eq 'VMS';
23 open OUT,">$file" or die "Can't create $file: $!";
25 print "Extracting $file (with variable substitutions)\n";
27 # In this section, perl variables will be expanded during extraction.
28 # You can use $Config{...} to use Configure variables.
30 print OUT <<"!GROK!THIS!";
32 eval 'exec $Config{'perlpath'} -S \$0 \${1+"\$@"}'
33 if \$running_under_some_shell;
36 # In the following, perl variables are not expanded during extraction.
38 print OUT <<'!NO!SUBS!';
48 $0 [-a] [-p] [-v] | [-h]
50 -a Run all tests (default is to skip .ph tests)
51 -p Print a preface before each test telling what it will test.
52 -v Verbose mode in which extra information about test results
53 is printed. Test failures always print out some extra information
54 regardless of whether or not this switch is set.
55 -h Prints this help message.
60 use vars qw(%opt); # allow testing with older versions (do not use our)
62 @opt{ qw/? H h P p V v/ } = qw(0 0 0 0 0 0 0);
64 while ($ARGV[0] =~ /^-/) {
66 for my $flag (split(//,$ARGV[0])) {
67 usage() if '?' =~ /\Q$flag/;
68 usage() if 'h' =~ /\Q$flag/;
69 usage() if 'H' =~ /\Q$flag/;
70 usage("unknown flag: `$flag'") unless 'HhPpVva' =~ /\Q$flag/;
71 warn "$0: `$flag' flag already set\n" if $opt{$flag}++;
85 # We cannot merely check the variable `$^X' in general since on many
86 # Unixes it is the basename rather than the full path to the perl binary.
88 if (defined($Config{'perlpath'})) { $perlpath = $Config{'perlpath'}; }
90 # The useithreads Config variable plays a role in whether or not
91 # threads and threads/shared work when C<use>d. They apparently always
92 # get installed on systems that can run Configure.
94 if (defined($Config{'useithreads'})) { $useithreads = $Config{'useithreads'}; }
96 print OUT <<"!GROK!THIS!";
97 my \$perlpath = '$perlpath';
98 my \$useithreads = '$useithreads';
101 print OUT <<'!NO!SUBS!';
103 print "## Checking Perl binary via variable `\$perlpath' = $perlpath.\n" if $opt{'p'};
106 print "## Perl binary `$perlpath' appears executable.\n" if $opt{'v'};
111 print "# Perl binary `$perlpath' does not appear executable.\n";
118 print "## Checking Perl version via variable `\$]'.\n" if $opt{'p'};
122 print OUT <<"!GROK!THIS!";
123 my \$ivp_VERSION = $];
126 print OUT <<'!NO!SUBS!';
127 if ($ivp_VERSION eq $]) {
128 print "## Perl version `$]' appears installed as expected.\n" if $opt{'v'};
133 print "# Perl version `$]' installed, expected $ivp_VERSION.\n";
140 print "## Checking roots of the Perl library directory tree via variable `\@INC'.\n" if $opt{'p'};
145 next if $_ eq '.'; # skip -d test here
146 if ($^O eq 'MacOS') {
147 next if $_ eq ':'; # skip -d test here
148 next if $_ eq 'Dev:Pseudo:'; # why is this in @INC?
151 print "## Perl \@INC directory `$_' exists.\n" if $opt{'v'};
155 print "# Perl \@INC directory `$_' does not appear to exist.\n";
159 if ($INC_total == $INC_there) {
170 print "## Checking installations of modules necessary for ivp.\n" if $opt{'p'};
172 my $needed_total = 0;
173 my $needed_there = 0;
174 foreach (qw(Config.pm ExtUtils/Installed.pm)) {
177 eval "require \"$_\";";
179 print "## Module `$_' appears to be installed.\n" if $opt{'v'};
183 print "# Needed module `$_' does not appear to be properly installed.\n";
187 if ($needed_total == $needed_there) {
198 print "## Checking installations of extensions built with perl.\n" if $opt{'p'};
202 my $extensions_total = 0;
203 my $extensions_there = 0;
204 if (defined($Config{'extensions'})) {
205 my @extensions = split(/\s+/,$Config{'extensions'});
206 foreach (@extensions) {
208 if ( $useithreads !~ /define/i ) {
209 next if ($_ eq 'threads');
210 next if ($_ eq 'threads/shared');
212 next if ($_ eq 'Devel/DProf');
213 # VMS$ perl -e "eval ""require \""Devel/DProf.pm\"";"" print $@"
214 # \NT> perl -e "eval \"require 'Devel/DProf.pm'\"; print $@"
215 # DProf: run perl with -d to use DProf.
216 # Compilation failed in require at (eval 1) line 1.
217 eval " require \"$_.pm\"; ";
219 print "## Module `$_' appears to be installed.\n" if $opt{'v'};
223 print "# Required module `$_' does not appear to be properly installed.\n";
229 # A silly name for a module (that hopefully won't ever exist).
230 # Note that this test serves more as a check of the validity of the
231 # actuall required module tests above.
232 my $unnecessary = 'bLuRfle';
234 if (!grep(/$unnecessary/, @extensions)) {
236 eval " require \"$unnecessary.pm\"; ";
238 print "## Unnecessary module `$unnecessary' does not appear to be installed.\n" if $opt{'v'};
241 print "# Unnecessary module `$unnecessary' appears to be installed.\n";
247 if ($extensions_total == $extensions_there) {
258 print "## Checking installations of later additional extensions.\n" if $opt{'p'};
260 use ExtUtils::Installed;
262 my $installed_total = 0;
263 my $installed_there = 0;
264 my $version_check = 0;
265 my $installed = ExtUtils::Installed -> new();
266 my @modules = $installed -> modules();
271 # Consider it there if it contains one or more files,
272 # and has zero missing files,
273 # and has a defined version
275 $version = $installed -> version($_);
277 print "## $_; $version\n" if $opt{'v'};
281 print "# $_; NO VERSION\n" if $opt{'v'};
285 @missing = $installed -> validate($_);
286 if ($#missing >= 0) {
287 print "# file",+($#missing == 0) ? '' : 's'," missing from installation:\n";
288 print '# ',join(' ',@missing),"\n";
290 elsif ($#missing == -1) {
295 if (($installed_total == $installed_there) &&
296 ($installed_total == $version_check)) {
308 print "## Checking installations of *.h -> *.ph header files.\n" if $opt{'p'};
313 # Just about "any" C implementation ought to have a stdio.h (even if
314 # Config.pm may not list a i_stdio var).
315 my @ph_files = qw(stdio.ph);
316 # Add the ones that we know that perl thinks are there:
317 while (($var, $val) = each %Config) {
318 if ($var =~ m/i_(.+)/ && $val eq 'define') {
320 # Some header and symbol names don't match for hysterical raisins.
321 $h_file = 'arpa/inet' if $h_file eq 'arpainet';
322 $h_file = 'netinet/in' if $h_file eq 'niin';
323 $h_file = 'netinet/tcp' if $h_file eq 'netinettcp';
324 $h_file = 'sys/resource' if $h_file eq 'sysresrc';
325 $h_file = 'sys/select' if $h_file eq 'sysselct';
326 $h_file = 'sys/security' if $h_file eq 'syssecrt';
327 $h_file = 'rpcsvc/dbm' if $h_file eq 'rpcsvcdbm';
328 # This ought to distinguish syslog from sys/syslog.
329 # (NB syslog.ph is heavily used for the DBI pre-requisites).
330 $h_file =~ s{^sys(\w.+)}{sys/$1} unless $h_file eq 'syslog';
331 push(@ph_files, "$h_file.ph");
334 #foreach (qw(stdio.ph syslog.ph)) {
335 foreach (@ph_files) {
337 eval "require \"$_\";";
339 print "## Perl header `$_' appears to be installed.\n" if $opt{'v'};
343 print "# Perl header `$_' does not appear to be properly installed.\n";
348 if (scalar(@ph_files) == $ph_there) {
359 print "## Skip checking of *.ph header files.\n" if $opt{'p'};
362 # Final report (rather than feed ousrselves to Test::Harness::runtests()
363 # we simply format some output on our own to keep things simple and
364 # easier to "fix" - at least for now.
366 if ($error_total == 0 && $tests_total) {
367 print "All tests successful.\n";
368 } elsif ($tests_total==0){
369 die "FAILED--no tests were run for some reason.\n";
372 if ($tests_total > 0) { $rate = sprintf "%.2f", 100.0 * ($pass__total / $tests_total); }
373 printf " %d/%d subtests failed, %.2f%% okay.\n",
374 $error_total, $tests_total, $rate;
379 perlivp - Perl Installation Verification Procedure
383 B<perlivp> [B<-a>] [B<-p>] [B<-v>] [B<-h>]
387 The B<perlivp> program is set up at Perl source code build time to test the
388 Perl version it was built under. It can be used after running:
392 (or your platform's equivalent procedure) to verify that B<perl> and its
393 libraries have been installed correctly. A correct installation is verified
394 by output that looks like:
407 Prints out a brief help message.
409 =item B<-a> run all tests
411 Normally tests for optional features are skipped. With -a all tests
414 =item B<-p> print preface
416 Gives a description of each test prior to performing it.
420 Gives more detailed information about each test, after it has been performed.
421 Note that any failed tests ought to print out some extra information whether
430 =item * print "# Perl binary `$perlpath' does not appear executable.\n";
432 Likely to occur for a perl binary that was not properly installed.
433 Correct by conducting a proper installation.
435 =item * print "# Perl version `$]' installed, expected $ivp_VERSION.\n";
437 Likely to occur for a perl that was not properly installed.
438 Correct by conducting a proper installation.
440 =item * print "# Perl \@INC directory `$_' does not appear to exist.\n";
442 Likely to occur for a perl library tree that was not properly installed.
443 Correct by conducting a proper installation.
445 =item * print "# Needed module `$_' does not appear to be properly installed.\n";
447 One of the two modules that is used by perlivp was not present in the
448 installation. This is a serious error since it adversely affects perlivp's
449 ability to function. You may be able to correct this by performing a
450 proper perl installation.
452 =item * print "# Required module `$_' does not appear to be properly installed.\n";
454 An attempt to C<eval "require $module"> failed, even though the list of
455 extensions indicated that it should succeed. Correct by conducting a proper
458 =item * print "# Unnecessary module `bLuRfle' appears to be installed.\n";
460 This test not coming out ok could indicate that you have in fact installed
461 a bLuRfle.pm module or that the C<eval " require \"$module_name.pm\"; ">
462 test may give misleading results with your installation of perl. If yours
463 is the latter case then please let the author know.
465 =item * print "# file",+($#missing == 0) ? '' : 's'," missing from installation:\n";
467 One or more files turned up missing according to a run of
468 C<ExtUtils::Installed -E<gt> validate()> over your installation.
469 Correct by conducting a proper installation.
471 =item * print "# Perl header `$_' does not appear to be properly installed.\n";
473 Correct by running B<h2ph> over your system's C header files. If necessary,
474 edit the resulting *.ph files to eliminate perl syntax errors.
478 For further information on how to conduct a proper installation consult the
479 INSTALL file that comes with the perl source and the README file for your
490 close OUT or die "Can't close $file: $!";
491 chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
492 exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';