source: trunk/third/perl/plan9/genconfig.pl @ 10724

Revision 10724, 7.8 KB checked in by ghudson, 27 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r10723, which included commits to RCS files with non-trunk default branches.
Line 
1#!../miniperl
2# Habit . . .
3#
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.
8#
9# Last Modified: 28-Jun-1996  Luther Huffman  lutherh@stratcom.com
10#
11
12#==== Locations of installed Perl components
13$p9pvers="_P9P_VERSION";
14$prefix='';
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";
26
27unshift(@INC,'lib');  # In case someone didn't define Perl_Root
28                      # before the build
29
30if ($ARGV[0] eq '-f') {
31  open(ARGS,$ARGV[1]) or die "Can't read data from $ARGV[1]: $!\n";
32  @ARGV = ();
33  while (<ARGS>) {
34    push(@ARGV,split(/\|/,$_));
35  }
36  close ARGS;
37}
38
39if (-f "config.h") { $infile = "config.h"; $outdir = "../"; }
40elsif (-f "plan9/config.h") { $infile = "plan9/config.h";  $outdir = "./"; }
41
42if ($infile) { print "Generating config.sh from $infile . . .\n"; }
43else { die <<EndOfGasp;
44Can't find config.h to read!
45        Please run this script from the perl source directory or
46        the plan9 subdirectory in the distribution.
47EndOfGasp
48}
49$outdir = '';
50open(IN,"$infile") || die "Can't open $infile: $!\n";
51open(OUT,">${outdir}config.sh") || die "Can't open ${outdir}config.sh: $!\n";
52
53$time = localtime;
54$cf_by = $ENV{'user'};
55($vers = $]) =~ tr/./_/;
56
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.
60$osvers = '1';
61
62print OUT <<EndOfIntro;
63# This file generated by genconfig.pl on a Plan 9 system.
64# Input obtained from:
65#     $infile
66#     $0
67# Time: $time
68
69package='perl5'
70CONFIG='true'
71cf_time='$time'
72cf_by='$cf_by'
73ccdlflags=''
74cccdlflags=''
75libpth='$installprivlib'
76ld='pcc'
77lddlflags=''
78ranlib=''
79ar='ar'
80nroff='/bin/nroff'
81eunicefix=':'
82hint='none'
83hintfile=''
84intsize='4'
85longsize='4'
86shortsize='2'
87shrplib='define'
88usemymalloc='n'
89usevfork='true'
90useposix='true'
91spitshell='cat'
92dlsrc='dl_none.c'
93binexp='$installbin'
94man1ext=''
95man3ext=''
96arch='$archname'
97archname='$archname'
98osname='plan9'
99extensions='IO Socket Opcode Fcntl POSIX DynaLoader FileHandle'
100osvers='$osvers'
101sig_maxsig='19'
102sig_name='ZERO HUP INT QUIT ILL ABRT FPE KILL SEGV PIPE ALRM TERM USR1 USR2 CHLD CONT STOP TSTP TTIN TTOU'
103sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19'
104sig_numsig='20'
105prefix='$prefix'
106builddir='$builddir'
107installbin='$installbin'
108installman1dir='$installman1dir'
109installman3dir='$installman3dir'
110installprivlib='$installprivlib'
111installarchlib='$installarchlib'
112installsitelib='$installsitelib'
113installsitearch='$installsitearch'
114installscript='$installscript'
115scriptdir='$installscript'
116scriptdirexp='$installscript'
117EndOfIntro
118
119# Plan 9 compiler stuff
120print OUT "cc='pcc'\n";
121print OUT "d_attribut='undef'\n";
122print OUT "d_socket='define'\n";
123print OUT "d_sockpair='define'\n";
124print OUT "d_sigsetjmp='define'\n";
125print OUT "sigjmp_buf='sigjmp_buf'\n";
126print OUT "sigsetjmp='sigsetjmp(buf,save_mask)'\n";
127print OUT "siglongjmp='siglongjmp(buf,retval) '\n";
128print OUT "exe_ext=''\n";
129if ($p9p_objtype eq '386') {
130        $objext = '.8';
131        $alignbytes = '4';
132        $cstflags = 2;
133}
134elsif ($p9p_objtype eq '68020') {
135        $objext = '.2';
136        $alignbytes = '2';
137        $cstflags = 0;
138}
139elsif ($p9p_objtype eq 'mips') {
140        $objext = '.v';
141        $alignbytes = '8';
142        $cstflags = 0;
143}
144elsif ($p9p_objtype eq 'sparc') {
145        $objext = '.k';
146        $alignbytes = '4';
147        $cstflags = 0;
148}
149print OUT "obj_ext='$objext'\n";
150print OUT "alignbytes='$alignbytes'\n";
151print OUT "castflags='$cstflags'\n";
152
153$myname = $ENV{'site'} ;
154($myhostname,$mydomain) = split(/\./,$myname,2);
155print OUT "myhostname='$myhostname'\n" if $myhostname;
156if ($mydomain) {
157  print OUT "mydomain='.$mydomain'\n";
158  print OUT "perladmin='$cf_by\@$myhostname.$mydomain'\n";
159  print OUT "cf_email='$cf_by\@$myhostname.$mydomain'\n";
160}
161else {
162  print OUT "perladmin='$cf_by'\n";
163  print OUT "cf_email='$cf_by'\n";
164}
165print OUT "myuname='Plan9 $myname $osvers $p9p_objtype'\n";
166
167# Before we read the C header file, find out what config.sh constants are
168# equivalent to the C preprocessor macros
169if (open(SH,"${outdir}config_h.SH")) {
170  while (<SH>) {
171    next unless m%^#(?!if).*\$%;
172    s/^#//; s!(.*?)\s*/\*.*!$1!;
173    my(@words) = split;
174    $words[1] =~ s/\(.*//;  # Clip off args from macro
175    # Did we use a shell variable for the preprocessor directive?
176    if ($words[0] =~ m!^\$(\w+)!) { $pp_vars{$words[1]} = $1; }
177    if (@words > 2) {  # We may also have a shell var in the value
178      shift @words;              #  Discard preprocessor directive
179      my($token) = shift @words; #  and keep constant name
180      my($word);
181      foreach $word (@words) {
182        next unless $word =~ m!\$(\w+)!;
183        $val_vars{$token} = $1;
184        last;
185      }
186    }
187  }
188  close SH;
189}
190else { warn "Couldn't read ${outfile}config_h.SH: $!\n"; }
191$pp_vars{PLAN9} = 'define'; #Plan 9 specific
192
193# OK, now read the C header file, and retcon statements into config.sh
194while (<IN>) {  # roll through the comment header in config.h
195  last if /config-start/;
196}
197
198while (<IN>) {
199  chop;
200  while (/\\\s*$/) {  # pick up contination lines
201    my $line = $_;
202    $line =~ s/\\\s*$//;
203    $_ = <IN>;
204    s/^\s*//;
205    $_ = $line . $_;
206  }             
207  next unless my ($blocked,$un,$token,$val) =
208                 m%^(\/\*)?\s*\#\s*(un)?def\w*\s+([A-Za-z0-9]\w+)\S*\s*(.*)%;
209  if (/config-skip/) {
210    delete $pp_vars{$token} if exists $pp_vars{$token};
211    delete $val_vars{$token} if exists $val_vars{$token};
212    next;
213  }
214  $val =~ s!\s*/\*.*!!; # strip off trailing comment
215  my($had_val); # Maybe a macro with args that we just #undefd or commented
216  if (!length($val) and $val_vars{$token} and ($un || $blocked)) {
217    print OUT "$val_vars{$token}=''\n";
218    delete $val_vars{$token};
219    $had_val = 1;
220  }
221  $state = ($blocked || $un) ? 'undef' : 'define';
222  if ($pp_vars{$token}) {
223    print OUT "$pp_vars{$token}='$state'\n";
224    delete $pp_vars{$token};
225  }
226  elsif (not length $val and not $had_val) {
227    # Wups -- should have been shell var for C preprocessor directive
228    warn "Constant $token not found in config_h.SH\n";
229    $token =~ tr/A-Z/a-z/;
230    $token = "d_$token" unless $token =~ /^i_/;
231    print OUT "$token='$state'\n";
232  }
233  next unless length $val;
234  $val =~ s/^"//; $val =~ s/"$//;               # remove end quotes
235  $val =~ s/","/ /g;                            # make signal list look nice
236 
237 if ($val_vars{$token}) {
238    print OUT "$val_vars{$token}='$val'\n";
239    if ($val_vars{$token} =~ s/exp$//) {print OUT "$val_vars{$token}='$val'\n";}
240    delete $val_vars{$token};
241  }
242  elsif (!$pp_vars{$token}) {  # Haven't seen it previously, either
243    warn "Constant $token not found in config_h.SH (val=|$val|)\n";
244    $token =~ tr/A-Z/a-z/;
245    print OUT "$token='$val'\n";
246    if ($token =~ s/exp$//) {print OUT "$token='$val'\n";}
247  }
248}
249close IN;
250
251foreach (sort keys %pp_vars) {
252  warn "Didn't see $_ in $infile\n";
253}
254foreach (sort keys %val_vars) {
255  warn "Didn't see $_ in $infile(val)\n";
256}
257
258
259# print OUT "libs='",join(' ',@libs),"'\n";
260# print OUT "libc='",join(' ',@crtls),"'\n";
261
262if (open(PL,"${outdir}patchlevel.h")) {
263  while (<PL>) {
264    if    (/^#define PATCHLEVEL\s+(\S+)/) { print OUT "PATCHLEVEL='$1'\n"; }
265    elsif (/^#define SUBVERSION\s+(\S+)/) { print OUT "SUBVERSION='$1'\n"; }
266  }
267  close PL;
268}
269else { warn "Can't read ${outdir}patchlevel.h - skipping 'PATCHLEVEL'"; }
270
271print OUT "pager='/bin/p'\n";
272
273close OUT;
274
275
Note: See TracBrowser for help on using the repository browser.