3 $config_pm = $ARGV[0] || 'lib/Config.pm';
6 # list names to put first (and hence lookup fastest)
7 @fast = qw(archname osname osvers prefix libs libpth
8 dynamic_ext static_ext extensions dlsrc so
9 sig_name sig_num cc ccflags cppflags
10 privlibexp archlibexp installprivlib installarchlib
11 sharpbang startsh shsharp
14 # names of things which may need to have slashes changed to double-colons
15 @extensions = qw(dynamic_ext static_ext extensions known_extensions);
18 open CONFIG, ">$config_pm" or die "Can't open $config_pm: $!\n";
21 print CONFIG <<"ENDOFBEG";
25 \@EXPORT = qw(%Config);
26 \@EXPORT_OK = qw(myconfig config_sh config_vars);
29 or die "Perl lib version ($myver) doesn't match executable version (\$])";
31 # This file was created by configpm when Perl was built. Any changes
32 # made to this file will be lost the next time perl is built.
38 @extensions{@extensions} = @extensions;
45 next if m:^#!/bin/sh:;
46 # Catch CONFIG=true and PATCHLEVEL=n line from Configure.
47 s/^(\w+)=(true|\d+)\s*$/$1='$2'\n/;
48 unless ($in_v or m/^(\w+)='(.*\n)/){
49 push(@non_v, "#$_"); # not a name='value' line
52 if ($in_v) { $val .= $_; }
53 else { ($name,$val) = ($1,$2); }
54 $in_v = $val !~ /'\n/;
56 if ($extensions{$name}) { s,/,::,g }
57 if (!$fast{$name}){ push(@v_others, "$name='$val"); next; }
58 push(@v_fast,"$name='$val");
61 foreach(@non_v){ print CONFIG $_ }
64 "my \$config_sh = <<'!END!';\n",
65 join("", @v_fast, sort @v_others),
68 # copy config summary format from the myconfig script
70 print CONFIG "my \$summary = <<'!END!';\n";
72 open(MYCONFIG,"<myconfig") || die "open myconfig failed: $!";
73 1 while defined($_ = <MYCONFIG>) && !/^Summary of/;
74 do { print CONFIG $_ } until !defined($_ = <MYCONFIG>) || /^\s*$/;
77 print CONFIG "\n!END!\n", <<'EOT';
78 my $summary_expanded = 0;
81 return $summary if $summary_expanded;
82 $summary =~ s{\$(\w+)}
83 { my $c = $Config{$1}; defined($c) ? $c : 'undef' }ge;
84 $summary_expanded = 1;
91 print CONFIG <<'ENDOFEND';
94 # check for cached value (which may be undef so we use exists not defined)
95 return $_[0]->{$_[1]} if (exists $_[0]->{$_[1]});
97 # Search for it in the big string
98 my($value, $start, $marker);
100 # return undef unless (($value) = $config_sh =~ m/^$_[1]='(.*)'\s*$/m);
101 $start = index($config_sh, "\n$marker");
102 return undef if ( ($start == -1) && # in case it's first
103 (substr($config_sh, 0, length($marker)) ne $marker) );
104 if ($start == -1) { $start = length($marker) }
105 else { $start += length($marker) + 1 }
106 $value = substr($config_sh, $start,
107 index($config_sh, qq('\n), $start) - $start);
109 $value = undef if $value eq 'undef'; # So we can say "if $Config{'foo'}".
110 $_[0]->{$_[1]} = $value; # cache it
118 # my($key) = $config_sh =~ m/^(.*?)=/;
119 substr($config_sh, 0, index($config_sh, '=') );
124 my $pos = index($config_sh, qq('\n), $prevpos) + 2;
125 my $len = index($config_sh, "=", $pos) - $pos;
127 $len > 0 ? substr($config_sh, $pos, $len) : undef;
131 # exists($_[0]->{$_[1]}) or $config_sh =~ m/^$_[1]=/m;
132 exists($_[0]->{$_[1]}) or
133 index($config_sh, "\n$_[1]='") != -1 or
134 substr($config_sh, 0, length($_[1])+2) eq "$_[1]='";
137 sub STORE { die "\%Config::Config is read-only\n" }
138 sub DELETE { &STORE }
148 my @matches = ($config_sh =~ /^$re=.*\n/mg);
149 @matches ? (print @matches) : print "$re: not found\n";
154 config_re($_), next if /\W/;
155 my $v=(exists $Config{$_}) ? $Config{$_} : 'UNKNOWN';
156 $v='undef' unless defined $v;
164 print CONFIG <<'ENDOFSET';
167 my ($value, $v) = $config_sh =~ m/^used_aout='(.*)'\s*$/m;
168 for (split ' ', $value) {
169 ($v) = $config_sh =~ m/^aout_$_='(.*)'\s*$/m;
170 $preconfig{$_} = $v eq 'undef' ? undef : $v;
173 sub TIEHASH { bless {%preconfig} }
176 print CONFIG <<'ENDOFSET';
177 sub TIEHASH { bless {} }
181 print CONFIG <<'ENDOFTAIL';
183 # avoid Config..Exporter..UNIVERSAL search for DESTROY then AUTOLOAD
186 tie %Config, 'Config';
193 Config - access Perl configuration information
198 if ($Config{'cc'} =~ /gcc/) {
199 print "built by gcc\n";
202 use Config qw(myconfig config_sh config_vars);
208 config_vars(qw(osname archname));
213 The Config module contains all the information that was available to
214 the C<Configure> program at Perl build time (over 900 values).
216 Shell variables from the F<config.sh> file (written by Configure) are
217 stored in the readonly-variable C<%Config>, indexed by their names.
219 Values stored in config.sh as 'undef' are returned as undefined
220 values. The perl C<exists> function can be used to check if a
221 named variable exists.
227 Returns a textual summary of the major perl configuration values.
228 See also C<-V> in L<perlrun/Switches>.
232 Returns the entire perl configuration information in the form of the
233 original config.sh shell variable assignment script.
235 =item config_vars(@names)
237 Prints to STDOUT the values of the named configuration variable. Each is
238 printed on a separate line in the form:
242 Names which are unknown are output as C<name='UNKNOWN';>.
243 See also C<-V:name> in L<perlrun/Switches>.
249 Here's a more sophisticated example of using %Config:
256 unless($Config{sig_name} && $Config{sig_num}) {
259 my @names = split ' ', $Config{sig_name};
260 @sig_num{@names} = split ' ', $Config{sig_num};
262 $sig_name[$sig_num{$_}] ||= $_;
266 print "signal #17 = $sig_name[17]\n";
267 if ($sig_num{ALRM}) {
268 print "SIGALRM is $sig_num{ALRM}\n";
273 Because this information is not stored within the perl executable
274 itself it is possible (but unlikely) that the information does not
275 relate to the actual perl binary which is being used to access it.
277 The Config module is installed into the architecture and version
278 specific library directory ($Config{installarchlib}) and it checks the
279 perl version number when loaded.
283 This module contains a good example of how to use tie to implement a
284 cache and an example of how to make a tied variable readonly to those
293 # Now do some simple tests on the Config.pm file we have created
298 die "$0: $config_pm not valid"
299 unless $Config{'CONFIG'} eq 'true';
301 die "$0: error processing $config_pm"
302 if defined($Config{'an impossible name'})
303 or $Config{'CONFIG'} ne 'true' # test cache
306 die "$0: error processing $config_pm"
307 if eval '$Config{"cc"} = 1'
308 or eval 'delete $Config{"cc"}'