Re: [PATCH] Attempt at speeding up Config.pm. Didn't work.
[p5sagit/p5-mst-13.2.git] / configpm
CommitLineData
a0d0e21e 1#!./miniperl -w
8990e307 2
5435c704 3# commonly used names to put first (and hence lookup fastest)
4my %Common = map {($_,$_)}
5 qw(archname osname osvers prefix libs libpth
6 dynamic_ext static_ext dlsrc so
7 cc ccflags cppflags
8 privlibexp archlibexp installprivlib installarchlib
9 sharpbang startsh shsharp
10 );
11
12# names of things which may need to have slashes changed to double-colons
13my %Extensions = map {($_,$_)}
14 qw(dynamic_ext static_ext extensions known_extensions);
15
16# allowed opts as well as specifies default and initial values
17my %Allowed_Opts = (
18 'cross' => '', # --cross=PALTFORM - crosscompiling for PLATFORM
19 'glossary' => 1, # --no-glossary - no glossary file inclusion,
20 # for compactness
18f68570 21);
18f68570 22
5435c704 23sub opts {
24 # user specified options
25 my %given_opts = (
26 # --opt=smth
27 (map {/^--([\-_\w]+)=(.*)$/} @ARGV),
28 # --opt --no-opt --noopt
29 (map {/^no-?(.*)$/i?($1=>0):($_=>1)} map {/^--([\-_\w]+)$/} @ARGV),
30 );
31
32 my %opts = (%Allowed_Opts, %given_opts);
33
34 for my $opt (grep {!exists $Allowed_Opts{$_}} keys %given_opts) {
35 die "option '$opt' is not recognized";
36 }
37 @ARGV = grep {!/^--/} @ARGV;
38
39 return %opts;
40}
18f68570 41
5435c704 42
43my %Opts = opts();
44
45my $Config_PM;
46my $Glossary = $ARGV[1] || 'Porting/Glossary';
47
48if ($Opts{cross}) {
18f68570 49 # creating cross-platform config file
50 mkdir "xlib";
5435c704 51 mkdir "xlib/$Opts{cross}";
52 $Config_PM = $ARGV[0] || "xlib/$Opts{cross}/Config.pm";
18f68570 53}
54else {
5435c704 55 $Config_PM = $ARGV[0] || 'lib/Config.pm';
18f68570 56}
57
8990e307 58
5435c704 59open CONFIG, ">$Config_PM" or die "Can't open $Config_PM: $!\n";
fec02dd3 60
5435c704 61my $myver = sprintf "v%vd", $^V;
a0d0e21e 62
5435c704 63printf CONFIG <<'ENDOFBEG', ($myver) x 3;
64# This file was created by configpm when Perl was built. Any changes
65# made to this file will be lost the next time perl is built.
3c81428c 66
8990e307 67package Config;
3c81428c 68use Exporter ();
5435c704 69@EXPORT = qw(%%Config);
e3d0cac0 70@EXPORT_OK = qw(myconfig config_sh config_vars);
71
72# Define our own import method to avoid pulling in the full Exporter:
73sub import {
74 my $pkg = shift;
75 @_ = @EXPORT unless @_;
5435c704 76
77 my @func = grep {$_ ne '%%Config'} @_;
4365a961 78 local $Exporter::ExportLevel = 1;
e3d0cac0 79 Exporter::import('Config', @func) if @func;
5435c704 80
e3d0cac0 81 return if @func == @_;
5435c704 82
e3d0cac0 83 my $callpkg = caller(0);
5435c704 84 *{"$callpkg\::Config"} = \%%Config;
e3d0cac0 85}
86
5435c704 87die "Perl lib version (%s) doesn't match executable version ($])"
88 unless $^V;
de98c553 89
5435c704 90$^V eq %s
91 or die "Perl lib version (%s) doesn't match executable version (" .
92 (sprintf "v%vd",$^V) . ")";
a0d0e21e 93
8990e307 94ENDOFBEG
95
16d20bd9 96
5435c704 97my @non_v = ();
98my @v_fast = ();
99my %v_fast = ();
100my @v_others = ();
101my $in_v = 0;
102my %Data = ();
103
104# This is somewhat grim, but I want the code for parsing config.sh here and
105# now so that I can expand $Config{ivsize} and $Config{ivtype}
106
107my $fetch_string = <<'EOT';
108
109# Search for it in the big string
110sub fetch_string {
111 my($self, $key) = @_;
112
113 my $quote_type = "'";
114 my $marker = "$key=";
115
116 # Check for the common case, ' delimeted
117 my $start = index($Config_SH, "\n$marker$quote_type");
118 # If that failed, check for " delimited
119 if ($start == -1) {
120 $quote_type = '"';
121 $start = index($Config_SH, "\n$marker$quote_type");
122 }
123 return undef if ( ($start == -1) && # in case it's first
124 (substr($Config_SH, 0, length($marker)) ne $marker) );
125 if ($start == -1) {
126 # It's the very first thing we found. Skip $start forward
127 # and figure out the quote mark after the =.
128 $start = length($marker) + 1;
129 $quote_type = substr($Config_SH, $start - 1, 1);
130 }
131 else {
132 $start += length($marker) + 2;
133 }
134
135 my $value = substr($Config_SH, $start,
136 index($Config_SH, "$quote_type\n", $start) - $start);
137
138 # If we had a double-quote, we'd better eval it so escape
139 # sequences and such can be interpolated. Since the incoming
140 # value is supposed to follow shell rules and not perl rules,
141 # we escape any perl variable markers
142 if ($quote_type eq '"') {
143 $value =~ s/\$/\\\$/g;
144 $value =~ s/\@/\\\@/g;
145 eval "\$value = \"$value\"";
146 }
147
148 # So we can say "if $Config{'foo'}".
149 $value = undef if $value eq 'undef';
150 $self->{$key} = $value; # cache it
151}
152EOT
153
154eval $fetch_string;
155die if $@;
a0d0e21e 156
5435c704 157open(CONFIG_SH, 'config.sh') || die "Can't open config.sh: $!";
158while (<CONFIG_SH>) {
a0d0e21e 159 next if m:^#!/bin/sh:;
5435c704 160
a02608de 161 # Catch PERL_CONFIG_SH=true and PERL_VERSION=n line from Configure.
5435c704 162 my($k, $v) = s/^(\w+)=(true|\d+)\s*$/$1='$2'\n/;
163
2000072c 164 # grandfather PATCHLEVEL and SUBVERSION and CONFIG
cceca5ed 165 if ($k) {
166 if ($k eq 'PERL_VERSION') {
167 push @v_others, "PATCHLEVEL='$v'\n";
168 }
169 elsif ($k eq 'PERL_SUBVERSION') {
170 push @v_others, "SUBVERSION='$v'\n";
171 }
a02608de 172 elsif ($k eq 'PERL_CONFIG_SH') {
2000072c 173 push @v_others, "CONFIG='$v'\n";
174 }
cceca5ed 175 }
5435c704 176
435ec615 177 # We can delimit things in config.sh with either ' or ".
178 unless ($in_v or m/^(\w+)=(['"])(.*\n)/){
a0d0e21e 179 push(@non_v, "#$_"); # not a name='value' line
180 next;
181 }
435ec615 182 $quote = $2;
5435c704 183 if ($in_v) {
184 $val .= $_;
185 }
186 else {
187 ($name,$val) = ($1,$3);
188 }
435ec615 189 $in_v = $val !~ /$quote\n/;
44a8e56a 190 next if $in_v;
a0d0e21e 191
5435c704 192 s,/,::,g if $Extensions{$name};
a0d0e21e 193
5435c704 194 $val =~ s/$quote\n?\z//;
3c81428c 195
5435c704 196 my $line = "$name=$quote$val$quote\n";
197 if (!$Common{$name}){
198 push(@v_others, $line);
199 }
200 else {
201 push(@v_fast, $line);
202 $v_fast{$name} = "'$name' => $quote$val$quote";
203 }
204}
205close CONFIG_SH;
3c81428c 206
5435c704 207print CONFIG @non_v, "\n";
3c81428c 208
5435c704 209# copy config summary format from the myconfig.SH script
210print CONFIG "my \$summary = <<'!END!';\n";
3b5ca523 211open(MYCONFIG,"<myconfig.SH") || die "open myconfig.SH failed: $!";
54310121 2121 while defined($_ = <MYCONFIG>) && !/^Summary of/;
213do { print CONFIG $_ } until !defined($_ = <MYCONFIG>) || /^\s*$/;
3c81428c 214close(MYCONFIG);
a0d0e21e 215
3c81428c 216print CONFIG "\n!END!\n", <<'EOT';
217my $summary_expanded = 0;
218
219sub myconfig {
220 return $summary if $summary_expanded;
ca8cad5c 221 $summary =~ s{\$(\w+)}
222 { my $c = $Config{$1}; defined($c) ? $c : 'undef' }ge;
3c81428c 223 $summary_expanded = 1;
224 $summary;
225}
5435c704 226
227our $Config_SH : shared = <<'!END!';
3c81428c 228EOT
229
5435c704 230print CONFIG join("", @v_fast, sort @v_others);
231
232print CONFIG "!END!\n", $fetch_string;
a0d0e21e 233
234print CONFIG <<'ENDOFEND';
235
5435c704 236sub fetch_virtual {
237 my($self, $key) = @_;
238
239 my $value;
240
241 if ($key =~ /^((?:cc|ld)flags|libs(?:wanted)?)_nolargefiles/) {
4b2ec495 242 # These are purely virtual, they do not exist, but need to
243 # be computed on demand for largefile-incapable extensions.
5435c704 244 my $new_key = "${1}_uselargefiles";
4b2ec495 245 $value = $Config{$1};
5435c704 246 my $withlargefiles = $Config{$new_key};
247 if ($new_key =~ /^(?:cc|ld)flags_/) {
4b2ec495 248 $value =~ s/\Q$withlargefiles\E\b//;
5435c704 249 } elsif ($new_key =~ /^libs/) {
45c9e83b 250 my @lflibswanted = split(' ', $Config{libswanted_uselargefiles});
4b2ec495 251 if (@lflibswanted) {
252 my %lflibswanted;
253 @lflibswanted{@lflibswanted} = ();
5435c704 254 if ($new_key =~ /^libs_/) {
4b2ec495 255 my @libs = grep { /^-l(.+)/ &&
256 not exists $lflibswanted{$1} }
257 split(' ', $Config{libs});
258 $Config{libs} = join(' ', @libs);
5435c704 259 } elsif ($new_key =~ /^libswanted_/) {
4b2ec495 260 my @libswanted = grep { not exists $lflibswanted{$_} }
261 split(' ', $Config{libswanted});
262 $Config{libswanted} = join(' ', @libswanted);
263 }
264 }
265 }
435ec615 266 }
5435c704 267
268 $self->{$key} = $value;
269}
270
271sub FETCH {
272 my($self, $key) = @_;
273
274 # check for cached value (which may be undef so we use exists not defined)
275 return $self->{$key} if exists $self->{$key};
276
277 $self->fetch_string($key);
278 return $self->{$key} if exists $self->{$key};
279 $self->fetch_virtual($key);
280
281 # Might not exist, in which undef is correct.
282 return $self->{$key};
a0d0e21e 283}
284
3c81428c 285my $prevpos = 0;
286
a0d0e21e 287sub FIRSTKEY {
288 $prevpos = 0;
5435c704 289 substr($Config_SH, 0, index($Config_SH, '=') );
a0d0e21e 290}
291
292sub NEXTKEY {
435ec615 293 # Find out how the current key's quoted so we can skip to its end.
5435c704 294 my $quote = substr($Config_SH, index($Config_SH, "=", $prevpos)+1, 1);
295 my $pos = index($Config_SH, qq($quote\n), $prevpos) + 2;
296 my $len = index($Config_SH, "=", $pos) - $pos;
a0d0e21e 297 $prevpos = $pos;
5435c704 298 $len > 0 ? substr($Config_SH, $pos, $len) : undef;
85e6fe83 299}
a0d0e21e 300
3c81428c 301sub EXISTS {
5435c704 302 return 1 if exists($_[0]->{$_[1]});
303
304 return(index($Config_SH, "\n$_[1]='") != -1 or
305 substr($Config_SH, 0, length($_[1])+2) eq "$_[1]='" or
306 index($Config_SH, "\n$_[1]=\"") != -1 or
307 substr($Config_SH, 0, length($_[1])+2) eq "$_[1]=\"" or
308 $_[1] =~ /^(?:(?:cc|ld)flags|libs(?:wanted)?)_nolargefiles$/
309 );
a0d0e21e 310}
311
3c81428c 312sub STORE { die "\%Config::Config is read-only\n" }
5435c704 313*DELETE = \&STORE;
314*CLEAR = \&STORE;
a0d0e21e 315
3c81428c 316
317sub config_sh {
5435c704 318 $Config_SH
748a9306 319}
9193ea20 320
321sub config_re {
322 my $re = shift;
5435c704 323 my @matches = grep /^$re=/, split /^/, $Config_SH;
9193ea20 324 @matches ? (print @matches) : print "$re: not found\n";
325}
326
3c81428c 327sub config_vars {
328 foreach(@_){
9193ea20 329 config_re($_), next if /\W/;
3c81428c 330 my $v=(exists $Config{$_}) ? $Config{$_} : 'UNKNOWN';
331 $v='undef' unless defined $v;
332 print "$_='$v';\n";
333 }
334}
335
9193ea20 336ENDOFEND
337
338if ($^O eq 'os2') {
339 print CONFIG <<'ENDOFSET';
340my %preconfig;
341if ($OS2::is_aout) {
5435c704 342 my ($value, $v) = $Config_SH =~ m/^used_aout='(.*)'\s*$/m;
9193ea20 343 for (split ' ', $value) {
5435c704 344 ($v) = $Config_SH =~ m/^aout_$_='(.*)'\s*$/m;
9193ea20 345 $preconfig{$_} = $v eq 'undef' ? undef : $v;
346 }
347}
764df951 348$preconfig{d_fork} = undef unless $OS2::can_fork; # Some funny cases can't
9193ea20 349sub TIEHASH { bless {%preconfig} }
350ENDOFSET
30500b05 351 # Extract the name of the DLL from the makefile to avoid duplication
352 my ($f) = grep -r, qw(GNUMakefile Makefile);
353 my $dll;
354 if (open my $fh, '<', $f) {
355 while (<$fh>) {
356 $dll = $1, last if /^PERL_DLL_BASE\s*=\s*(\S*)\s*$/;
357 }
358 }
359 print CONFIG <<ENDOFSET if $dll;
360\$preconfig{dll_name} = '$dll';
361ENDOFSET
9193ea20 362} else {
363 print CONFIG <<'ENDOFSET';
5435c704 364sub TIEHASH {
365 bless $_[1], $_[0];
366}
9193ea20 367ENDOFSET
368}
369
5435c704 370
371# Calculation for the keys for byteorder
372# This is somewhat grim, but I need to run fetch_string here.
373our $Config_SH = join "\n", @v_fast, @v_others;
374
375my $t = fetch_string ({}, 'ivtype');
376my $s = fetch_string ({}, 'ivsize');
377
378# byteorder does exist on its own but we overlay a virtual
379# dynamically recomputed value.
380
381# However, ivtype and ivsize will not vary for sane fat binaries
382
383my $f = $t eq 'long' ? 'L!' : $s == 8 ? 'Q': 'I';
384
385my $byteorder_code;
386if ($s == 4 || $s == 8) {
387
388 my $list = join ',', reverse(2..$s);
389 my $format = 'a'x$s;
390 $byteorder_code = <<"EOT";
391my \$i = 0;
392foreach my \$c ($list) { \$i |= ord(\$c); \$i <<= 8 }
393\$i |= ord(1);
394my \$value = join('', unpack('$format', pack('$f', \$i)));
395EOT
396} else {
397 $byteorder_code = "\$value = '?'x$s;\n";
398}
399
400my $fast_config = join '', map { " $_,\n" }
401 values (%v_fast), 'byteorder => $value' ;
402
403print CONFIG sprintf <<'ENDOFTIE', $byteorder_code, $fast_config;
9193ea20 404
fb73857a 405# avoid Config..Exporter..UNIVERSAL search for DESTROY then AUTOLOAD
406sub DESTROY { }
407
5435c704 408%s
409
410tie %%Config, 'Config', {
411%s
412};
9193ea20 413
3c81428c 4141;
5435c704 415ENDOFTIE
416
748a9306 417
5435c704 418open(CONFIG_POD, ">lib/Config.pod") or die "Can't open lib/Config.pod: $!";
419print CONFIG_POD <<'ENDOFTAIL';
3c81428c 420=head1 NAME
a0d0e21e 421
3c81428c 422Config - access Perl configuration information
423
424=head1 SYNOPSIS
425
426 use Config;
427 if ($Config{'cc'} =~ /gcc/) {
428 print "built by gcc\n";
429 }
430
431 use Config qw(myconfig config_sh config_vars);
432
433 print myconfig();
434
435 print config_sh();
436
437 config_vars(qw(osname archname));
438
439
440=head1 DESCRIPTION
441
442The Config module contains all the information that was available to
443the C<Configure> program at Perl build time (over 900 values).
444
445Shell variables from the F<config.sh> file (written by Configure) are
446stored in the readonly-variable C<%Config>, indexed by their names.
447
448Values stored in config.sh as 'undef' are returned as undefined
1fef88e7 449values. The perl C<exists> function can be used to check if a
3c81428c 450named variable exists.
451
452=over 4
453
454=item myconfig()
455
456Returns a textual summary of the major perl configuration values.
457See also C<-V> in L<perlrun/Switches>.
458
459=item config_sh()
460
461Returns the entire perl configuration information in the form of the
462original config.sh shell variable assignment script.
463
464=item config_vars(@names)
465
466Prints to STDOUT the values of the named configuration variable. Each is
467printed on a separate line in the form:
468
469 name='value';
470
471Names which are unknown are output as C<name='UNKNOWN';>.
472See also C<-V:name> in L<perlrun/Switches>.
473
474=back
475
476=head1 EXAMPLE
477
478Here's a more sophisticated example of using %Config:
479
480 use Config;
743c51bc 481 use strict;
482
483 my %sig_num;
484 my @sig_name;
485 unless($Config{sig_name} && $Config{sig_num}) {
486 die "No sigs?";
487 } else {
488 my @names = split ' ', $Config{sig_name};
489 @sig_num{@names} = split ' ', $Config{sig_num};
490 foreach (@names) {
491 $sig_name[$sig_num{$_}] ||= $_;
492 }
493 }
3c81428c 494
743c51bc 495 print "signal #17 = $sig_name[17]\n";
496 if ($sig_num{ALRM}) {
497 print "SIGALRM is $sig_num{ALRM}\n";
3c81428c 498 }
499
500=head1 WARNING
501
502Because this information is not stored within the perl executable
503itself it is possible (but unlikely) that the information does not
504relate to the actual perl binary which is being used to access it.
505
506The Config module is installed into the architecture and version
507specific library directory ($Config{installarchlib}) and it checks the
508perl version number when loaded.
509
435ec615 510The values stored in config.sh may be either single-quoted or
511double-quoted. Double-quoted strings are handy for those cases where you
512need to include escape sequences in the strings. To avoid runtime variable
513interpolation, any C<$> and C<@> characters are replaced by C<\$> and
514C<\@>, respectively. This isn't foolproof, of course, so don't embed C<\$>
515or C<\@> in double-quoted strings unless you're willing to deal with the
516consequences. (The slashes will end up escaped and the C<$> or C<@> will
517trigger variable interpolation)
518
ebc74a4b 519=head1 GLOSSARY
520
521Most C<Config> variables are determined by the C<Configure> script
522on platforms supported by it (which is most UNIX platforms). Some
523platforms have custom-made C<Config> variables, and may thus not have
524some of the variables described below, or may have extraneous variables
525specific to that particular port. See the port specific documentation
526in such cases.
527
ebc74a4b 528ENDOFTAIL
529
5435c704 530if ($Opts{glossary}) {
531 open(GLOS, "<$Glossary") or die "Can't open $Glossary: $!";
18f68570 532}
fb87c415 533%seen = ();
534$text = 0;
535$/ = '';
536
537sub process {
aade5aff 538 if (s/\A(\w*)\s+\(([\w.]+)\):\s*\n(\t?)/=item C<$1>\n\nFrom F<$2>:\n\n/m) {
539 my $c = substr $1, 0, 1;
540 unless ($seen{$c}++) {
5435c704 541 print CONFIG_POD <<EOF if $text;
fb87c415 542=back
ebc74a4b 543
fb87c415 544EOF
5435c704 545 print CONFIG_POD <<EOF;
fb87c415 546=head2 $c
547
bbc7dcd2 548=over 4
fb87c415 549
550EOF
aade5aff 551 $text = 1;
552 }
553 }
554 elsif (!$text || !/\A\t/) {
555 warn "Expected a Configure variable header",
556 ($text ? " or another paragraph of description" : () );
fb87c415 557 }
558 s/n't/n\00t/g; # leave can't, won't etc untouched
9b22980b 559 s/^\t\s+(.*)/\n$1/gm; # Indented lines ===> new paragraph
fb87c415 560 s/^(?<!\n\n)\t(.*)/$1/gm; # Not indented lines ===> text
561 s{([\'\"])(?=[^\'\"\s]*[./][^\'\"\s]*\1)([^\'\"\s]+)\1}(F<$2>)g; # '.o'
562 s{([\'\"])([^\'\"\s]+)\1}(C<$2>)g; # "date" command
563 s{\'([A-Za-z_\- *=/]+)\'}(C<$1>)g; # 'ln -s'
564 s{
565 (?<! [\w./<\'\"] ) # Only standalone file names
566 (?! e \. g \. ) # Not e.g.
567 (?! \. \. \. ) # Not ...
568 (?! \d ) # Not 5.004
a1151a3c 569 (?! read/ ) # Not read/write
570 (?! etc\. ) # Not etc.
571 (?! I/O ) # Not I/O
572 (
573 \$ ? # Allow leading $
574 [\w./]* [./] [\w./]* # Require . or / inside
575 )
576 (?<! \. (?= [\s)] ) ) # Do not include trailing dot
fb87c415 577 (?! [\w/] ) # Include all of it
578 }
579 (F<$1>)xg; # /usr/local
580 s/((?<=\s)~\w*)/F<$1>/g; # ~name
581 s/(?<![.<\'\"])\b([A-Z_]{2,})\b(?![\'\"])/C<$1>/g; # UNISTD
582 s/(?<![.<\'\"])\b(?!the\b)(\w+)\s+macro\b/C<$1> macro/g; # FILE_cnt macro
583 s/n[\0]t/n't/g; # undo can't, won't damage
ebc74a4b 584}
585
5435c704 586if ($Opts{glossary}) {
7701ffb5 587 <GLOS>; # Skip the "DO NOT EDIT"
588 <GLOS>; # Skip the preamble
18f68570 589 while (<GLOS>) {
590 process;
5435c704 591 print CONFIG_POD;
18f68570 592 }
fb87c415 593}
ebc74a4b 594
5435c704 595print CONFIG_POD <<'ENDOFTAIL';
ebc74a4b 596
597=back
598
3c81428c 599=head1 NOTE
600
601This module contains a good example of how to use tie to implement a
602cache and an example of how to make a tied variable readonly to those
603outside of it.
604
605=cut
a0d0e21e 606
9193ea20 607ENDOFTAIL
a0d0e21e 608
609close(CONFIG);
ebc74a4b 610close(GLOS);
5435c704 611close(CONFIG_POD);
a0d0e21e 612
18f68570 613# Now create Cross.pm if needed
5435c704 614if ($Opts{cross}) {
18f68570 615 open CROSS, ">lib/Cross.pm" or die "Can not open >lib/Cross.pm: $!";
47bcb90d 616 my $cross = <<'EOS';
617# typical invocation:
618# perl -MCross Makefile.PL
619# perl -MCross=wince -V:cc
620package Cross;
621
622sub import {
623 my ($package,$platform) = @_;
624 unless (defined $platform) {
625 # if $platform is not specified, then use last one when
626 # 'configpm; was invoked with --cross option
627 $platform = '***replace-marker***';
628 }
629 @INC = map {/\blib\b/?(do{local $_=$_;s/\blib\b/xlib\/$platform/;$_},$_):($_)} @INC;
e2a02c1e 630 $::Cross::platform = $platform;
18f68570 631}
47bcb90d 632
18f68570 6331;
634EOS
5435c704 635 $cross =~ s/\*\*\*replace-marker\*\*\*/$Opts{cross}/g;
47bcb90d 636 print CROSS $cross;
18f68570 637 close CROSS;
638}
639
a0d0e21e 640# Now do some simple tests on the Config.pm file we have created
641unshift(@INC,'lib');
5435c704 642require $Config_PM;
a0d0e21e 643import Config;
644
5435c704 645die "$0: $Config_PM not valid"
a02608de 646 unless $Config{'PERL_CONFIG_SH'} eq 'true';
a0d0e21e 647
5435c704 648die "$0: error processing $Config_PM"
a0d0e21e 649 if defined($Config{'an impossible name'})
a02608de 650 or $Config{'PERL_CONFIG_SH'} ne 'true' # test cache
a0d0e21e 651 ;
652
5435c704 653die "$0: error processing $Config_PM"
a0d0e21e 654 if eval '$Config{"cc"} = 1'
655 or eval 'delete $Config{"cc"}'
656 ;
657
658
85e6fe83 659exit 0;