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;
89 $summary =~ s/\$(\w+)/$Config{$1}/ge;
90 $summary_expanded = 1;
97 print CONFIG <<'ENDOFEND';
100 # check for cached value (which may be undef so we use exists not defined)
101 return $_[0]->{$_[1]} if (exists $_[0]->{$_[1]});
103 # Search for it in the big string
104 my($value, $start, $marker);
106 # return undef unless (($value) = $config_sh =~ m/^$_[1]='(.*)'\s*$/m);
107 $start = index($config_sh, "\n$marker");
108 return undef if ( ($start == -1) && # in case it's first
109 (substr($config_sh, 0, length($marker)) ne $marker) );
110 if ($start == -1) { $start = length($marker) }
111 else { $start += length($marker) + 1 }
112 $value = substr($config_sh, $start,
113 index($config_sh, qq('\n), $start) - $start);
115 $value = undef if $value eq 'undef'; # So we can say "if $Config{'foo'}".
116 $_[0]->{$_[1]} = $value; # cache it
124 # my($key) = $config_sh =~ m/^(.*?)=/;
125 substr($config_sh, 0, index($config_sh, '=') );
130 my $pos = index($config_sh, qq('\n), $prevpos) + 2;
131 my $len = index($config_sh, "=", $pos) - $pos;
133 $len > 0 ? substr($config_sh, $pos, $len) : undef;
137 # exists($_[0]->{$_[1]}) or $config_sh =~ m/^$_[1]=/m;
138 exists($_[0]->{$_[1]}) or
139 index($config_sh, "\n$_[1]='") != -1 or
140 substr($config_sh, 0, length($_[1])+2) eq "$_[1]='";
143 sub STORE { die "\%Config::Config is read-only\n" }
144 sub DELETE { &STORE }
154 my @matches = ($config_sh =~ /^$re=.*\n/mg);
155 @matches ? (print @matches) : print "$re: not found\n";
160 config_re($_), next if /\W/;
161 my $v=(exists $Config{$_}) ? $Config{$_} : 'UNKNOWN';
162 $v='undef' unless defined $v;
170 print CONFIG <<'ENDOFSET';
173 my ($value, $v) = $config_sh =~ m/^used_aout='(.*)'\s*$/m;
174 for (split ' ', $value) {
175 ($v) = $config_sh =~ m/^aout_$_='(.*)'\s*$/m;
176 $preconfig{$_} = $v eq 'undef' ? undef : $v;
179 sub TIEHASH { bless {%preconfig} }
182 print CONFIG <<'ENDOFSET';
183 sub TIEHASH { bless {} }
187 print CONFIG <<'ENDOFTAIL';
189 tie %Config, 'Config';
196 Config - access Perl configuration information
201 if ($Config{'cc'} =~ /gcc/) {
202 print "built by gcc\n";
205 use Config qw(myconfig config_sh config_vars);
211 config_vars(qw(osname archname));
216 The Config module contains all the information that was available to
217 the C<Configure> program at Perl build time (over 900 values).
219 Shell variables from the F<config.sh> file (written by Configure) are
220 stored in the readonly-variable C<%Config>, indexed by their names.
222 Values stored in config.sh as 'undef' are returned as undefined
223 values. The perl C<exists> function can be used to check if a
224 named variable exists.
230 Returns a textual summary of the major perl configuration values.
231 See also C<-V> in L<perlrun/Switches>.
235 Returns the entire perl configuration information in the form of the
236 original config.sh shell variable assignment script.
238 =item config_vars(@names)
240 Prints to STDOUT the values of the named configuration variable. Each is
241 printed on a separate line in the form:
245 Names which are unknown are output as C<name='UNKNOWN';>.
246 See also C<-V:name> in L<perlrun/Switches>.
252 Here's a more sophisticated example of using %Config:
259 unless($Config{sig_name} && $Config{sig_num}) {
262 my @names = split ' ', $Config{sig_name};
263 @sig_num{@names} = split ' ', $Config{sig_num};
265 $sig_name[$sig_num{$_}] ||= $_;
269 print "signal #17 = $sig_name[17]\n";
270 if ($sig_num{ALRM}) {
271 print "SIGALRM is $sig_num{ALRM}\n";
276 Because this information is not stored within the perl executable
277 itself it is possible (but unlikely) that the information does not
278 relate to the actual perl binary which is being used to access it.
280 The Config module is installed into the architecture and version
281 specific library directory ($Config{installarchlib}) and it checks the
282 perl version number when loaded.
286 This module contains a good example of how to use tie to implement a
287 cache and an example of how to make a tied variable readonly to those
296 # Now do some simple tests on the Config.pm file we have created
301 die "$0: $config_pm not valid"
302 unless $Config{'CONFIG'} eq 'true';
304 die "$0: error processing $config_pm"
305 if defined($Config{'an impossible name'})
306 or $Config{'CONFIG'} ne 'true' # test cache
309 die "$0: error processing $config_pm"
310 if eval '$Config{"cc"} = 1'
311 or eval 'delete $Config{"cc"}'