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