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