This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
typo fixes for root level scripts
[perl5.git] / configpm
CommitLineData
a0d0e21e 1#!./miniperl -w
962e59f3
DM
2#
3# configpm
4#
8ed6d636
VK
5# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
6# 2002, 2003, 2004, 2005, 2006, 2007 Larry Wall and others.
962e59f3
DM
7#
8#
9# Regenerate the files
10#
11# lib/Config.pm
12# lib/Config_heavy.pl
13# lib/Config.pod
14# lib/Cross.pm (optionally)
15#
8ed6d636 16#
962e59f3
DM
17# from the contents of the static files
18#
19# Porting/Glossary
20# myconfig.SH
21#
22# and from the contents of the Configure-generated file
23#
24# config.sh
25#
8ed6d636
VK
26# Note that output directory is xlib/[cross-name]/ for cross-compiling
27#
962e59f3
DM
28# It will only update Config.pm and Config_heavy.pl if the contents of
29# either file would be different. Note that *both* files are updated in
30# this case, since for example an extension makefile that has a dependency
31# on Config.pm should trigger even if only Config_heavy.pl has changed.
32
33sub usage { die <<EOF }
d2d98f31 34usage: $0 [ options ]
962e59f3
DM
35 --cross=PLATFORM cross-compile for a different platform
36 --no-glossary don't include Porting/Glossary in lib/Config.pod
4e73d6a4 37 --chdir=dir change directory before writing files
962e59f3
DM
38EOF
39
2f4f46ad
NC
40use strict;
41use vars qw(%Config $Config_SH_expanded);
8990e307 42
a8e1d30b
NC
43my $how_many_common = 22;
44
45# commonly used names to precache (and hence lookup fastest)
46my %Common;
47
48while ($how_many_common--) {
49 $_ = <DATA>;
50 chomp;
51 /^(\S+):\s*(\d+)$/ or die "Malformed line '$_'";
52 $Common{$1} = $1;
53}
5435c704 54
d50f1408
NC
55# Post 37589e1eefb1bd62 DynaLoader defaults to reading these at runtime.
56# Ideally we're redo the data below, but Fotango's build system made it
57# wonderfully easy to instrument, and no longer exists.
58$Common{$_} = $_ foreach qw(dlext so);
59
5435c704
NC
60# names of things which may need to have slashes changed to double-colons
61my %Extensions = map {($_,$_)}
62 qw(dynamic_ext static_ext extensions known_extensions);
63
1f0fc1c9
NC
64# The plan is that this information is used by ExtUtils::MakeMaker to generate
65# Makefile dependencies, rather than hardcoding a list, which has become out
66# of date. However, currently, MM_Unix.pm and MM_VMS.pm have *different* lists,
67# *and* descrip_mms.template doesn't actually install all the headers.
68# The "Unix" list seems to (attempt to) avoid the generated headers, which I'm
69# not sure is the right thing to do. Also, not certain whether it would be
70# easier to parse MANIFEST to get these (adding config.h, and potentially
71# removing others), but for now, stick to a hard coded list.
72
73# Could use a map to add ".h", but I suspect that it's easier to use literals,
74# so that anyone using grep will find them
75# This is the list from MM_VMS, plus pad.h, parser.h, perlsfio.h utf8.h
76# which it installs. It *doesn't* install perliol.h - FIXME.
77my @header_files = qw(EXTERN.h INTERN.h XSUB.h av.h config.h cop.h cv.h
4d3a042d 78 embed.h embedvar.h form.h gv.h handy.h hv.h hv_func.h intrpvar.h
1f0fc1c9
NC
79 iperlsys.h keywords.h mg.h nostdio.h op.h opcode.h
80 pad.h parser.h patchlevel.h perl.h perlio.h perlsdio.h
81 perlsfio.h perlvars.h perly.h pp.h pp_proto.h proto.h
82 regcomp.h regexp.h regnodes.h scope.h sv.h thread.h utf8.h
83 util.h);
84
1f0fc1c9
NC
85push @header_files,
86 $^O eq 'VMS' ? 'vmsish.h' : qw(dosish.h perliol.h time64.h unixish.h);
87
88my $header_files = ' return qw(' . join(' ', sort @header_files) . ');';
89$header_files =~ s/(?=.{64}) # If line is still overlength
90 (.{1,64})\ # Split at the last convenient space
91 /$1\n /gx;
92
5435c704
NC
93# allowed opts as well as specifies default and initial values
94my %Allowed_Opts = (
2d9d8159
NC
95 'cross' => '', # --cross=PLATFORM - crosscompiling for PLATFORM
96 'glossary' => 1, # --no-glossary - no glossary file inclusion,
5435c704 97 # for compactness
4e73d6a4 98 'chdir' => '', # --chdir=dir - change directory before writing files
18f68570 99);
18f68570 100
5435c704
NC
101sub opts {
102 # user specified options
103 my %given_opts = (
104 # --opt=smth
105 (map {/^--([\-_\w]+)=(.*)$/} @ARGV),
106 # --opt --no-opt --noopt
107 (map {/^no-?(.*)$/i?($1=>0):($_=>1)} map {/^--([\-_\w]+)$/} @ARGV),
108 );
109
110 my %opts = (%Allowed_Opts, %given_opts);
111
112 for my $opt (grep {!exists $Allowed_Opts{$_}} keys %given_opts) {
962e59f3
DM
113 warn "option '$opt' is not recognized";
114 usage;
5435c704
NC
115 }
116 @ARGV = grep {!/^--/} @ARGV;
117
118 return %opts;
119}
18f68570 120
5435c704
NC
121
122my %Opts = opts();
123
4e73d6a4
NC
124if ($Opts{chdir}) {
125 chdir $Opts{chdir} or die "$0: could not chdir $Opts{chdir}: $!"
126}
127
8ed6d636 128my ($Config_SH, $Config_PM, $Config_heavy, $Config_POD);
d2d98f31 129my $Glossary = 'Porting/Glossary';
5435c704
NC
130
131if ($Opts{cross}) {
18f68570
VK
132 # creating cross-platform config file
133 mkdir "xlib";
5435c704 134 mkdir "xlib/$Opts{cross}";
d2d98f31 135 $Config_PM = "xlib/$Opts{cross}/Config.pm";
8ed6d636
VK
136 $Config_POD = "xlib/$Opts{cross}/Config.pod";
137 $Config_SH = "Cross/config-$Opts{cross}.sh";
18f68570
VK
138}
139else {
d2d98f31 140 $Config_PM = "lib/Config.pm";
8ed6d636
VK
141 $Config_POD = "lib/Config.pod";
142 $Config_SH = "config.sh";
18f68570 143}
d2d98f31
VK
144($Config_heavy = $Config_PM) =~ s/\.pm$/_heavy.pl/;
145die "Can't automatically determine name for Config_heavy.pl from '$Config_PM'"
146 if $Config_heavy eq $Config_PM;
8990e307 147
962e59f3
DM
148my $config_txt;
149my $heavy_txt;
2d9d8159 150
f0b0a4d2
NC
151my $from = $^O eq 'VMS' ? 'PERLSHR image' : 'binary (from libperl)';
152my $env_cygwin = $^O eq 'cygwin'
153 ? 'push @env, "CYGWIN=\"$ENV{CYGWIN}\"" if $ENV{CYGWIN};' . "\n" : "";
154$heavy_txt .= sprintf <<'ENDOFBEG', $^O, $^O, $from, $^O, $env_cygwin;
2d9d8159
NC
155# This file was created by configpm when Perl was built. Any changes
156# made to this file will be lost the next time perl is built.
157
158package Config;
159use strict;
9fe67fcb 160use warnings;
f711619f 161use vars '%%Config';
4a5df386 162
3acb769b 163sub bincompat_options {
102bfa85 164 return split ' ', (Internals::V())[0];
3acb769b
NC
165}
166
167sub non_bincompat_options {
102bfa85 168 return split ' ', (Internals::V())[1];
3acb769b
NC
169}
170
171sub compile_date {
172 return (Internals::V())[2]
173}
174
175sub local_patches {
176 my (undef, undef, undef, @patches) = Internals::V();
177 return @patches;
178}
179
4a5df386 180sub _V {
f0b0a4d2
NC
181 die "Perl lib was built for '%s' but is being run on '$^O'"
182 unless "%s" eq $^O;
183
2dc296d2 184 my ($bincompat, $non_bincompat, $date, @patches) = Internals::V();
4a5df386
NC
185
186 my $opts = join ' ', sort split ' ', "$bincompat $non_bincompat";
187
188 # wrap at 76 columns.
189
190 $opts =~ s/(?=.{53})(.{1,53}) /$1\n /mg;
191
192 print Config::myconfig();
f0b0a4d2 193 print "\nCharacteristics of this %s: \n";
4a5df386
NC
194
195 print " Compile-time options: $opts\n";
196
197 if (@patches) {
198 print " Locally applied patches:\n";
199 print "\t$_\n" foreach @patches;
200 }
201
f0b0a4d2 202 print " Built under %s\n";
4a5df386
NC
203
204 print " $date\n" if defined $date;
205
f711619f 206 my @env = map { "$_=\"$ENV{$_}\"" } sort grep {/^PERL/} keys %%ENV;
f0b0a4d2 207%s
4a5df386 208 if (@env) {
f711619f 209 print " \%%ENV:\n";
4a5df386
NC
210 print " $_\n" foreach @env;
211 }
212 print " \@INC:\n";
213 print " $_\n" foreach @INC;
214}
215
1f0fc1c9 216sub header_files {
2d9d8159 217ENDOFBEG
fec02dd3 218
1f0fc1c9
NC
219$heavy_txt .= $header_files . "\n}\n\n";
220
c6b7b56c 221my $export_funcs = <<'EOT';
9fe67fcb
NC
222my %Export_Cache = (myconfig => 1, config_sh => 1, config_vars => 1,
223 config_re => 1, compile_date => 1, local_patches => 1,
3acb769b 224 bincompat_options => 1, non_bincompat_options => 1,
1f0fc1c9 225 header_files => 1);
c6b7b56c 226EOT
a0d0e21e 227
c6b7b56c
NC
228my %export_ok = eval $export_funcs or die;
229
c7a7bc4d 230$config_txt .= sprintf << 'EOT', $], $export_funcs;
5435c704
NC
231# This file was created by configpm when Perl was built. Any changes
232# made to this file will be lost the next time perl is built.
3c81428c 233
3acf89b2
MB
234# for a description of the variables, please have a look at the
235# Glossary file, as written in the Porting folder, or use the url:
236# http://perl5.git.perl.org/perl.git/blob/HEAD:/Porting/Glossary
237
8990e307 238package Config;
2f4f46ad 239use strict;
9fe67fcb 240use warnings;
c7a7bc4d
DG
241use vars '%%Config', '$VERSION';
242
243$VERSION = "%s";
c6b7b56c
NC
244
245# Skip @Config::EXPORT because it only contains %%Config, which we special
246# case below as it's not a function. @Config::EXPORT won't change in the
247# lifetime of Perl 5.
248%s
2f4f46ad 249@Config::EXPORT = qw(%%Config);
c6b7b56c 250@Config::EXPORT_OK = keys %%Export_Cache;
a48f8c77 251
43d06990
NC
252# Need to stub all the functions to make code such as print Config::config_sh
253# keep working
254
c6b7b56c 255EOT
43d06990 256
c6b7b56c 257$config_txt .= "sub $_;\n" foreach sort keys %export_ok;
2f4f46ad 258
c6b7b56c
NC
259my $myver = sprintf "%vd", $^V;
260
261$config_txt .= sprintf <<'ENDOFBEG', ($myver) x 3;
e3d0cac0
IZ
262
263# Define our own import method to avoid pulling in the full Exporter:
264sub import {
a5094cb0 265 shift;
2f4f46ad 266 @_ = @Config::EXPORT unless @_;
5435c704 267
a48f8c77
MS
268 my @funcs = grep $_ ne '%%Config', @_;
269 my $export_Config = @funcs < @_ ? 1 : 0;
5435c704 270
2f4f46ad 271 no strict 'refs';
a48f8c77
MS
272 my $callpkg = caller(0);
273 foreach my $func (@funcs) {
a5094cb0
NC
274 die qq{"$func" is not exported by the Config module\n}
275 unless $Export_Cache{$func};
a48f8c77
MS
276 *{$callpkg.'::'.$func} = \&{$func};
277 }
5435c704 278
a48f8c77
MS
279 *{"$callpkg\::Config"} = \%%Config if $export_Config;
280 return;
e3d0cac0
IZ
281}
282
b982c5de 283die "Perl lib version (%s) doesn't match executable '$0' version ($])"
5435c704 284 unless $^V;
de98c553 285
5435c704 286$^V eq %s
b982c5de 287 or die "Perl lib version (%s) doesn't match executable '$0' version (" .
a48f8c77 288 sprintf("v%%vd",$^V) . ")";
a0d0e21e 289
8990e307
LW
290ENDOFBEG
291
16d20bd9 292
5435c704 293my @non_v = ();
5435c704
NC
294my @v_others = ();
295my $in_v = 0;
296my %Data = ();
ebf3760c 297my $quote;
5435c704 298
a0d0e21e 299
1a9ca827 300my %seen_quotes;
2f4f46ad
NC
301{
302 my ($name, $val);
8ed6d636 303 open(CONFIG_SH, $Config_SH) || die "Can't open $Config_SH: $!";
2f4f46ad 304 while (<CONFIG_SH>) {
a0d0e21e 305 next if m:^#!/bin/sh:;
5435c704 306
a02608de 307 # Catch PERL_CONFIG_SH=true and PERL_VERSION=n line from Configure.
d4de4258 308 s/^(\w+)=(true|\d+)\s*$/$1='$2'\n/ or m/^(\w+)='(.*)'$/;
3905a40f 309 my($k, $v) = ($1, $2);
5435c704 310
2000072c 311 # grandfather PATCHLEVEL and SUBVERSION and CONFIG
cceca5ed
GS
312 if ($k) {
313 if ($k eq 'PERL_VERSION') {
314 push @v_others, "PATCHLEVEL='$v'\n";
315 }
316 elsif ($k eq 'PERL_SUBVERSION') {
317 push @v_others, "SUBVERSION='$v'\n";
318 }
a02608de 319 elsif ($k eq 'PERL_CONFIG_SH') {
2000072c
JH
320 push @v_others, "CONFIG='$v'\n";
321 }
cceca5ed 322 }
5435c704 323
435ec615
HM
324 # We can delimit things in config.sh with either ' or ".
325 unless ($in_v or m/^(\w+)=(['"])(.*\n)/){
a0d0e21e
LW
326 push(@non_v, "#$_"); # not a name='value' line
327 next;
328 }
5435c704
NC
329 if ($in_v) {
330 $val .= $_;
331 }
332 else {
ebf3760c 333 $quote = $2;
5435c704
NC
334 ($name,$val) = ($1,$3);
335 }
435ec615 336 $in_v = $val !~ /$quote\n/;
44a8e56a 337 next if $in_v;
a0d0e21e 338
5435c704 339 s,/,::,g if $Extensions{$name};
a0d0e21e 340
5435c704 341 $val =~ s/$quote\n?\z//;
3c81428c 342
5435c704 343 my $line = "$name=$quote$val$quote\n";
deeea481 344 push(@v_others, $line);
1a9ca827 345 $seen_quotes{$quote}++;
2f4f46ad
NC
346 }
347 close CONFIG_SH;
5435c704 348}
2f4f46ad 349
1a9ca827
NC
350# This is somewhat grim, but I want the code for parsing config.sh here and
351# now so that I can expand $Config{ivsize} and $Config{ivtype}
352
353my $fetch_string = <<'EOT';
354
355# Search for it in the big string
356sub fetch_string {
357 my($self, $key) = @_;
358
359EOT
360
361if ($seen_quotes{'"'}) {
362 # We need the full ' and " code
1a9ca827 363
b46acf92
NC
364$fetch_string .= <<'EOT';
365 return undef unless my ($quote_type, $value) = $Config_SH_expanded =~ /\n$key=(['"])(.*?)\1\n/s;
1a9ca827
NC
366
367 # If we had a double-quote, we'd better eval it so escape
368 # sequences and such can be interpolated. Since the incoming
369 # value is supposed to follow shell rules and not perl rules,
370 # we escape any perl variable markers
b46acf92
NC
371
372 # Historically, since " 'support' was added in change 1409, the
373 # interpolation was done before the undef. Stick to this arguably buggy
374 # behaviour as we're refactoring.
1a9ca827
NC
375 if ($quote_type eq '"') {
376 $value =~ s/\$/\\\$/g;
377 $value =~ s/\@/\\\@/g;
378 eval "\$value = \"$value\"";
379 }
b46acf92
NC
380
381 # So we can say "if $Config{'foo'}".
382 $self->{$key} = $value eq 'undef' ? undef : $value; # cache it
1a9ca827 383}
b46acf92
NC
384EOT
385
386} else {
2effe01f 387 # We only have ' delimited.
b46acf92 388
1a9ca827 389$fetch_string .= <<'EOT';
b46acf92 390 return undef unless $Config_SH_expanded =~ /\n$key=\'(.*?)\'\n/s;
1a9ca827 391 # So we can say "if $Config{'foo'}".
b46acf92 392 $self->{$key} = $1 eq 'undef' ? undef : $1;
1a9ca827
NC
393}
394EOT
395
b46acf92
NC
396}
397
1a9ca827
NC
398eval $fetch_string;
399die if $@;
3c81428c 400
8468119f
NC
401# Calculation for the keys for byteorder
402# This is somewhat grim, but I need to run fetch_string here.
deeea481 403our $Config_SH_expanded = join "\n", '', @v_others;
8468119f
NC
404
405my $t = fetch_string ({}, 'ivtype');
406my $s = fetch_string ({}, 'ivsize');
407
408# byteorder does exist on its own but we overlay a virtual
409# dynamically recomputed value.
410
411# However, ivtype and ivsize will not vary for sane fat binaries
412
413my $f = $t eq 'long' ? 'L!' : $s == 8 ? 'Q': 'I';
414
415my $byteorder_code;
416if ($s == 4 || $s == 8) {
4efc19b7 417 my $list = join ',', reverse(1..$s-1);
8468119f
NC
418 my $format = 'a'x$s;
419 $byteorder_code = <<"EOT";
2855b621 420
4efc19b7
NC
421my \$i = ord($s);
422foreach my \$c ($list) { \$i <<= 8; \$i |= ord(\$c); }
2d9d8159 423our \$byteorder = join('', unpack('$format', pack('$f', \$i)));
8468119f
NC
424EOT
425} else {
2d9d8159 426 $byteorder_code = "our \$byteorder = '?'x$s;\n";
8468119f
NC
427}
428
88fe16b2
NC
429my @need_relocation;
430
431if (fetch_string({},'userelocatableinc')) {
4d20abad
NC
432 foreach my $what (qw(prefixexp
433
434 archlibexp
435 html1direxp
436 html3direxp
437 man1direxp
438 man3direxp
91f668c3 439 privlibexp
4d20abad 440 scriptdirexp
91f668c3 441 sitearchexp
4d20abad
NC
442 sitebinexp
443 sitehtml1direxp
444 sitehtml3direxp
91f668c3 445 sitelibexp
4d20abad
NC
446 siteman1direxp
447 siteman3direxp
448 sitescriptexp
91f668c3 449 vendorarchexp
4d20abad
NC
450 vendorbinexp
451 vendorhtml1direxp
452 vendorhtml3direxp
91f668c3 453 vendorlibexp
4d20abad
NC
454 vendorman1direxp
455 vendorman3direxp
456 vendorscriptexp
457
458 siteprefixexp
459 sitelib_stem
1d230ada
NC
460 vendorlib_stem
461
462 installarchlib
463 installhtml1dir
464 installhtml3dir
465 installman1dir
466 installman3dir
467 installprefix
468 installprefixexp
469 installprivlib
470 installscript
471 installsitearch
472 installsitebin
473 installsitehtml1dir
474 installsitehtml3dir
475 installsitelib
476 installsiteman1dir
477 installsiteman3dir
478 installsitescript
479 installvendorarch
480 installvendorbin
481 installvendorhtml1dir
482 installvendorhtml3dir
483 installvendorlib
484 installvendorman1dir
485 installvendorman3dir
486 installvendorscript
487 )) {
88fe16b2
NC
488 push @need_relocation, $what if fetch_string({}, $what) =~ m!^\.\.\./!;
489 }
88fe16b2
NC
490}
491
492my %need_relocation;
493@need_relocation{@need_relocation} = @need_relocation;
494
91f668c3
NC
495# This can have .../ anywhere:
496if (fetch_string({}, 'otherlibdirs') =~ m!\.\.\./!) {
497 $need_relocation{otherlibdirs} = 'otherlibdirs';
498}
499
88fe16b2
NC
500my $relocation_code = <<'EOT';
501
502sub relocate_inc {
503 my $libdir = shift;
504 return $libdir unless $libdir =~ s!^\.\.\./!!;
505 my $prefix = $^X;
506 if ($prefix =~ s!/[^/]*$!!) {
507 while ($libdir =~ m!^\.\./!) {
508 # Loop while $libdir starts "../" and $prefix still has a trailing
509 # directory
510 last unless $prefix =~ s!/([^/]+)$!!;
511 # but bail out if the directory we picked off the end of $prefix is .
512 # or ..
513 if ($1 eq '.' or $1 eq '..') {
514 # Undo! This should be rare, hence code it this way rather than a
515 # check each time before the s!!! above.
516 $prefix = "$prefix/$1";
517 last;
518 }
519 # Remove that leading ../ and loop again
520 substr ($libdir, 0, 3, '');
521 }
522 $libdir = "$prefix/$libdir";
523 }
524 $libdir;
525}
526EOT
527
91f668c3 528if (%need_relocation) {
88fe16b2 529 my $relocations_in_common;
91f668c3
NC
530 # otherlibdirs only features in the hash
531 foreach (keys %need_relocation) {
88fe16b2
NC
532 $relocations_in_common++ if $Common{$_};
533 }
534 if ($relocations_in_common) {
962e59f3 535 $config_txt .= $relocation_code;
88fe16b2 536 } else {
962e59f3 537 $heavy_txt .= $relocation_code;
88fe16b2
NC
538 }
539}
540
962e59f3 541$heavy_txt .= join('', @non_v) . "\n";
3c81428c 542
5435c704 543# copy config summary format from the myconfig.SH script
962e59f3 544$heavy_txt .= "our \$summary = <<'!END!';\n";
3b5ca523 545open(MYCONFIG,"<myconfig.SH") || die "open myconfig.SH failed: $!";
54310121 5461 while defined($_ = <MYCONFIG>) && !/^Summary of/;
962e59f3 547do { $heavy_txt .= $_ } until !defined($_ = <MYCONFIG>) || /^\s*$/;
3c81428c 548close(MYCONFIG);
a0d0e21e 549
962e59f3 550$heavy_txt .= "\n!END!\n" . <<'EOT';
90ec21fb 551my $summary_expanded;
3c81428c
PP
552
553sub myconfig {
90ec21fb
EM
554 return $summary_expanded if $summary_expanded;
555 ($summary_expanded = $summary) =~ s{\$(\w+)}
46807d8e
YO
556 {
557 my $c;
558 if ($1 eq 'git_ancestor_line') {
559 if ($Config::Config{git_ancestor}) {
560 $c= "\n Ancestor: $Config::Config{git_ancestor}";
561 } else {
562 $c= "";
563 }
564 } else {
565 $c = $Config::Config{$1};
566 }
567 defined($c) ? $c : 'undef'
568 }ge;
90ec21fb 569 $summary_expanded;
3c81428c 570}
5435c704 571
8468119f
NC
572local *_ = \my $a;
573$_ = <<'!END!';
3c81428c
PP
574EOT
575
962e59f3 576$heavy_txt .= join('', sort @v_others) . "!END!\n";
2855b621
NC
577
578# Only need the dynamic byteorder code in Config.pm if 'byteorder' is one of
579# the precached keys
580if ($Common{byteorder}) {
962e59f3 581 $config_txt .= $byteorder_code;
2855b621 582} else {
962e59f3 583 $heavy_txt .= $byteorder_code;
2855b621 584}
5435c704 585
88fe16b2 586if (@need_relocation) {
962e59f3
DM
587$heavy_txt .= 'foreach my $what (qw(' . join (' ', @need_relocation) .
588 ")) {\n" . <<'EOT';
8d962fa1 589 s/^($what=)(['"])(.*?)\2/$1 . $2 . relocate_inc($3) . $2/me;
88fe16b2
NC
590}
591EOT
91f668c3
NC
592# Currently it only makes sense to do the ... relocation on Unix, so there's
593# no need to emulate the "which separator for this platform" logic in perl.c -
594# ':' will always be applicable
595if ($need_relocation{otherlibdirs}) {
962e59f3 596$heavy_txt .= << 'EOT';
91f668c3
NC
597s{^(otherlibdirs=)(['"])(.*?)\2}
598 {$1 . $2 . join ':', map {relocate_inc($_)} split ':', $3 . $2}me;
599EOT
600}
88fe16b2
NC
601}
602
962e59f3 603$heavy_txt .= <<'EOT';
2d9d8159 604s/(byteorder=)(['"]).*?\2/$1$2$Config::byteorder$2/m;
43d06990
NC
605
606my $config_sh_len = length $_;
3be00128 607
e935c5a4 608our $Config_SH_expanded = "\n$_" . << 'EOVIRTUAL';
8468119f
NC
609EOT
610
06482b90
NC
611foreach my $prefix (qw(ccflags ldflags)) {
612 my $value = fetch_string ({}, $prefix);
613 my $withlargefiles = fetch_string ({}, $prefix . "_uselargefiles");
27da23d5
JH
614 if (defined $withlargefiles) {
615 $value =~ s/\Q$withlargefiles\E\b//;
962e59f3 616 $heavy_txt .= "${prefix}_nolargefiles='$value'\n";
27da23d5 617 }
06482b90 618}
5435c704 619
06482b90
NC
620foreach my $prefix (qw(libs libswanted)) {
621 my $value = fetch_string ({}, $prefix);
27da23d5
JH
622 my $withlf = fetch_string ({}, 'libswanted_uselargefiles');
623 next unless defined $withlf;
06482b90
NC
624 my @lflibswanted
625 = split(' ', fetch_string ({}, 'libswanted_uselargefiles'));
626 if (@lflibswanted) {
627 my %lflibswanted;
628 @lflibswanted{@lflibswanted} = ();
629 if ($prefix eq 'libs') {
630 my @libs = grep { /^-l(.+)/ &&
631 not exists $lflibswanted{$1} }
632 split(' ', fetch_string ({}, 'libs'));
633 $value = join(' ', @libs);
634 } else {
635 my @libswanted = grep { not exists $lflibswanted{$_} }
636 split(' ', fetch_string ({}, 'libswanted'));
637 $value = join(' ', @libswanted);
4b2ec495 638 }
435ec615 639 }
962e59f3 640 $heavy_txt .= "${prefix}_nolargefiles='$value'\n";
5435c704
NC
641}
642
962e59f3 643$heavy_txt .= "EOVIRTUAL\n";
06482b90 644
46807d8e 645$heavy_txt .= <<'ENDOFGIT';
505afc73 646eval {
12d7e04d
YO
647 # do not have hairy conniptions if this isnt available
648 require 'Config_git.pl';
649 $Config_SH_expanded .= $Config::Git_Data;
505afc73
YO
650 1;
651} or warn "Warning: failed to load Config_git.pl, something strange about this perl...\n";
46807d8e
YO
652ENDOFGIT
653
962e59f3 654$heavy_txt .= $fetch_string;
06482b90 655
962e59f3 656$config_txt .= <<'ENDOFEND';
06482b90 657
2d9d8159 658sub FETCH {
5435c704
NC
659 my($self, $key) = @_;
660
661 # check for cached value (which may be undef so we use exists not defined)
9fe67fcb 662 return exists $self->{$key} ? $self->{$key} : $self->fetch_string($key);
a0d0e21e 663}
9fe67fcb 664
2d9d8159
NC
665ENDOFEND
666
962e59f3 667$heavy_txt .= <<'ENDOFEND';
1a9ca827 668
3c81428c
PP
669my $prevpos = 0;
670
a0d0e21e
LW
671sub FIRSTKEY {
672 $prevpos = 0;
2ddb7828 673 substr($Config_SH_expanded, 1, index($Config_SH_expanded, '=') - 1 );
a0d0e21e
LW
674}
675
676sub NEXTKEY {
1a9ca827
NC
677ENDOFEND
678if ($seen_quotes{'"'}) {
962e59f3 679$heavy_txt .= <<'ENDOFEND';
435ec615 680 # Find out how the current key's quoted so we can skip to its end.
3be00128
NC
681 my $quote = substr($Config_SH_expanded,
682 index($Config_SH_expanded, "=", $prevpos)+1, 1);
683 my $pos = index($Config_SH_expanded, qq($quote\n), $prevpos) + 2;
1a9ca827
NC
684ENDOFEND
685} else {
686 # Just ' quotes, so it's much easier.
962e59f3 687$heavy_txt .= <<'ENDOFEND';
1a9ca827
NC
688 my $pos = index($Config_SH_expanded, qq('\n), $prevpos) + 2;
689ENDOFEND
690}
962e59f3 691$heavy_txt .= <<'ENDOFEND';
3be00128 692 my $len = index($Config_SH_expanded, "=", $pos) - $pos;
a0d0e21e 693 $prevpos = $pos;
3be00128 694 $len > 0 ? substr($Config_SH_expanded, $pos, $len) : undef;
85e6fe83 695}
a0d0e21e 696
2ddb7828 697sub EXISTS {
5435c704
NC
698 return 1 if exists($_[0]->{$_[1]});
699
1a9ca827
NC
700 return(index($Config_SH_expanded, "\n$_[1]='") != -1
701ENDOFEND
702if ($seen_quotes{'"'}) {
962e59f3 703$heavy_txt .= <<'ENDOFEND';
1a9ca827
NC
704 or index($Config_SH_expanded, "\n$_[1]=\"") != -1
705ENDOFEND
706}
962e59f3 707$heavy_txt .= <<'ENDOFEND';
5435c704 708 );
a0d0e21e
LW
709}
710
3c81428c 711sub STORE { die "\%Config::Config is read-only\n" }
e736dcee 712*DELETE = *CLEAR = \*STORE; # Typeglob aliasing uses less space
3c81428c
PP
713
714sub config_sh {
43d06990 715 substr $Config_SH_expanded, 1, $config_sh_len;
748a9306 716}
9193ea20
PP
717
718sub config_re {
719 my $re = shift;
3be00128
NC
720 return map { chomp; $_ } grep eval{ /^(?:$re)=/ }, split /^/,
721 $Config_SH_expanded;
9193ea20
PP
722}
723
3c81428c 724sub config_vars {
307dc113 725 # implements -V:cfgvar option (see perlrun -V:)
a48f8c77 726 foreach (@_) {
307dc113 727 # find optional leading, trailing colons; and query-spec
4a305f6a 728 my ($notag,$qry,$lncont) = m/^(:)?(.*?)(:)?$/; # flags fore and aft,
307dc113
JC
729 # map colon-flags to print decorations
730 my $prfx = $notag ? '': "$qry="; # tag-prefix for print
731 my $lnend = $lncont ? ' ' : ";\n"; # line ending for print
4a305f6a 732
307dc113 733 # all config-vars are by definition \w only, any \W means regex
4a305f6a
JC
734 if ($qry =~ /\W/) {
735 my @matches = config_re($qry);
736 print map "$_$lnend", @matches ? @matches : "$qry: not found" if !$notag;
737 print map { s/\w+=//; "$_$lnend" } @matches ? @matches : "$qry: not found" if $notag;
a48f8c77 738 } else {
2d9d8159
NC
739 my $v = (exists $Config::Config{$qry}) ? $Config::Config{$qry}
740 : 'UNKNOWN';
a48f8c77 741 $v = 'undef' unless defined $v;
4a305f6a 742 print "${prfx}'${v}'$lnend";
a48f8c77 743 }
3c81428c
PP
744 }
745}
746
2d9d8159
NC
747# Called by the real AUTOLOAD
748sub launcher {
749 undef &AUTOLOAD;
750 goto \&$Config::AUTOLOAD;
751}
752
7531;
9193ea20
PP
754ENDOFEND
755
756if ($^O eq 'os2') {
962e59f3 757 $config_txt .= <<'ENDOFSET';
9193ea20
PP
758my %preconfig;
759if ($OS2::is_aout) {
3be00128 760 my ($value, $v) = $Config_SH_expanded =~ m/^used_aout='(.*)'\s*$/m;
9193ea20 761 for (split ' ', $value) {
3be00128 762 ($v) = $Config_SH_expanded =~ m/^aout_$_='(.*)'\s*$/m;
9193ea20
PP
763 $preconfig{$_} = $v eq 'undef' ? undef : $v;
764 }
765}
764df951 766$preconfig{d_fork} = undef unless $OS2::can_fork; # Some funny cases can't
9193ea20
PP
767sub TIEHASH { bless {%preconfig} }
768ENDOFSET
a48f8c77
MS
769 # Extract the name of the DLL from the makefile to avoid duplication
770 my ($f) = grep -r, qw(GNUMakefile Makefile);
771 my $dll;
772 if (open my $fh, '<', $f) {
773 while (<$fh>) {
774 $dll = $1, last if /^PERL_DLL_BASE\s*=\s*(\S*)\s*$/;
775 }
30500b05 776 }
962e59f3 777 $config_txt .= <<ENDOFSET if $dll;
30500b05
IZ
778\$preconfig{dll_name} = '$dll';
779ENDOFSET
9193ea20 780} else {
962e59f3 781 $config_txt .= <<'ENDOFSET';
5435c704
NC
782sub TIEHASH {
783 bless $_[1], $_[0];
784}
9193ea20
PP
785ENDOFSET
786}
787
a8e1d30b
NC
788foreach my $key (keys %Common) {
789 my $value = fetch_string ({}, $key);
790 # Is it safe on the LHS of => ?
791 my $qkey = $key =~ /^[A-Za-z_][A-Za-z0-9_]*$/ ? $key : "'$key'";
792 if (defined $value) {
793 # Quote things for a '' string
794 $value =~ s!\\!\\\\!g;
795 $value =~ s!'!\\'!g;
796 $value = "'$value'";
91f668c3
NC
797 if ($key eq 'otherlibdirs') {
798 $value = "join (':', map {relocate_inc(\$_)} split (':', $value))";
799 } elsif ($need_relocation{$key}) {
88fe16b2
NC
800 $value = "relocate_inc($value)";
801 }
a8e1d30b
NC
802 } else {
803 $value = "undef";
804 }
805 $Common{$key} = "$qkey => $value";
806}
2855b621
NC
807
808if ($Common{byteorder}) {
809 $Common{byteorder} = 'byteorder => $byteorder';
810}
811my $fast_config = join '', map { " $_,\n" } sort values %Common;
5435c704 812
e4d9df75
FC
813# Sanity check needed to stop an infinite loop if Config_heavy.pl fails to
814# define &launcher for some reason (eg it got truncated)
962e59f3 815$config_txt .= sprintf <<'ENDOFTIE', $fast_config;
9193ea20 816
fb73857a
PP
817sub DESTROY { }
818
2d9d8159 819sub AUTOLOAD {
c1b2b415 820 require 'Config_heavy.pl';
938af39e 821 goto \&launcher unless $Config::AUTOLOAD =~ /launcher$/;
2d9d8159
NC
822 die "&Config::AUTOLOAD failed on $Config::AUTOLOAD";
823}
824
2c165900 825# tie returns the object, so the value returned to require will be true.
5435c704 826tie %%Config, 'Config', {
a8e1d30b 827%s};
5435c704
NC
828ENDOFTIE
829
748a9306 830
8ed6d636 831open(CONFIG_POD, ">$Config_POD") or die "Can't open $Config_POD: $!";
5435c704 832print CONFIG_POD <<'ENDOFTAIL';
3c81428c 833=head1 NAME
a0d0e21e 834
3c81428c
PP
835Config - access Perl configuration information
836
837=head1 SYNOPSIS
838
839 use Config;
63f18be6
NC
840 if ($Config{usethreads}) {
841 print "has thread support\n"
3c81428c
PP
842 }
843
a48f8c77 844 use Config qw(myconfig config_sh config_vars config_re);
3c81428c
PP
845
846 print myconfig();
847
848 print config_sh();
849
a48f8c77
MS
850 print config_re();
851
3c81428c
PP
852 config_vars(qw(osname archname));
853
854
855=head1 DESCRIPTION
856
857The Config module contains all the information that was available to
858the C<Configure> program at Perl build time (over 900 values).
859
860Shell variables from the F<config.sh> file (written by Configure) are
861stored in the readonly-variable C<%Config>, indexed by their names.
862
863Values stored in config.sh as 'undef' are returned as undefined
1fef88e7 864values. The perl C<exists> function can be used to check if a
3c81428c
PP
865named variable exists.
866
3acf89b2
MB
867For a description of the variables, please have a look at the
868Glossary file, as written in the Porting folder, or use the url:
869http://perl5.git.perl.org/perl.git/blob/HEAD:/Porting/Glossary
870
3c81428c
PP
871=over 4
872
873=item myconfig()
874
875Returns a textual summary of the major perl configuration values.
2788353a 876See also C<-V> in L<perlrun/Command Switches>.
3c81428c
PP
877
878=item config_sh()
879
880Returns the entire perl configuration information in the form of the
881original config.sh shell variable assignment script.
882
a48f8c77
MS
883=item config_re($regex)
884
885Like config_sh() but returns, as a list, only the config entries who's
886names match the $regex.
887
3c81428c
PP
888=item config_vars(@names)
889
890Prints to STDOUT the values of the named configuration variable. Each is
891printed on a separate line in the form:
892
893 name='value';
894
895Names which are unknown are output as C<name='UNKNOWN';>.
2788353a 896See also C<-V:name> in L<perlrun/Command Switches>.
3c81428c 897
3acb769b
NC
898=item bincompat_options()
899
900Returns a list of C pre-processor options used when compiling this F<perl>
901binary, which affect its binary compatibility with extensions.
902C<bincompat_options()> and C<non_bincompat_options()> are shown together in
903the output of C<perl -V> as I<Compile-time options>.
904
905=item non_bincompat_options()
906
907Returns a list of C pre-processor options used when compiling this F<perl>
908binary, which do not affect binary compatibility with extensions.
909
910=item compile_date()
911
912Returns the compile date (as a string), equivalent to what is shown by
913C<perl -V>
914
915=item local_patches()
916
917Returns a list of the names of locally applied patches, equivalent to what
918is shown by C<perl -V>.
919
1f0fc1c9
NC
920=item header_files()
921
922Returns a list of the header files that should be used as dependencies for
923XS code, for this version of Perl on this platform.
924
3c81428c
PP
925=back
926
927=head1 EXAMPLE
928
929Here's a more sophisticated example of using %Config:
930
931 use Config;
743c51bc
WK
932 use strict;
933
934 my %sig_num;
935 my @sig_name;
936 unless($Config{sig_name} && $Config{sig_num}) {
937 die "No sigs?";
938 } else {
939 my @names = split ' ', $Config{sig_name};
940 @sig_num{@names} = split ' ', $Config{sig_num};
941 foreach (@names) {
942 $sig_name[$sig_num{$_}] ||= $_;
943 }
944 }
3c81428c 945
743c51bc
WK
946 print "signal #17 = $sig_name[17]\n";
947 if ($sig_num{ALRM}) {
948 print "SIGALRM is $sig_num{ALRM}\n";
3c81428c
PP
949 }
950
951=head1 WARNING
952
953Because this information is not stored within the perl executable
954itself it is possible (but unlikely) that the information does not
955relate to the actual perl binary which is being used to access it.
956
957The Config module is installed into the architecture and version
958specific library directory ($Config{installarchlib}) and it checks the
959perl version number when loaded.
960
435ec615
HM
961The values stored in config.sh may be either single-quoted or
962double-quoted. Double-quoted strings are handy for those cases where you
963need to include escape sequences in the strings. To avoid runtime variable
964interpolation, any C<$> and C<@> characters are replaced by C<\$> and
965C<\@>, respectively. This isn't foolproof, of course, so don't embed C<\$>
966or C<\@> in double-quoted strings unless you're willing to deal with the
967consequences. (The slashes will end up escaped and the C<$> or C<@> will
968trigger variable interpolation)
969
ebc74a4b
GS
970=head1 GLOSSARY
971
972Most C<Config> variables are determined by the C<Configure> script
973on platforms supported by it (which is most UNIX platforms). Some
974platforms have custom-made C<Config> variables, and may thus not have
975some of the variables described below, or may have extraneous variables
976specific to that particular port. See the port specific documentation
977in such cases.
978
c90cd22b
RGS
979=cut
980
ebc74a4b
GS
981ENDOFTAIL
982
5435c704
NC
983if ($Opts{glossary}) {
984 open(GLOS, "<$Glossary") or die "Can't open $Glossary: $!";
18f68570 985}
2f4f46ad
NC
986my %seen = ();
987my $text = 0;
fb87c415
IZ
988$/ = '';
989
990sub process {
aade5aff
YST
991 if (s/\A(\w*)\s+\(([\w.]+)\):\s*\n(\t?)/=item C<$1>\n\nFrom F<$2>:\n\n/m) {
992 my $c = substr $1, 0, 1;
993 unless ($seen{$c}++) {
5435c704 994 print CONFIG_POD <<EOF if $text;
fb87c415 995=back
ebc74a4b 996
c90cd22b
RGS
997=cut
998
fb87c415 999EOF
5435c704 1000 print CONFIG_POD <<EOF;
fb87c415
IZ
1001=head2 $c
1002
bbc7dcd2 1003=over 4
fb87c415 1004
c90cd22b
RGS
1005=cut
1006
fb87c415 1007EOF
aade5aff
YST
1008 $text = 1;
1009 }
1010 }
1011 elsif (!$text || !/\A\t/) {
1012 warn "Expected a Configure variable header",
1013 ($text ? " or another paragraph of description" : () );
fb87c415
IZ
1014 }
1015 s/n't/n\00t/g; # leave can't, won't etc untouched
9b22980b 1016 s/^\t\s+(.*)/\n$1/gm; # Indented lines ===> new paragraph
fb87c415
IZ
1017 s/^(?<!\n\n)\t(.*)/$1/gm; # Not indented lines ===> text
1018 s{([\'\"])(?=[^\'\"\s]*[./][^\'\"\s]*\1)([^\'\"\s]+)\1}(F<$2>)g; # '.o'
1019 s{([\'\"])([^\'\"\s]+)\1}(C<$2>)g; # "date" command
1020 s{\'([A-Za-z_\- *=/]+)\'}(C<$1>)g; # 'ln -s'
1021 s{
1022 (?<! [\w./<\'\"] ) # Only standalone file names
1023 (?! e \. g \. ) # Not e.g.
1024 (?! \. \. \. ) # Not ...
1025 (?! \d ) # Not 5.004
a1151a3c
RGS
1026 (?! read/ ) # Not read/write
1027 (?! etc\. ) # Not etc.
1028 (?! I/O ) # Not I/O
1029 (
1030 \$ ? # Allow leading $
1031 [\w./]* [./] [\w./]* # Require . or / inside
1032 )
1033 (?<! \. (?= [\s)] ) ) # Do not include trailing dot
fb87c415
IZ
1034 (?! [\w/] ) # Include all of it
1035 }
1036 (F<$1>)xg; # /usr/local
1037 s/((?<=\s)~\w*)/F<$1>/g; # ~name
1038 s/(?<![.<\'\"])\b([A-Z_]{2,})\b(?![\'\"])/C<$1>/g; # UNISTD
1039 s/(?<![.<\'\"])\b(?!the\b)(\w+)\s+macro\b/C<$1> macro/g; # FILE_cnt macro
1040 s/n[\0]t/n't/g; # undo can't, won't damage
ebc74a4b
GS
1041}
1042
5435c704 1043if ($Opts{glossary}) {
7701ffb5
JH
1044 <GLOS>; # Skip the "DO NOT EDIT"
1045 <GLOS>; # Skip the preamble
18f68570
VK
1046 while (<GLOS>) {
1047 process;
5435c704 1048 print CONFIG_POD;
18f68570 1049 }
fb87c415 1050}
ebc74a4b 1051
5435c704 1052print CONFIG_POD <<'ENDOFTAIL';
ebc74a4b
GS
1053
1054=back
1055
58ab6743
RS
1056=head1 GIT DATA
1057
1058Information on the git commit from which the current perl binary was compiled
1059can be found in the variable C<$Config::Git_Data>. The variable is a
1060structured string that looks something like this:
1061
1062 git_commit_id='ea0c2dbd5f5ac6845ecc7ec6696415bf8e27bd52'
1063 git_describe='GitLive-blead-1076-gea0c2db'
1064 git_branch='smartmatch'
1065 git_uncommitted_changes=''
1066 git_commit_id_title='Commit id:'
1067 git_commit_date='2009-05-09 17:47:31 +0200'
1068
1069Its format is not guaranteed not to change over time.
1070
3c81428c
PP
1071=head1 NOTE
1072
1073This module contains a good example of how to use tie to implement a
1074cache and an example of how to make a tied variable readonly to those
1075outside of it.
1076
1077=cut
a0d0e21e 1078
9193ea20 1079ENDOFTAIL
a0d0e21e 1080
962e59f3 1081close(GLOS) if $Opts{glossary};
5435c704 1082close(CONFIG_POD);
8ed6d636 1083print "written $Config_POD\n";
962e59f3
DM
1084
1085my $orig_config_txt = "";
1086my $orig_heavy_txt = "";
1087{
1088 local $/;
1089 my $fh;
1090 $orig_config_txt = <$fh> if open $fh, "<", $Config_PM;
1091 $orig_heavy_txt = <$fh> if open $fh, "<", $Config_heavy;
1092}
1093
1094if ($orig_config_txt ne $config_txt or $orig_heavy_txt ne $heavy_txt) {
1095 open CONFIG, ">", $Config_PM or die "Can't open $Config_PM: $!\n";
1096 open CONFIG_HEAVY, ">", $Config_heavy or die "Can't open $Config_heavy: $!\n";
1097 print CONFIG $config_txt;
1098 print CONFIG_HEAVY $heavy_txt;
1099 close(CONFIG_HEAVY);
1100 close(CONFIG);
1101 print "updated $Config_PM\n";
1102 print "updated $Config_heavy\n";
1103}
1104
a0d0e21e 1105
18f68570 1106# Now create Cross.pm if needed
5435c704 1107if ($Opts{cross}) {
18f68570 1108 open CROSS, ">lib/Cross.pm" or die "Can not open >lib/Cross.pm: $!";
47bcb90d
VK
1109 my $cross = <<'EOS';
1110# typical invocation:
1111# perl -MCross Makefile.PL
1112# perl -MCross=wince -V:cc
1113package Cross;
1114
1115sub import {
1116 my ($package,$platform) = @_;
1117 unless (defined $platform) {
1118 # if $platform is not specified, then use last one when
1119 # 'configpm; was invoked with --cross option
1120 $platform = '***replace-marker***';
1121 }
1122 @INC = map {/\blib\b/?(do{local $_=$_;s/\blib\b/xlib\/$platform/;$_},$_):($_)} @INC;
e2a02c1e 1123 $::Cross::platform = $platform;
18f68570 1124}
47bcb90d 1125
18f68570
VK
11261;
1127EOS
5435c704 1128 $cross =~ s/\*\*\*replace-marker\*\*\*/$Opts{cross}/g;
47bcb90d 1129 print CROSS $cross;
18f68570 1130 close CROSS;
962e59f3 1131 print "written lib/Cross.pm\n";
42d1cefd 1132 unshift(@INC,"xlib/$Opts{cross}");
18f68570
VK
1133}
1134
a0d0e21e
LW
1135# Now do some simple tests on the Config.pm file we have created
1136unshift(@INC,'lib');
27da23d5 1137unshift(@INC,'xlib/symbian') if $Opts{cross};
5435c704 1138require $Config_PM;
13bce055 1139require $Config_heavy;
a0d0e21e
LW
1140import Config;
1141
5435c704 1142die "$0: $Config_PM not valid"
a02608de 1143 unless $Config{'PERL_CONFIG_SH'} eq 'true';
a0d0e21e 1144
5435c704 1145die "$0: error processing $Config_PM"
a0d0e21e 1146 if defined($Config{'an impossible name'})
a02608de 1147 or $Config{'PERL_CONFIG_SH'} ne 'true' # test cache
a0d0e21e
LW
1148 ;
1149
5435c704 1150die "$0: error processing $Config_PM"
a0d0e21e
LW
1151 if eval '$Config{"cc"} = 1'
1152 or eval 'delete $Config{"cc"}'
1153 ;
1154
1155
85e6fe83 1156exit 0;
a8e1d30b
NC
1157# Popularity of various entries in %Config, based on a large build and test
1158# run of code in the Fotango build system:
1159__DATA__
1160path_sep: 8490
1161d_readlink: 7101
1162d_symlink: 7101
1163archlibexp: 4318
1164sitearchexp: 4305
1165sitelibexp: 4305
1166privlibexp: 4163
1167ldlibpthname: 4041
1168libpth: 2134
1169archname: 1591
1170exe_ext: 1256
1171scriptdir: 1155
1172version: 1116
1173useithreads: 1002
1174osvers: 982
1175osname: 851
1176inc_version_list: 783
1177dont_use_nlink: 779
1178intsize: 759
1179usevendorprefix: 642
1180dlsrc: 624
1181cc: 541
1182lib_ext: 520
1183so: 512
1184ld: 501
1185ccdlflags: 500
1186ldflags: 495
1187obj_ext: 495
1188cccdlflags: 493
1189lddlflags: 493
1190ar: 492
1191dlext: 492
1192libc: 492
1193ranlib: 492
1194full_ar: 491
1195vendorarchexp: 491
1196vendorlibexp: 491
1197installman1dir: 489
1198installman3dir: 489
1199installsitebin: 489
1200installsiteman1dir: 489
1201installsiteman3dir: 489
1202installvendorman1dir: 489
1203installvendorman3dir: 489
1204d_flexfnam: 474
1205eunicefix: 360
1206d_link: 347
1207installsitearch: 344
1208installscript: 341
1209installprivlib: 337
1210binexp: 336
1211installarchlib: 336
1212installprefixexp: 336
1213installsitelib: 336
1214installstyle: 336
1215installvendorarch: 336
1216installvendorbin: 336
1217installvendorlib: 336
1218man1ext: 336
1219man3ext: 336
1220sh: 336
1221siteprefixexp: 336
1222installbin: 335
1223usedl: 332
1224ccflags: 285
1225startperl: 232
1226optimize: 231
1227usemymalloc: 229
1228cpprun: 228
1229sharpbang: 228
1230perllibs: 225
1231usesfio: 224
1232usethreads: 220
1233perlpath: 218
1234extensions: 217
1235usesocks: 208
1236shellflags: 198
1237make: 191
1238d_pwage: 189
1239d_pwchange: 189
1240d_pwclass: 189
1241d_pwcomment: 189
1242d_pwexpire: 189
1243d_pwgecos: 189
1244d_pwpasswd: 189
1245d_pwquota: 189
1246gccversion: 189
1247libs: 186
1248useshrplib: 186
1249cppflags: 185
1250ptrsize: 185
1251shrpenv: 185
1252static_ext: 185
1253use5005threads: 185
1254uselargefiles: 185
1255alignbytes: 184
1256byteorder: 184
1257ccversion: 184
1258config_args: 184
1259cppminus: 184