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 print OUT "\n# perlivp $^V\n";
38 # In the following, perl variables are not expanded during extraction.
40 print OUT <<'!NO!SUBS!';
49 -p Print a preface before each test telling what it will test.
50 -v Verbose mode in which extra information about test results
51 is printed. Test failures always print out some extra information
52 regardless of whether or not this switch is set.
53 -h Prints this help message.
58 use vars qw(%opt); # allow testing with older versions (do not use our)
60 @opt{ qw/? H h P p V v/ } = qw(0 0 0 0 0 0 0);
62 while ($ARGV[0] =~ /^-/) {
64 for my $flag (split(//,$ARGV[0])) {
65 usage() if '?' =~ /\Q$flag/;
66 usage() if 'h' =~ /\Q$flag/;
67 usage() if 'H' =~ /\Q$flag/;
68 usage("unknown flag: '$flag'") unless 'HhPpVv' =~ /\Q$flag/;
69 warn "$0: '$flag' flag already set\n" if $opt{$flag}++;
83 # We cannot merely check the variable '$^X' in general since on many
84 # Unixes it is the basename rather than the full path to the perl binary.
86 if (defined($Config{'perlpath'})) { $perlpath = $Config{'perlpath'}; }
88 # The useithreads Config variable plays a role in whether or not
89 # threads and threads/shared work when C<use>d. They apparently always
90 # get installed on systems that can run Configure.
92 if (defined($Config{'useithreads'})) { $useithreads = $Config{'useithreads'}; }
94 print OUT <<"!GROK!THIS!";
95 my \$perlpath = '$perlpath';
96 my \$useithreads = '$useithreads';
99 print OUT <<'!NO!SUBS!';
101 print "## Checking Perl binary via variable '\$perlpath' = $perlpath.\n" if $opt{'p'};
103 my $label = 'Executable perl binary';
106 print "## Perl binary '$perlpath' appears executable.\n" if $opt{'v'};
107 print "ok 1 $label\n";
111 print "# Perl binary '$perlpath' does not appear executable.\n";
112 print "not ok 1 $label\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!';
128 $label = 'Perl version correct';
129 if ($ivp_VERSION eq $]) {
130 print "## Perl version '$]' appears installed as expected.\n" if $opt{'v'};
131 print "ok 2 $label\n";
135 print "# Perl version '$]' installed, expected $ivp_VERSION.\n";
136 print "not ok 2 $label\n";
141 # We have the right perl and version, so now reset @INC so we ignore
144 local $ENV{PERL5LIB};
145 my $perl_V = qx($perlpath -V);
146 $perl_V =~ s{.*\@INC:\n}{}ms;
147 @INC = grep { length && $_ ne '.' } split ' ', $perl_V;
150 print "## Checking roots of the Perl library directory tree via variable '\@INC'.\n" if $opt{'p'};
155 next if $_ eq '.'; # skip -d test here
157 print "## Perl \@INC directory '$_' exists.\n" if $opt{'v'};
161 print "# Perl \@INC directory '$_' does not appear to exist.\n";
166 $label = '@INC directoreis exist';
167 if ($INC_total == $INC_there) {
168 print "ok 3 $label\n";
172 print "not ok 3 $label\n";
178 print "## Checking installations of modules necessary for ivp.\n" if $opt{'p'};
180 my $needed_total = 0;
181 my $needed_there = 0;
182 foreach (qw(Config.pm ExtUtils/Installed.pm)) {
185 eval "require \"$_\";";
187 print "## Module '$_' appears to be installed.\n" if $opt{'v'};
191 print "# Needed module '$_' does not appear to be properly installed.\n";
195 $label = 'Modules needed for rest of perlivp exist';
196 if ($needed_total == $needed_there) {
197 print "ok 4 $label\n";
201 print "not ok 4 $label\n";
207 print "## Checking installations of extensions built with perl.\n" if $opt{'p'};
211 my $extensions_total = 0;
212 my $extensions_there = 0;
213 if (defined($Config{'extensions'})) {
214 my @extensions = split(/\s+/,$Config{'extensions'});
215 foreach (@extensions) {
217 if ( $useithreads !~ /define/i ) {
218 next if ($_ eq 'threads');
219 next if ($_ eq 'threads/shared');
221 # that's a distribution name, not a module name
222 next if $_ eq 'IO/Compress';
223 next if $_ eq 'Devel/DProf';
224 next if $_ eq 'libnet';
225 next if $_ eq 'Locale/Codes';
226 next if $_ eq 'podlators';
227 next if $_ eq 'perlfaq';
229 next if $_ eq 'XS/APItest';
230 next if $_ eq 'XS/Typemap';
231 # VMS$ perl -e "eval ""require \""Devel/DProf.pm\"";"" print $@"
232 # \NT> perl -e "eval \"require 'Devel/DProf.pm'\"; print $@"
233 # DProf: run perl with -d to use DProf.
234 # Compilation failed in require at (eval 1) line 1.
235 eval " require \"$_.pm\"; ";
237 print "## Module '$_' appears to be installed.\n" if $opt{'v'};
241 print "# Required module '$_' does not appear to be properly installed.\n";
247 # A silly name for a module (that hopefully won't ever exist).
248 # Note that this test serves more as a check of the validity of the
249 # actual required module tests above.
250 my $unnecessary = 'bLuRfle';
252 if (!grep(/$unnecessary/, @extensions)) {
254 eval " require \"$unnecessary.pm\"; ";
256 print "## Unnecessary module '$unnecessary' does not appear to be installed.\n" if $opt{'v'};
259 print "# Unnecessary module '$unnecessary' appears to be installed.\n";
265 $label = 'All (and only) expected extensions installed';
266 if ($extensions_total == $extensions_there) {
267 print "ok 5 $label\n";
271 print "not ok 5 $label\n";
277 print "## Checking installations of later additional extensions.\n" if $opt{'p'};
279 use ExtUtils::Installed;
281 my $installed_total = 0;
282 my $installed_there = 0;
283 my $version_check = 0;
284 my $installed = ExtUtils::Installed -> new();
285 my @modules = $installed -> modules();
290 # Consider it there if it contains one or more files,
291 # and has zero missing files,
292 # and has a defined version
294 $version = $installed -> version($_);
296 print "## $_; $version\n" if $opt{'v'};
300 print "# $_; NO VERSION\n" if $opt{'v'};
304 @missing = $installed -> validate($_);
306 # .bs files are optional
307 @missing = grep { ! /\.bs$/ } @missing;
308 # man files are often compressed
309 @missing = grep { ! ( -s "$_.gz" || -s "$_.bz2" ) } @missing;
311 if ($#missing >= 0) {
312 print "# file",+($#missing == 0) ? '' : 's'," missing from installation:\n";
313 print '# ',join(' ',@missing),"\n";
315 elsif ($#missing == -1) {
320 $label = 'Module files correctly installed';
321 if (($installed_total == $installed_there) &&
322 ($installed_total == $version_check)) {
323 print "ok 6 $label\n";
327 print "not ok 6 $label\n";
332 # Final report (rather than feed ousrselves to Test::Harness::runtests()
333 # we simply format some output on our own to keep things simple and
334 # easier to "fix" - at least for now.
336 if ($error_total == 0 && $tests_total) {
337 print "All tests successful.\n";
338 } elsif ($tests_total==0){
339 die "FAILED--no tests were run for some reason.\n";
342 if ($tests_total > 0) { $rate = sprintf "%.2f", 100.0 * ($pass__total / $tests_total); }
343 printf " %d/%d subtests failed, %.2f%% okay.\n",
344 $error_total, $tests_total, $rate;
349 perlivp - Perl Installation Verification Procedure
353 B<perlivp> [B<-p>] [B<-v>] [B<-h>]
357 The B<perlivp> program is set up at Perl source code build time to test the
358 Perl version it was built under. It can be used after running:
362 (or your platform's equivalent procedure) to verify that B<perl> and its
363 libraries have been installed correctly. A correct installation is verified
364 by output that looks like:
377 Prints out a brief help message.
379 =item B<-p> print preface
381 Gives a description of each test prior to performing it.
385 Gives more detailed information about each test, after it has been performed.
386 Note that any failed tests ought to print out some extra information whether
395 =item * print "# Perl binary '$perlpath' does not appear executable.\n";
397 Likely to occur for a perl binary that was not properly installed.
398 Correct by conducting a proper installation.
400 =item * print "# Perl version '$]' installed, expected $ivp_VERSION.\n";
402 Likely to occur for a perl that was not properly installed.
403 Correct by conducting a proper installation.
405 =item * print "# Perl \@INC directory '$_' does not appear to exist.\n";
407 Likely to occur for a perl library tree that was not properly installed.
408 Correct by conducting a proper installation.
410 =item * print "# Needed module '$_' does not appear to be properly installed.\n";
412 One of the two modules that is used by perlivp was not present in the
413 installation. This is a serious error since it adversely affects perlivp's
414 ability to function. You may be able to correct this by performing a
415 proper perl installation.
417 =item * print "# Required module '$_' does not appear to be properly installed.\n";
419 An attempt to C<eval "require $module"> failed, even though the list of
420 extensions indicated that it should succeed. Correct by conducting a proper
423 =item * print "# Unnecessary module 'bLuRfle' appears to be installed.\n";
425 This test not coming out ok could indicate that you have in fact installed
426 a bLuRfle.pm module or that the C<eval " require \"$module_name.pm\"; ">
427 test may give misleading results with your installation of perl. If yours
428 is the latter case then please let the author know.
430 =item * print "# file",+($#missing == 0) ? '' : 's'," missing from installation:\n";
432 One or more files turned up missing according to a run of
433 C<ExtUtils::Installed -E<gt> validate()> over your installation.
434 Correct by conducting a proper installation.
438 For further information on how to conduct a proper installation consult the
439 INSTALL file that comes with the perl source and the README file for your
450 close OUT or die "Can't close $file: $!";
451 chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
452 exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';