4 # Extract info from config.h, and add extra data here, to generate config.sh
5 # Edit the static information after __END__ to reflect your site and options
6 # that went into your perl binary. In addition, values which change from run
7 # to run may be supplied on the command line as key=val pairs.
9 # Last Modified: 28-Jun-1996 Luther Huffman lutherh@stratcom.com
12 #==== Locations of installed Perl components
13 $p9pvers="_P9P_VERSION";
15 $p9p_objtype=$ENV{'objtype'};
16 $builddir="/sys/src/cmd/perl/$p9pvers";
17 $installbin="/$p9p_objtype/bin";
18 $installman1dir="/sys/man/1";
19 $installman3dir="/sys/man/2";
20 $installprivlib="/sys/lib/perl";
21 $installarchlib = "/$p9p_objtype/lib/perl/$p9pvers";
22 $archname="plan9_$p9p_objtype";
23 $installsitelib="$installprivlib/site_perl";
24 $installsitearch="$installarchlib/site_perl";
25 $installscript="/bin";
27 unshift(@INC,'lib'); # In case someone didn't define Perl_Root
30 if ($ARGV[0] eq '-f') {
31 open(ARGS,$ARGV[1]) or die "Can't read data from $ARGV[1]: $!\n";
34 push(@ARGV,split(/\|/,$_));
39 if (-f "config.h") { $infile = "config.h"; $outdir = "../"; }
40 elsif (-f "plan9/config.h") { $infile = "plan9/config.h"; $outdir = "./"; }
42 if ($infile) { print "Generating config.sh from $infile . . .\n"; }
43 else { die <<EndOfGasp;
44 Can't find config.h to read!
45 Please run this script from the perl source directory or
46 the plan9 subdirectory in the distribution.
50 open(IN,"$infile") || die "Can't open $infile: $!\n";
51 open(OUT,">${outdir}config.sh") || die "Can't open ${outdir}config.sh: $!\n";
54 $cf_by = $ENV{'user'};
55 ($vers = $]) =~ tr/./_/;
57 # Plan 9 doesn't actually use version numbering. Following the original Unix
58 # precedent of assigning a Unix edition number based on the edition number
59 # of the manuals, I am referring to this as Plan 9, 1st edition.
62 print OUT <<EndOfIntro;
63 # This file generated by genconfig.pl on a Plan 9 system.
64 # Input obtained from:
75 libpth='$installprivlib'
99 extensions='IO Socket Opcode Fcntl POSIX DynaLoader FileHandle'
102 sig_name='ZERO HUP INT QUIT ILL ABRT FPE KILL SEGV PIPE ALRM TERM USR1 USR2 CHLD CONT STOP TSTP TTIN TTOU'
103 sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19'
107 installbin='$installbin'
108 installman1dir='$installman1dir'
109 installman3dir='$installman3dir'
110 installprivlib='$installprivlib'
111 installarchlib='$installarchlib'
112 installsitelib='$installsitelib'
113 installsitearch='$installsitearch'
114 installscript='$installscript'
115 scriptdir='$installscript'
116 scriptdirexp='$installscript'
119 # Plan 9 compiler stuff
120 print OUT "cc='pcc'\n";
121 print OUT "d_attribute_format='undef'\n";
122 print OUT "d_attribute_malloc='undef'\n";
123 print OUT "d_attribute_nonnull='undef'\n";
124 print OUT "d_attribute_noreturn='undef'\n";
125 print OUT "d_attribute_pure='undef'\n";
126 print OUT "d_attribute_unused='undef'\n";
127 print OUT "d_attribute_warn_unused_result='undef'\n";
128 print OUT "d_socket='define'\n";
129 print OUT "d_sockpair='define'\n";
130 print OUT "d_sigsetjmp='define'\n";
131 print OUT "sigjmp_buf='sigjmp_buf'\n";
132 print OUT "sigsetjmp='sigsetjmp(buf,save_mask)'\n";
133 print OUT "siglongjmp='siglongjmp(buf,retval) '\n";
134 print OUT "exe_ext=''\n";
135 if ($p9p_objtype eq '386') {
140 elsif ($p9p_objtype eq '68020') {
145 elsif ($p9p_objtype eq 'mips') {
150 elsif ($p9p_objtype eq 'sparc') {
155 print OUT "obj_ext='$objext'\n";
156 print OUT "alignbytes='$alignbytes'\n";
157 print OUT "castflags='$cstflags'\n";
159 $myname = $ENV{'site'} ;
160 ($myhostname,$mydomain) = split(/\./,$myname,2);
161 print OUT "myhostname='$myhostname'\n" if $myhostname;
163 print OUT "mydomain='.$mydomain'\n";
164 print OUT "perladmin='$cf_by\@$myhostname.$mydomain'\n";
165 print OUT "cf_email='$cf_by\@$myhostname.$mydomain'\n";
168 print OUT "perladmin='$cf_by'\n";
169 print OUT "cf_email='$cf_by'\n";
171 print OUT "myuname='Plan9 $myname $osvers $p9p_objtype'\n";
173 # Before we read the C header file, find out what config.sh constants are
174 # equivalent to the C preprocessor macros
175 if (open(SH,"${outdir}config_h.SH")) {
177 next unless m%^#(?!if).*\$%;
178 s/^#//; s!(.*?)\s*/\*.*!$1!;
180 $words[1] =~ s/\(.*//; # Clip off args from macro
181 # Did we use a shell variable for the preprocessor directive?
182 if ($words[0] =~ m!^\$(\w+)!) { $pp_vars{$words[1]} = $1; }
183 if (@words > 2) { # We may also have a shell var in the value
184 shift @words; # Discard preprocessor directive
185 my($token) = shift @words; # and keep constant name
187 foreach $word (@words) {
188 next unless $word =~ m!\$(\w+)!;
189 $val_vars{$token} = $1;
196 else { warn "Couldn't read ${outfile}config_h.SH: $!\n"; }
197 $pp_vars{PLAN9} = 'define'; #Plan 9 specific
199 # OK, now read the C header file, and retcon statements into config.sh
200 while (<IN>) { # roll through the comment header in config.h
201 last if /config-start/;
206 while (/\\\s*$/) { # pick up contination lines
213 next unless my ($blocked,$un,$token,$val) =
214 m%^(\/\*)?\s*\#\s*(un)?def\w*\s+([A-Za-z0-9]\w+)\S*\s*(.*)%;
216 delete $pp_vars{$token} if exists $pp_vars{$token};
217 delete $val_vars{$token} if exists $val_vars{$token};
220 $val =~ s!\s*/\*.*!!; # strip off trailing comment
221 my($had_val); # Maybe a macro with args that we just #undefd or commented
222 if (!length($val) and $val_vars{$token} and ($un || $blocked)) {
223 print OUT "$val_vars{$token}=''\n";
224 delete $val_vars{$token};
227 $state = ($blocked || $un) ? 'undef' : 'define';
228 if ($pp_vars{$token}) {
229 print OUT "$pp_vars{$token}='$state'\n";
230 delete $pp_vars{$token};
232 elsif (not length $val and not $had_val) {
233 # Wups -- should have been shell var for C preprocessor directive
234 warn "Constant $token not found in config_h.SH\n";
235 $token =~ tr/A-Z/a-z/;
236 $token = "d_$token" unless $token =~ /^i_/;
237 print OUT "$token='$state'\n";
239 next unless length $val;
240 $val =~ s/^"//; $val =~ s/"$//; # remove end quotes
241 $val =~ s/","/ /g; # make signal list look nice
243 if ($val_vars{$token}) {
244 print OUT "$val_vars{$token}='$val'\n";
245 if ($val_vars{$token} =~ s/exp$//) {print OUT "$val_vars{$token}='$val'\n";}
246 delete $val_vars{$token};
248 elsif (!$pp_vars{$token}) { # Haven't seen it previously, either
249 warn "Constant $token not found in config_h.SH (val=|$val|)\n";
250 $token =~ tr/A-Z/a-z/;
251 print OUT "$token='$val'\n";
252 if ($token =~ s/exp$//) {print OUT "$token='$val'\n";}
257 foreach (sort keys %pp_vars) {
258 warn "Didn't see $_ in $infile\n";
260 foreach (sort keys %val_vars) {
261 warn "Didn't see $_ in $infile(val)\n";
265 # print OUT "libs='",join(' ',@libs),"'\n";
266 # print OUT "libc='",join(' ',@crtls),"'\n";
268 if (open(PL,"${outdir}patchlevel.h")) {
270 if (/^#define PERL_VERSION\s+(\S+)/) {
271 print OUT "PERL_VERSION='$1'\n";
272 print OUT "PATCHLEVEL='$1'\n"; # XXX compat
274 elsif (/^#define PERL_SUBVERSION\s+(\S+)/) {
275 print OUT "PERL_SUBVERSION='$1'\n";
276 print OUT "SUBVERSION='$1'\n"; # XXX compat
281 else { warn "Can't read ${outdir}patchlevel.h - skipping 'PERL_VERSION'"; }
283 print OUT "pager='/bin/p'\n";