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

  1. #!/usr/bin/perl
  2. #
  3. #  mms2make.pl - convert Descrip.MMS file to Makefile
  4. #  Version 2.2 29-Jan-1996
  5. #  David Denholm <denholm@conmat.phys.soton.ac.uk>
  6. #
  7. #  1.0  06-Aug-1994  Charles Bailey  bailey@newman.upenn.edu
  8. #    - original version
  9. #  2.0  29-Sep-1994  David Denholm <denholm@conmat.phys.soton.ac.uk>
  10. #    - take action based on MMS .if / .else / .endif
  11. #      any command line options after filenames are set in an assoc array %macros
  12. #      maintain "@condition as a stack of current conditions
  13. #      we unshift a 0 or 1 to front of @conditions at an .ifdef
  14. #      we invert top of stack at a .else
  15. #      we pop at a .endif
  16. #      we deselect any other line if $conditions[0] is 0
  17. #      I'm being very lazy - push a 1 at start, then dont need to check for
  18. #      an empty @conditions [assume nesting in descrip.mms is correct] 
  19. #  2.1  26-Feb-1995  Charles Bailey  bailey@newman.upenn.edu
  20. #    - handle MMS macros generated by MakeMaker
  21. #  2.2  29-Jan-1996  Charles Bailey  bailey@newman.upenn.edu
  22. #    - Fix output file name to work under Unix
  23.  
  24. if ($#ARGV > -1 && $ARGV[0] =~ /^[\-\/]trim/i) {
  25.   $do_trim = 1;
  26.   shift @ARGV;
  27. }
  28. $infile  = $#ARGV > -1 ? shift(@ARGV) : "Descrip.MMS";
  29. $outfile = $#ARGV > -1 ? shift(@ARGV) : "Makefile";
  30.  
  31. # set any other args in %macros - set VAXC by default
  32. foreach (@ARGV) { $macros{"\U$_"}=1 }
  33.  
  34. # consistency check
  35. $macros{"DECC"} = 1 if $macros{"__AXP__"};
  36.  
  37. # set conditions as if there was a .if 1  around whole file
  38. # [lazy - saves having to check for empty array - just test [0]==1]
  39. @conditions = (1);
  40.  
  41. open(INFIL,$infile) || die "Can't open $infile: $!\n"; 
  42. open(OUTFIL,">$outfile") || die "Can't open $outfile: $!\n"; 
  43.  
  44. print OUTFIL "#> This file produced from $infile by $0\n";
  45. print OUTFIL "#> Lines beginning with \"#>\" were commented out during the\n";
  46. print OUTFIL "#> conversion process.  For more information, see $0\n";
  47. print OUTFIL "#>\n";
  48.  
  49. while (<INFIL>) {
  50.   s/$infile/$outfile/eoi;
  51.   if (/^\#/) { 
  52.     if (!/^\#\:/) {print OUTFIL;}
  53.     next;
  54.   }
  55.  
  56. # look for ".ifdef macro" and push 1 or 0 to head of @conditions
  57. # push 0 if we are in false branch of another if
  58.   if (/^\.ifdef\s*(.+)/i)
  59.   {
  60.      print OUTFIL "#> ",$_ unless $do_trim;
  61.      unshift @conditions, ($macros{"\U$1"} ? $conditions[0] : 0);
  62.      next;
  63.   }
  64.  
  65. # reverse $conditions[0] for .else provided surrounding if is active
  66.   if (/^\.else/i)
  67.   {
  68.       print OUTFIL "#> ",$_ unless $do_trim;
  69.       $conditions[0] = $conditions[1] && !$conditions[0];
  70.       next;
  71.   }
  72.  
  73. # pop top condition for .endif
  74.   if (/^\.endif/i)
  75.   {
  76.      print OUTFIL "#> ",$_ unless $do_trim;
  77.      shift @conditions;
  78.      next;
  79.   }
  80.  
  81.   next if ($do_trim && !$conditions[0]);
  82.  
  83. # spot new rule and pick up first source file, since some versions of
  84. # Make don't provide a macro for this
  85.   if (/[^#!]*:\s+/) {
  86.     if (/:\s+([^\s,]+)/) { $firstsrc = $1 }
  87.     else { $firstsrc = "\$<" }
  88.   }
  89.  
  90. #convert macros we expect to see in MakeMaker-generated Descrip.MMSs
  91.   s#/Descrip=\s*\n#-f \nMMS = make\n#;
  92.   s#/Macro=\(# #;
  93.   s#MACROEND = \)#MACROEND = #;
  94.   if (m#\$\(USEMACROS\)(.*)(\$\(MACROEND\))?#) {
  95.     while (1) {
  96.       my($macros,$end) = ($1,$2);
  97.       $macros =~ s/,/ /g;  # We're hosed if there're commas within a macro -
  98.                            # someday, check for "" and skip contents
  99.       last if $end;
  100.       print OUTFIL $conditions[0] ? "#> " : "",$_;
  101.       $_ = <INFIL>;
  102.       m#(.*)(\$\(MACROEND\))?#;
  103.     }
  104.   }
  105.  
  106.   s/^ +/\t/;
  107.   s/^\.first/\.first:/i;
  108.   s/^\.suffixes/\.suffixes:/i;
  109.   s/\@\[\.vms\]/\$\$\@\[\.vms\]/;
  110.   s/f\$/f\$\$/goi;
  111.   s/\$\(mms\$source\)/$firstsrc/i;
  112.   s/\$\(mms\$target\)/\$\@/i;
  113.   s/\$\(mms\$target_name\)\$\(O\)/\$\@/i;
  114.   s/\$\(mms\$target_name\)/\$\*/i;
  115.   s/sys\$([^\(])/sys\$\$$1/gi;
  116.   print OUTFIL "#> " unless $conditions[0];
  117.   print OUTFIL $_;
  118. }
  119.  
  120. close INFIL;
  121. close OUTFIL;
  122.  
  123.