This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Re: perldoc, temp files, async pagers
[perl5.git] / configpm
CommitLineData
a0d0e21e 1#!./miniperl -w
8990e307 2
75f92628 3$config_pm = $ARGV[0] || 'lib/Config.pm';
8990e307
LW
4@ARGV = "./config.sh";
5
a0d0e21e 6# list names to put first (and hence lookup fastest)
3c81428c 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
a0d0e21e 11 sharpbang startsh shsharp
3c81428c 12);
a0d0e21e 13
fec02dd3
AD
14# names of things which may need to have slashes changed to double-colons
15@extensions = qw(dynamic_ext static_ext extensions known_extensions);
16
a0d0e21e
LW
17
18open CONFIG, ">$config_pm" or die "Can't open $config_pm: $!\n";
a5f75d66 19$myver = $];
3c81428c 20
a0d0e21e 21print CONFIG <<"ENDOFBEG";
8990e307 22package Config;
3c81428c 23use Exporter ();
8990e307
LW
24\@ISA = (Exporter);
25\@EXPORT = qw(%Config);
3c81428c 26\@EXPORT_OK = qw(myconfig config_sh config_vars);
8990e307 27
a5f75d66 28\$] == $myver
9193ea20 29 or die "Perl lib version ($myver) doesn't match executable version (\$])";
8990e307 30
a0d0e21e
LW
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.
33
8990e307
LW
34ENDOFBEG
35
16d20bd9 36
a0d0e21e 37@fast{@fast} = @fast;
fec02dd3 38@extensions{@extensions} = @extensions;
a0d0e21e
LW
39@non_v=();
40@v_fast=();
41@v_others=();
42
85e6fe83 43while (<>) {
a0d0e21e
LW
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
49 next;
50 }
fec02dd3
AD
51 $name = $1;
52 if ($extensions{$name}) { s,/,::,g }
53 if (!$fast{$name}){ push(@v_others, $_); next; }
a0d0e21e
LW
54 push(@v_fast,$_);
55}
56
57foreach(@non_v){ print CONFIG $_ }
58
59print CONFIG "\n",
3c81428c 60 "my \$config_sh = <<'!END!';\n",
a0d0e21e 61 join("", @v_fast, sort @v_others),
3c81428c 62 "!END!\n\n";
63
64# copy config summary format from the myconfig script
65
66print CONFIG "my \$summary = <<'!END!';\n";
67
68open(MYCONFIG,"<myconfig") || die "open myconfig failed: $!";
691 while( ($_=<MYCONFIG>) !~ /^Summary of/);
70do { print CONFIG $_ } until ($_ = <MYCONFIG>) =~ /^\s*$/;
71close(MYCONFIG);
a0d0e21e 72
3c81428c 73print CONFIG "\n!END!\n", <<'EOT';
74my $summary_expanded = 0;
75
76sub myconfig {
77 return $summary if $summary_expanded;
78 $summary =~ s/\$(\w+)/$Config{$1}/ge;
79 $summary_expanded = 1;
80 $summary;
81}
82EOT
83
84# ----
a0d0e21e
LW
85
86print CONFIG <<'ENDOFEND';
87
a0d0e21e 88sub FETCH {
aa1bdcb8 89 # check for cached value (which may be undef so we use exists not defined)
a0d0e21e 90 return $_[0]->{$_[1]} if (exists $_[0]->{$_[1]});
aa1bdcb8
TP
91
92 # Search for it in the big string
93 my($value, $start, $marker);
94 $marker = "$_[1]='";
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);
a0d0e21e
LW
103
104 $value = undef if $value eq 'undef'; # So we can say "if $Config{'foo'}".
105 $_[0]->{$_[1]} = $value; # cache it
106 return $value;
107}
108
3c81428c 109my $prevpos = 0;
110
a0d0e21e
LW
111sub FIRSTKEY {
112 $prevpos = 0;
aa1bdcb8
TP
113 # my($key) = $config_sh =~ m/^(.*?)=/;
114 substr($config_sh, 0, index($config_sh, '=') );
115 # $key;
a0d0e21e
LW
116}
117
118sub NEXTKEY {
3c81428c 119 my $pos = index($config_sh, "\n", $prevpos) + 1;
120 my $len = index($config_sh, "=", $pos) - $pos;
a0d0e21e 121 $prevpos = $pos;
3c81428c 122 $len > 0 ? substr($config_sh, $pos, $len) : undef;
85e6fe83 123}
a0d0e21e 124
3c81428c 125sub EXISTS {
aa1bdcb8
TP
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]='";
a0d0e21e
LW
130}
131
3c81428c 132sub STORE { die "\%Config::Config is read-only\n" }
133sub DELETE { &STORE }
134sub CLEAR { &STORE }
a0d0e21e 135
3c81428c 136
137sub config_sh {
138 $config_sh
748a9306 139}
9193ea20 140
141sub config_re {
142 my $re = shift;
143 my @matches = ($config_sh =~ /^$re=.*\n/mg);
144 @matches ? (print @matches) : print "$re: not found\n";
145}
146
3c81428c 147sub config_vars {
148 foreach(@_){
9193ea20 149 config_re($_), next if /\W/;
3c81428c 150 my $v=(exists $Config{$_}) ? $Config{$_} : 'UNKNOWN';
151 $v='undef' unless defined $v;
152 print "$_='$v';\n";
153 }
154}
155
9193ea20 156ENDOFEND
157
158if ($^O eq 'os2') {
159 print CONFIG <<'ENDOFSET';
160my %preconfig;
161if ($OS2::is_aout) {
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;
166 }
167}
168sub TIEHASH { bless {%preconfig} }
169ENDOFSET
170} else {
171 print CONFIG <<'ENDOFSET';
172sub TIEHASH { bless {} }
173ENDOFSET
174}
175
176print CONFIG <<'ENDOFTAIL';
177
178tie %Config, 'Config';
179
3c81428c 1801;
181__END__
748a9306 182
3c81428c 183=head1 NAME
a0d0e21e 184
3c81428c 185Config - access Perl configuration information
186
187=head1 SYNOPSIS
188
189 use Config;
190 if ($Config{'cc'} =~ /gcc/) {
191 print "built by gcc\n";
192 }
193
194 use Config qw(myconfig config_sh config_vars);
195
196 print myconfig();
197
198 print config_sh();
199
200 config_vars(qw(osname archname));
201
202
203=head1 DESCRIPTION
204
205The Config module contains all the information that was available to
206the C<Configure> program at Perl build time (over 900 values).
207
208Shell variables from the F<config.sh> file (written by Configure) are
209stored in the readonly-variable C<%Config>, indexed by their names.
210
211Values stored in config.sh as 'undef' are returned as undefined
1fef88e7 212values. The perl C<exists> function can be used to check if a
3c81428c 213named variable exists.
214
215=over 4
216
217=item myconfig()
218
219Returns a textual summary of the major perl configuration values.
220See also C<-V> in L<perlrun/Switches>.
221
222=item config_sh()
223
224Returns the entire perl configuration information in the form of the
225original config.sh shell variable assignment script.
226
227=item config_vars(@names)
228
229Prints to STDOUT the values of the named configuration variable. Each is
230printed on a separate line in the form:
231
232 name='value';
233
234Names which are unknown are output as C<name='UNKNOWN';>.
235See also C<-V:name> in L<perlrun/Switches>.
236
237=back
238
239=head1 EXAMPLE
240
241Here's a more sophisticated example of using %Config:
242
243 use Config;
244
245 defined $Config{sig_name} || die "No sigs?";
246 foreach $name (split(' ', $Config{sig_name})) {
247 $signo{$name} = $i;
248 $signame[$i] = $name;
249 $i++;
250 }
251
252 print "signal #17 = $signame[17]\n";
253 if ($signo{ALRM}) {
254 print "SIGALRM is $signo{ALRM}\n";
255 }
256
257=head1 WARNING
258
259Because this information is not stored within the perl executable
260itself it is possible (but unlikely) that the information does not
261relate to the actual perl binary which is being used to access it.
262
263The Config module is installed into the architecture and version
264specific library directory ($Config{installarchlib}) and it checks the
265perl version number when loaded.
266
267=head1 NOTE
268
269This module contains a good example of how to use tie to implement a
270cache and an example of how to make a tied variable readonly to those
271outside of it.
272
273=cut
a0d0e21e 274
9193ea20 275ENDOFTAIL
a0d0e21e
LW
276
277close(CONFIG);
278
279# Now do some simple tests on the Config.pm file we have created
280unshift(@INC,'lib');
281require $config_pm;
282import Config;
283
284die "$0: $config_pm not valid"
285 unless $Config{'CONFIG'} eq 'true';
286
287die "$0: error processing $config_pm"
288 if defined($Config{'an impossible name'})
289 or $Config{'CONFIG'} ne 'true' # test cache
290 ;
291
292die "$0: error processing $config_pm"
293 if eval '$Config{"cc"} = 1'
294 or eval 'delete $Config{"cc"}'
295 ;
296
297
85e6fe83 298exit 0;