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