3 # commonly used names to put first (and hence lookup fastest)
4 my %Common = map {($_,$_)}
5 qw(archname osname osvers prefix libs libpth
6 dynamic_ext static_ext dlsrc so
8 privlibexp archlibexp installprivlib installarchlib
9 sharpbang startsh shsharp
12 # names of things which may need to have slashes changed to double-colons
13 my %Extensions = map {($_,$_)}
14 qw(dynamic_ext static_ext extensions known_extensions);
16 # allowed opts as well as specifies default and initial values
18 'cross' => '', # --cross=PALTFORM - crosscompiling for PLATFORM
19 'glossary' => 1, # --no-glossary - no glossary file inclusion,
24 # user specified options
27 (map {/^--([\-_\w]+)=(.*)$/} @ARGV),
28 # --opt --no-opt --noopt
29 (map {/^no-?(.*)$/i?($1=>0):($_=>1)} map {/^--([\-_\w]+)$/} @ARGV),
32 my %opts = (%Allowed_Opts, %given_opts);
34 for my $opt (grep {!exists $Allowed_Opts{$_}} keys %given_opts) {
35 die "option '$opt' is not recognized";
37 @ARGV = grep {!/^--/} @ARGV;
46 my $Glossary = $ARGV[1] || 'Porting/Glossary';
49 # creating cross-platform config file
51 mkdir "xlib/$Opts{cross}";
52 $Config_PM = $ARGV[0] || "xlib/$Opts{cross}/Config.pm";
55 $Config_PM = $ARGV[0] || 'lib/Config.pm';
59 open CONFIG, ">$Config_PM" or die "Can't open $Config_PM: $!\n";
61 my $myver = sprintf "v%vd", $^V;
63 printf 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.
69 @EXPORT = qw(%%Config);
70 @EXPORT_OK = qw(myconfig config_sh config_vars);
72 # Define our own import method to avoid pulling in the full Exporter:
75 @_ = @EXPORT unless @_;
77 my @func = grep {$_ ne '%%Config'} @_;
78 local $Exporter::ExportLevel = 1;
79 Exporter::import('Config', @func) if @func;
81 return if @func == @_;
83 my $callpkg = caller(0);
84 *{"$callpkg\::Config"} = \%%Config;
87 die "Perl lib version (%s) doesn't match executable version ($])"
91 or die "Perl lib version (%s) doesn't match executable version (" .
92 (sprintf "v%vd",$^V) . ")";
104 # This is somewhat grim, but I want the code for parsing config.sh here and
105 # now so that I can expand $Config{ivsize} and $Config{ivtype}
107 my $fetch_string = <<'EOT';
109 # Search for it in the big string
111 my($self, $key) = @_;
113 my $quote_type = "'";
114 my $marker = "$key=";
116 # Check for the common case, ' delimeted
117 my $start = index($Config_SH, "\n$marker$quote_type");
118 # If that failed, check for " delimited
121 $start = index($Config_SH, "\n$marker$quote_type");
123 return undef if ( ($start == -1) && # in case it's first
124 (substr($Config_SH, 0, length($marker)) ne $marker) );
126 # It's the very first thing we found. Skip $start forward
127 # and figure out the quote mark after the =.
128 $start = length($marker) + 1;
129 $quote_type = substr($Config_SH, $start - 1, 1);
132 $start += length($marker) + 2;
135 my $value = substr($Config_SH, $start,
136 index($Config_SH, "$quote_type\n", $start) - $start);
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\"";
148 # So we can say "if $Config{'foo'}".
149 $value = undef if $value eq 'undef';
150 $self->{$key} = $value; # cache it
157 open(CONFIG_SH, 'config.sh') || die "Can't open config.sh: $!";
158 while (<CONFIG_SH>) {
159 next if m:^#!/bin/sh:;
161 # Catch PERL_CONFIG_SH=true and PERL_VERSION=n line from Configure.
162 my($k, $v) = s/^(\w+)=(true|\d+)\s*$/$1='$2'\n/;
164 # grandfather PATCHLEVEL and SUBVERSION and CONFIG
166 if ($k eq 'PERL_VERSION') {
167 push @v_others, "PATCHLEVEL='$v'\n";
169 elsif ($k eq 'PERL_SUBVERSION') {
170 push @v_others, "SUBVERSION='$v'\n";
172 elsif ($k eq 'PERL_CONFIG_SH') {
173 push @v_others, "CONFIG='$v'\n";
177 # We can delimit things in config.sh with either ' or ".
178 unless ($in_v or m/^(\w+)=(['"])(.*\n)/){
179 push(@non_v, "#$_"); # not a name='value' line
187 ($name,$val) = ($1,$3);
189 $in_v = $val !~ /$quote\n/;
192 s,/,::,g if $Extensions{$name};
194 $val =~ s/$quote\n?\z//;
196 my $line = "$name=$quote$val$quote\n";
197 if (!$Common{$name}){
198 push(@v_others, $line);
201 push(@v_fast, $line);
202 $v_fast{$name} = "'$name' => $quote$val$quote";
207 print CONFIG @non_v, "\n";
209 # copy config summary format from the myconfig.SH script
210 print CONFIG "my \$summary = <<'!END!';\n";
211 open(MYCONFIG,"<myconfig.SH") || die "open myconfig.SH failed: $!";
212 1 while defined($_ = <MYCONFIG>) && !/^Summary of/;
213 do { print CONFIG $_ } until !defined($_ = <MYCONFIG>) || /^\s*$/;
216 print CONFIG "\n!END!\n", <<'EOT';
217 my $summary_expanded = 0;
220 return $summary if $summary_expanded;
221 $summary =~ s{\$(\w+)}
222 { my $c = $Config{$1}; defined($c) ? $c : 'undef' }ge;
223 $summary_expanded = 1;
227 our $Config_SH : shared = <<'!END!';
230 print CONFIG join("", @v_fast, sort @v_others);
232 print CONFIG "!END!\n", $fetch_string;
234 print CONFIG <<'ENDOFEND';
237 my($self, $key) = @_;
241 if ($key =~ /^((?:cc|ld)flags|libs(?:wanted)?)_nolargefiles/) {
242 # These are purely virtual, they do not exist, but need to
243 # be computed on demand for largefile-incapable extensions.
244 my $new_key = "${1}_uselargefiles";
245 $value = $Config{$1};
246 my $withlargefiles = $Config{$new_key};
247 if ($new_key =~ /^(?:cc|ld)flags_/) {
248 $value =~ s/\Q$withlargefiles\E\b//;
249 } elsif ($new_key =~ /^libs/) {
250 my @lflibswanted = split(' ', $Config{libswanted_uselargefiles});
253 @lflibswanted{@lflibswanted} = ();
254 if ($new_key =~ /^libs_/) {
255 my @libs = grep { /^-l(.+)/ &&
256 not exists $lflibswanted{$1} }
257 split(' ', $Config{libs});
258 $Config{libs} = join(' ', @libs);
259 } elsif ($new_key =~ /^libswanted_/) {
260 my @libswanted = grep { not exists $lflibswanted{$_} }
261 split(' ', $Config{libswanted});
262 $Config{libswanted} = join(' ', @libswanted);
268 $self->{$key} = $value;
272 my($self, $key) = @_;
274 # check for cached value (which may be undef so we use exists not defined)
275 return $self->{$key} if exists $self->{$key};
277 $self->fetch_string($key);
278 return $self->{$key} if exists $self->{$key};
279 $self->fetch_virtual($key);
281 # Might not exist, in which undef is correct.
282 return $self->{$key};
289 substr($Config_SH, 0, index($Config_SH, '=') );
293 # Find out how the current key's quoted so we can skip to its end.
294 my $quote = substr($Config_SH, index($Config_SH, "=", $prevpos)+1, 1);
295 my $pos = index($Config_SH, qq($quote\n), $prevpos) + 2;
296 my $len = index($Config_SH, "=", $pos) - $pos;
298 $len > 0 ? substr($Config_SH, $pos, $len) : undef;
302 return 1 if exists($_[0]->{$_[1]});
304 return(index($Config_SH, "\n$_[1]='") != -1 or
305 substr($Config_SH, 0, length($_[1])+2) eq "$_[1]='" or
306 index($Config_SH, "\n$_[1]=\"") != -1 or
307 substr($Config_SH, 0, length($_[1])+2) eq "$_[1]=\"" or
308 $_[1] =~ /^(?:(?:cc|ld)flags|libs(?:wanted)?)_nolargefiles$/
312 sub STORE { die "\%Config::Config is read-only\n" }
323 my @matches = grep /^$re=/, split /^/, $Config_SH;
324 @matches ? (print @matches) : print "$re: not found\n";
329 config_re($_), next if /\W/;
330 my $v=(exists $Config{$_}) ? $Config{$_} : 'UNKNOWN';
331 $v='undef' unless defined $v;
339 print CONFIG <<'ENDOFSET';
342 my ($value, $v) = $Config_SH =~ m/^used_aout='(.*)'\s*$/m;
343 for (split ' ', $value) {
344 ($v) = $Config_SH =~ m/^aout_$_='(.*)'\s*$/m;
345 $preconfig{$_} = $v eq 'undef' ? undef : $v;
348 $preconfig{d_fork} = undef unless $OS2::can_fork; # Some funny cases can't
349 sub TIEHASH { bless {%preconfig} }
351 # Extract the name of the DLL from the makefile to avoid duplication
352 my ($f) = grep -r, qw(GNUMakefile Makefile);
354 if (open my $fh, '<', $f) {
356 $dll = $1, last if /^PERL_DLL_BASE\s*=\s*(\S*)\s*$/;
359 print CONFIG <<ENDOFSET if $dll;
360 \$preconfig{dll_name} = '$dll';
363 print CONFIG <<'ENDOFSET';
371 # Calculation for the keys for byteorder
372 # This is somewhat grim, but I need to run fetch_string here.
373 our $Config_SH = join "\n", @v_fast, @v_others;
375 my $t = fetch_string ({}, 'ivtype');
376 my $s = fetch_string ({}, 'ivsize');
378 # byteorder does exist on its own but we overlay a virtual
379 # dynamically recomputed value.
381 # However, ivtype and ivsize will not vary for sane fat binaries
383 my $f = $t eq 'long' ? 'L!' : $s == 8 ? 'Q': 'I';
386 if ($s == 4 || $s == 8) {
388 my $list = join ',', reverse(2..$s);
390 $byteorder_code = <<"EOT";
392 foreach my \$c ($list) { \$i |= ord(\$c); \$i <<= 8 }
394 my \$value = join('', unpack('$format', pack('$f', \$i)));
397 $byteorder_code = "\$value = '?'x$s;\n";
400 my $fast_config = join '', map { " $_,\n" }
401 values (%v_fast), 'byteorder => $value' ;
403 print CONFIG sprintf <<'ENDOFTIE', $byteorder_code, $fast_config;
405 # avoid Config..Exporter..UNIVERSAL search for DESTROY then AUTOLOAD
410 tie %%Config, 'Config', {
418 open(CONFIG_POD, ">lib/Config.pod") or die "Can't open lib/Config.pod: $!";
419 print CONFIG_POD <<'ENDOFTAIL';
422 Config - access Perl configuration information
427 if ($Config{'cc'} =~ /gcc/) {
428 print "built by gcc\n";
431 use Config qw(myconfig config_sh config_vars);
437 config_vars(qw(osname archname));
442 The Config module contains all the information that was available to
443 the C<Configure> program at Perl build time (over 900 values).
445 Shell variables from the F<config.sh> file (written by Configure) are
446 stored in the readonly-variable C<%Config>, indexed by their names.
448 Values stored in config.sh as 'undef' are returned as undefined
449 values. The perl C<exists> function can be used to check if a
450 named variable exists.
456 Returns a textual summary of the major perl configuration values.
457 See also C<-V> in L<perlrun/Switches>.
461 Returns the entire perl configuration information in the form of the
462 original config.sh shell variable assignment script.
464 =item config_vars(@names)
466 Prints to STDOUT the values of the named configuration variable. Each is
467 printed on a separate line in the form:
471 Names which are unknown are output as C<name='UNKNOWN';>.
472 See also C<-V:name> in L<perlrun/Switches>.
478 Here's a more sophisticated example of using %Config:
485 unless($Config{sig_name} && $Config{sig_num}) {
488 my @names = split ' ', $Config{sig_name};
489 @sig_num{@names} = split ' ', $Config{sig_num};
491 $sig_name[$sig_num{$_}] ||= $_;
495 print "signal #17 = $sig_name[17]\n";
496 if ($sig_num{ALRM}) {
497 print "SIGALRM is $sig_num{ALRM}\n";
502 Because this information is not stored within the perl executable
503 itself it is possible (but unlikely) that the information does not
504 relate to the actual perl binary which is being used to access it.
506 The Config module is installed into the architecture and version
507 specific library directory ($Config{installarchlib}) and it checks the
508 perl version number when loaded.
510 The values stored in config.sh may be either single-quoted or
511 double-quoted. Double-quoted strings are handy for those cases where you
512 need to include escape sequences in the strings. To avoid runtime variable
513 interpolation, any C<$> and C<@> characters are replaced by C<\$> and
514 C<\@>, respectively. This isn't foolproof, of course, so don't embed C<\$>
515 or C<\@> in double-quoted strings unless you're willing to deal with the
516 consequences. (The slashes will end up escaped and the C<$> or C<@> will
517 trigger variable interpolation)
521 Most C<Config> variables are determined by the C<Configure> script
522 on platforms supported by it (which is most UNIX platforms). Some
523 platforms have custom-made C<Config> variables, and may thus not have
524 some of the variables described below, or may have extraneous variables
525 specific to that particular port. See the port specific documentation
530 if ($Opts{glossary}) {
531 open(GLOS, "<$Glossary") or die "Can't open $Glossary: $!";
538 if (s/\A(\w*)\s+\(([\w.]+)\):\s*\n(\t?)/=item C<$1>\n\nFrom F<$2>:\n\n/m) {
539 my $c = substr $1, 0, 1;
540 unless ($seen{$c}++) {
541 print CONFIG_POD <<EOF if $text;
545 print CONFIG_POD <<EOF;
554 elsif (!$text || !/\A\t/) {
555 warn "Expected a Configure variable header",
556 ($text ? " or another paragraph of description" : () );
558 s/n't/n\00t/g; # leave can't, won't etc untouched
559 s/^\t\s+(.*)/\n$1/gm; # Indented lines ===> new paragraph
560 s/^(?<!\n\n)\t(.*)/$1/gm; # Not indented lines ===> text
561 s{([\'\"])(?=[^\'\"\s]*[./][^\'\"\s]*\1)([^\'\"\s]+)\1}(F<$2>)g; # '.o'
562 s{([\'\"])([^\'\"\s]+)\1}(C<$2>)g; # "date" command
563 s{\'([A-Za-z_\- *=/]+)\'}(C<$1>)g; # 'ln -s'
565 (?<! [\w./<\'\"] ) # Only standalone file names
566 (?! e \. g \. ) # Not e.g.
567 (?! \. \. \. ) # Not ...
569 (?! read/ ) # Not read/write
570 (?! etc\. ) # Not etc.
573 \$ ? # Allow leading $
574 [\w./]* [./] [\w./]* # Require . or / inside
576 (?<! \. (?= [\s)] ) ) # Do not include trailing dot
577 (?! [\w/] ) # Include all of it
579 (F<$1>)xg; # /usr/local
580 s/((?<=\s)~\w*)/F<$1>/g; # ~name
581 s/(?<![.<\'\"])\b([A-Z_]{2,})\b(?![\'\"])/C<$1>/g; # UNISTD
582 s/(?<![.<\'\"])\b(?!the\b)(\w+)\s+macro\b/C<$1> macro/g; # FILE_cnt macro
583 s/n[\0]t/n't/g; # undo can't, won't damage
586 if ($Opts{glossary}) {
587 <GLOS>; # Skip the "DO NOT EDIT"
588 <GLOS>; # Skip the preamble
595 print CONFIG_POD <<'ENDOFTAIL';
601 This module contains a good example of how to use tie to implement a
602 cache and an example of how to make a tied variable readonly to those
613 # Now create Cross.pm if needed
615 open CROSS, ">lib/Cross.pm" or die "Can not open >lib/Cross.pm: $!";
617 # typical invocation:
618 # perl -MCross Makefile.PL
619 # perl -MCross=wince -V:cc
623 my ($package,$platform) = @_;
624 unless (defined $platform) {
625 # if $platform is not specified, then use last one when
626 # 'configpm; was invoked with --cross option
627 $platform = '***replace-marker***';
629 @INC = map {/\blib\b/?(do{local $_=$_;s/\blib\b/xlib\/$platform/;$_},$_):($_)} @INC;
630 $::Cross::platform = $platform;
635 $cross =~ s/\*\*\*replace-marker\*\*\*/$Opts{cross}/g;
640 # Now do some simple tests on the Config.pm file we have created
645 die "$0: $Config_PM not valid"
646 unless $Config{'PERL_CONFIG_SH'} eq 'true';
648 die "$0: error processing $Config_PM"
649 if defined($Config{'an impossible name'})
650 or $Config{'PERL_CONFIG_SH'} ne 'true' # test cache
653 die "$0: error processing $Config_PM"
654 if eval '$Config{"cc"} = 1'
655 or eval 'delete $Config{"cc"}'