| 1 | #!/usr/bin/perl
|
|---|
| 2 | #
|
|---|
| 3 | # mms2make.pl - convert Descrip.MMS file to Makefile
|
|---|
| 4 | # Version 2.2 29-Jan-1996
|
|---|
| 5 | # David Denholm <[email protected]>
|
|---|
| 6 | #
|
|---|
| 7 | # 1.0 06-Aug-1994 Charles Bailey [email protected]
|
|---|
| 8 | # - original version
|
|---|
| 9 | # 2.0 29-Sep-1994 David Denholm <[email protected]>
|
|---|
| 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 [email protected]
|
|---|
| 20 | # - handle MMS macros generated by MakeMaker
|
|---|
| 21 | # 2.2 29-Jan-1996 Charles Bailey [email protected]
|
|---|
| 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 |
|
|---|