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