Commit | Line | Data |
---|---|---|
a0d0e21e LW |
1 | #!/usr/bin/perl |
2 | # | |
3 | # mms2make.pl - convert Descrip.MMS file to Makefile | |
c07a80fd | 4 | # Version 2.2 29-Jan-1996 |
a0d0e21e LW |
5 | # David Denholm <denholm@conmat.phys.soton.ac.uk> |
6 | # | |
bd3fa61c | 7 | # 1.0 06-Aug-1994 Charles Bailey bailey@newman.upenn.edu |
a0d0e21e LW |
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] | |
bd3fa61c | 19 | # 2.1 26-Feb-1995 Charles Bailey bailey@newman.upenn.edu |
748a9306 | 20 | # - handle MMS macros generated by MakeMaker |
bd3fa61c | 21 | # 2.2 29-Jan-1996 Charles Bailey bailey@newman.upenn.edu |
c07a80fd | 22 | # - Fix output file name to work under Unix |
a0d0e21e LW |
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"; | |
c07a80fd | 29 | $outfile = $#ARGV > -1 ? shift(@ARGV) : "Makefile"; |
a0d0e21e LW |
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 | ||
748a9306 LW |
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 | ||
a0d0e21e LW |
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 |