home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / perl560.zip / plan9 / genconfig.pl < prev    next >
Perl Script  |  1999-07-20  |  8KB  |  282 lines

  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.  
  27. unshift(@INC,'lib');  # In case someone didn't define Perl_Root
  28.                       # before the build
  29.  
  30. if ($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.  
  39. if (-f "config.h") { $infile = "config.h"; $outdir = "../"; }
  40. elsif (-f "plan9/config.h") { $infile = "plan9/config.h";  $outdir = "./"; }
  41.  
  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.
  47. EndOfGasp
  48. }
  49. $outdir = '';
  50. open(IN,"$infile") || die "Can't open $infile: $!\n";
  51. open(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.  
  62. print 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.  
  69. package='perl5'
  70. CONFIG='true'
  71. cf_time='$time'
  72. cf_by='$cf_by'
  73. ccdlflags=''
  74. cccdlflags=''
  75. libpth='$installprivlib'
  76. ld='pcc'
  77. lddlflags=''
  78. ranlib=''
  79. ar='ar'
  80. nroff='/bin/nroff'
  81. eunicefix=':'
  82. hint='none'
  83. hintfile=''
  84. intsize='4'
  85. longsize='4'
  86. shortsize='2'
  87. shrplib='define'
  88. usemymalloc='n'
  89. usevfork='true'
  90. useposix='true'
  91. spitshell='cat'
  92. dlsrc='dl_none.c'
  93. binexp='$installbin'
  94. man1ext=''
  95. man3ext=''
  96. arch='$archname'
  97. archname='$archname'
  98. osname='plan9'
  99. extensions='IO Socket Opcode Fcntl POSIX DynaLoader FileHandle'
  100. osvers='$osvers'
  101. sig_maxsig='19'
  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'
  104. sig_numsig='20'
  105. prefix='$prefix'
  106. builddir='$builddir'
  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'
  117. EndOfIntro
  118.  
  119. # Plan 9 compiler stuff
  120. print OUT "cc='pcc'\n";
  121. print OUT "d_attribut='undef'\n";
  122. print OUT "d_socket='define'\n";
  123. print OUT "d_sockpair='define'\n";
  124. print OUT "d_sigsetjmp='define'\n";
  125. print OUT "sigjmp_buf='sigjmp_buf'\n";
  126. print OUT "sigsetjmp='sigsetjmp(buf,save_mask)'\n";
  127. print OUT "siglongjmp='siglongjmp(buf,retval) '\n";
  128. print OUT "exe_ext=''\n";
  129. if ($p9p_objtype eq '386') {
  130.     $objext = '.8';
  131.     $alignbytes = '4';
  132.     $cstflags = 2;
  133. }
  134. elsif ($p9p_objtype eq '68020') {
  135.     $objext = '.2';
  136.     $alignbytes = '2';
  137.     $cstflags = 0;
  138. }
  139. elsif ($p9p_objtype eq 'mips') {
  140.     $objext = '.v';
  141.     $alignbytes = '8';
  142.     $cstflags = 0;
  143. }
  144. elsif ($p9p_objtype eq 'sparc') {
  145.     $objext = '.k';
  146.     $alignbytes = '4';
  147.     $cstflags = 0;
  148. }
  149. print OUT "obj_ext='$objext'\n";
  150. print OUT "alignbytes='$alignbytes'\n";
  151. print OUT "castflags='$cstflags'\n";
  152.  
  153. $myname = $ENV{'site'} ;
  154. ($myhostname,$mydomain) = split(/\./,$myname,2);
  155. print OUT "myhostname='$myhostname'\n" if $myhostname;
  156. if ($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. }
  161. else {
  162.   print OUT "perladmin='$cf_by'\n";
  163.   print OUT "cf_email='$cf_by'\n";
  164. }
  165. print 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
  169. if (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. }
  190. else { 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
  194. while (<IN>) {  # roll through the comment header in config.h
  195.   last if /config-start/;
  196. }
  197.  
  198. while (<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. }
  249. close IN;
  250.  
  251. foreach (sort keys %pp_vars) {
  252.   warn "Didn't see $_ in $infile\n";
  253. }
  254. foreach (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.  
  262. if (open(PL,"${outdir}patchlevel.h")) {
  263.   while (<PL>) {
  264.     if    (/^#define PERL_VERSION\s+(\S+)/) {
  265.       print OUT "PERL_VERSION='$1'\n";
  266.       print OUT "PATCHLEVEL='$1'\n";        # XXX compat
  267.     }
  268.     elsif (/^#define PERL_SUBVERSION\s+(\S+)/) {
  269.       print OUT "PERL_SUBVERSION='$1'\n";
  270.       print OUT "SUBVERSION='$1'\n";        # XXX compat
  271.     }
  272.   }
  273.   close PL;
  274. }
  275. else { warn "Can't read ${outdir}patchlevel.h - skipping 'PERL_VERSION'"; }
  276.  
  277. print OUT "pager='/bin/p'\n";
  278.  
  279. close OUT;
  280.  
  281.  
  282.