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 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;
44 next if m:^#!/bin/sh:;
45 # Catch CONFIG=true and PATCHLEVEL=n line from Configure.
46 s/^(\w+)=(true|\d+)\s*$/$1='$2'\n/;
47 unless (m/^(\w+)='(.*)'\s*$/){
48 push(@non_v, "#$_"); # not a name='value' line
52 if ($extensions{$name}) { s,/,::,g }
53 if (!$fast{$name}){ push(@v_others, $_); next; }
57 foreach(@non_v){ print CONFIG $_ }
60 "my \$config_sh = <<'!END!';\n",
61 join("", @v_fast, sort @v_others),
64 # copy config summary format from the myconfig script
66 print CONFIG "my \$summary = <<'!END!';\n";
68 open(MYCONFIG,"<myconfig") || die "open myconfig failed: $!";
69 1 while( ($_=<MYCONFIG>) !~ /^Summary of/);
70 do { print CONFIG $_ } until ($_ = <MYCONFIG>) =~ /^\s*$/;
73 print CONFIG "\n!END!\n", <<'EOT';
74 my $summary_expanded = 0;
77 return $summary if $summary_expanded;
78 $summary =~ s/\$(\w+)/$Config{$1}/ge;
79 $summary_expanded = 1;
86 print CONFIG <<'ENDOFEND';
89 # check for cached value (which may be undef so we use exists not defined)
90 return $_[0]->{$_[1]} if (exists $_[0]->{$_[1]});
92 # Search for it in the big string
93 my($value, $start, $marker);
95 # return undef unless (($value) = $config_sh =~ m/^$_[1]='(.*)'\s*$/m);
96 $start = index($config_sh, "\n$marker");
97 return undef if ( ($start == -1) && # in case it's first
98 (substr($config_sh, 0, length($marker)) ne $marker) );
99 if ($start == -1) { $start = length($marker) }
100 else { $start += length($marker) + 1 }
101 $value = substr($config_sh, $start,
102 index($config_sh, q('), $start) - $start);
104 $value = undef if $value eq 'undef'; # So we can say "if $Config{'foo'}".
105 $_[0]->{$_[1]} = $value; # cache it
113 # my($key) = $config_sh =~ m/^(.*?)=/;
114 substr($config_sh, 0, index($config_sh, '=') );
119 my $pos = index($config_sh, "\n", $prevpos) + 1;
120 my $len = index($config_sh, "=", $pos) - $pos;
122 $len > 0 ? substr($config_sh, $pos, $len) : undef;
126 # exists($_[0]->{$_[1]}) or $config_sh =~ m/^$_[1]=/m;
127 exists($_[0]->{$_[1]}) or
128 index($config_sh, "\n$_[1]='") != -1 or
129 substr($config_sh, 0, length($_[1])+2) eq "$_[1]='";
132 sub STORE { die "\%Config::Config is read-only\n" }
133 sub DELETE { &STORE }
143 my @matches = ($config_sh =~ /^$re=.*\n/mg);
144 @matches ? (print @matches) : print "$re: not found\n";
149 config_re($_), next if /\W/;
150 my $v=(exists $Config{$_}) ? $Config{$_} : 'UNKNOWN';
151 $v='undef' unless defined $v;
159 print CONFIG <<'ENDOFSET';
162 my ($value, $v) = $config_sh =~ m/^used_aout='(.*)'\s*$/m;
163 for (split ' ', $value) {
164 ($v) = $config_sh =~ m/^aout_$_='(.*)'\s*$/m;
165 $preconfig{$_} = $v eq 'undef' ? undef : $v;
168 sub TIEHASH { bless {%preconfig} }
171 print CONFIG <<'ENDOFSET';
172 sub TIEHASH { bless {} }
176 print CONFIG <<'ENDOFTAIL';
178 tie %Config, 'Config';
185 Config - access Perl configuration information
190 if ($Config{'cc'} =~ /gcc/) {
191 print "built by gcc\n";
194 use Config qw(myconfig config_sh config_vars);
200 config_vars(qw(osname archname));
205 The Config module contains all the information that was available to
206 the C<Configure> program at Perl build time (over 900 values).
208 Shell variables from the F<config.sh> file (written by Configure) are
209 stored in the readonly-variable C<%Config>, indexed by their names.
211 Values stored in config.sh as 'undef' are returned as undefined
212 values. The perl C<exists> function can be used to check if a
213 named variable exists.
219 Returns a textual summary of the major perl configuration values.
220 See also C<-V> in L<perlrun/Switches>.
224 Returns the entire perl configuration information in the form of the
225 original config.sh shell variable assignment script.
227 =item config_vars(@names)
229 Prints to STDOUT the values of the named configuration variable. Each is
230 printed on a separate line in the form:
234 Names which are unknown are output as C<name='UNKNOWN';>.
235 See also C<-V:name> in L<perlrun/Switches>.
241 Here's a more sophisticated example of using %Config:
245 defined $Config{sig_name} || die "No sigs?";
246 foreach $name (split(' ', $Config{sig_name})) {
248 $signame[$i] = $name;
252 print "signal #17 = $signame[17]\n";
254 print "SIGALRM is $signo{ALRM}\n";
259 Because this information is not stored within the perl executable
260 itself it is possible (but unlikely) that the information does not
261 relate to the actual perl binary which is being used to access it.
263 The Config module is installed into the architecture and version
264 specific library directory ($Config{installarchlib}) and it checks the
265 perl version number when loaded.
269 This module contains a good example of how to use tie to implement a
270 cache and an example of how to make a tied variable readonly to those
279 # Now do some simple tests on the Config.pm file we have created
284 die "$0: $config_pm not valid"
285 unless $Config{'CONFIG'} eq 'true';
287 die "$0: error processing $config_pm"
288 if defined($Config{'an impossible name'})
289 or $Config{'CONFIG'} ne 'true' # test cache
292 die "$0: error processing $config_pm"
293 if eval '$Config{"cc"} = 1'
294 or eval 'delete $Config{"cc"}'