#!../miniperl # Habit . . . # # Extract info from config.h, and add extra data here, to generate config.sh # Edit the static information after __END__ to reflect your site and options # that went into your perl binary. In addition, values which change from run # to run may be supplied on the command line as key=val pairs. # # Last Modified: 28-Jun-1996 Luther Huffman lutherh@stratcom.com # Last Modified: May 2020 David Romano unobe@cpan.org # my $VERBOSE = 0; #==== Locations of installed Perl components $p9pvers="_P9P_VERSION"; $version="$p9pvers"; $prefix=''; $p9p_objtype=$ENV{'objtype'}; $builddir="/sys/src/cmd/perl/$p9pvers"; $installbin="/$p9p_objtype/bin"; $installman1dir="/sys/man/1"; $installman3dir="/sys/man/2"; $installprivlib="/sys/lib/perl/$p9pvers"; $installarchlib = "/$p9p_objtype/lib/perl/$p9pvers"; $archname="plan9_$p9p_objtype"; $installsitelib="$installprivlib/site_perl"; $installsitearch="$installarchlib/site_perl"; $installscript="/bin"; unshift(@INC,'lib'); # In case someone didn't define Perl_Root # before the build if ($ARGV[0] eq '-f') { shift @ARGV; open(ARGS,'<',$ARGV[1]) or die "Can't read data from $ARGV[1]: $!\n"; shift @ARGV; while () { push(@ARGV,split(/\|/,$_)); } close ARGS; } my @extensions = @ARGV; if (-f "config.h") { $infile = "config.h"; $outdir = "../"; } elsif (-f "plan9/config.h") { $infile = "plan9/config.h"; $outdir = "./"; } if ($infile) { print "Generating config.sh from $infile . . .\n"; } else { die <',"${outdir}config.sh") || die "Can't open ${outdir}config.sh: $!\n"; $time = localtime; $cf_by = $ENV{'user'}; ($vers = $]) =~ tr/./_/; # 9front as Plan 9, 5th edition. $osvers = '5'; print OUT <) { # suicide @ regcomp.c:22117 #next unless m%^#(?!if).*\$%; next unless !index($_, '#') && index($_, '#if') == -1 && rindex($_, '$') == length($_)-1; s/^#//; s!(.*?)\s*/\*.*!$1!; my(@words) = split; $words[1] =~ s/\(.*//; # Clip off args from macro # Did we use a shell variable for the preprocessor directive? if ($words[0] =~ m!^\$(\w+)!) { $pp_vars{$words[1]} = $1; } if (@words > 2) { # We may also have a shell var in the value shift @words; # Discard preprocessor directive my($token) = shift @words; # and keep constant name my($word); foreach $word (@words) { next unless $word =~ m!\$(\w+)!; $val_vars{$token} = $1; last; } } } close SH; } elsif ($VERBOSE) { warn "Couldn't read ${outfile}config_h.SH: $!\n"; } $pp_vars{PLAN9} = 'define'; #Plan 9 specific # OK, now read the C header file, and retcon statements into config.sh while () { # roll through the comment header in config.h last if /config-start/; } while () { chop; while (/\\\s*$/) { # pick up continuation lines my $line = $_; $line =~ s/\\\s*$//; $_ = ; s/^\s*//; $_ = $line . $_; } next unless my ($blocked,$un,$token,$val) = m%^(\/\*)?\s*\#\s*(un)?def\w*\s+([A-Za-z0-9]\w+)\S*\s*(.*)%; if (/config-skip/) { delete $pp_vars{$token} if exists $pp_vars{$token}; delete $val_vars{$token} if exists $val_vars{$token}; next; } $val =~ s!\s*/\*.*!!; # strip off trailing comment my($had_val); # Maybe a macro with args that we just #undefd or commented if (!length($val) and $val_vars{$token} and ($un || $blocked)) { print OUT "$val_vars{$token}=''\n"; delete $val_vars{$token}; $had_val = 1; } $state = ($blocked || $un) ? 'undef' : 'define'; if ($pp_vars{$token}) { print OUT "$pp_vars{$token}='$state'\n"; delete $pp_vars{$token}; } elsif (not length $val and not $had_val) { # Wups -- should have been shell var for C preprocessor directive warn "Constant $token not found in config_h.SH\n" if $VERBOSE; $token =~ tr/A-Z/a-z/; $token = "d_$token" unless $token =~ /^i_/; print OUT "$token='$state'\n"; } next unless length $val; $val =~ s/^"//; $val =~ s/"$//; # remove end quotes $val =~ s/","/ /g; # make signal list look nice if ($val_vars{$token}) { print OUT "$val_vars{$token}='$val'\n"; if ($val_vars{$token} =~ s/exp$//) {print OUT "$val_vars{$token}='$val'\n";} delete $val_vars{$token}; } elsif (!$pp_vars{$token}) { # Haven't seen it previously, either warn "Constant $token not found in config_h.SH (val=|$val|)\n" if $VERBOSE; $token =~ tr/A-Z/a-z/; print OUT "$token='$val'\n"; if ($token =~ s/exp$//) {print OUT "$token='$val'\n";} } } close IN; if ($VERBOSE) { foreach (sort keys %pp_vars) { warn "Didn't see $_ in $infile\n"; } foreach (sort keys %val_vars) { warn "Didn't see $_ in $infile(val)\n"; } } # print OUT "libs='",join(' ',@libs),"'\n"; # print OUT "libc='",join(' ',@crtls),"'\n"; if (open(PL,'<',"${outdir}patchlevel.h")) { while () { if (/^#define PERL_VERSION\s+(\S+)/) { print OUT "PERL_VERSION='$1'\n"; print OUT "PATCHLEVEL='$1'\n"; # XXX compat } elsif (/^#define PERL_SUBVERSION\s+(\S+)/) { print OUT "PERL_SUBVERSION='$1'\n"; print OUT "SUBVERSION='$1'\n"; # XXX compat } } close PL; } elsif ($VERBOSE) { warn "Can't read ${outdir}patchlevel.h - skipping 'PERL_VERSION'" } print OUT "pager='/bin/p'\n"; close OUT;