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>
7 # 1.0 06-Aug-1994 Charles Bailey bailey@newman.upenn.edu
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
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
24 if ($#ARGV > -1 && $ARGV[0] =~ /^[\-\/]trim/i) {
28 $infile = $#ARGV > -1 ? shift(@ARGV) : "Descrip.MMS";
29 $outfile = $#ARGV > -1 ? shift(@ARGV) : "Makefile";
31 # set any other args in %macros - set VAXC by default
32 foreach (@ARGV) { $macros{"\U$_"}=1 }
35 $macros{"DECC"} = 1 if $macros{"__AXP__"};
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]
41 open(INFIL,$infile) || die "Can't open $infile: $!\n";
42 open(OUTFIL,">$outfile") || die "Can't open $outfile: $!\n";
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";
50 s/$infile/$outfile/eoi;
52 if (!/^\#\:/) {print OUTFIL;}
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)
60 print OUTFIL "#> ",$_ unless $do_trim;
61 unshift @conditions, ($macros{"\U$1"} ? $conditions[0] : 0);
65 # reverse $conditions[0] for .else provided surrounding if is active
68 print OUTFIL "#> ",$_ unless $do_trim;
69 $conditions[0] = $conditions[1] && !$conditions[0];
73 # pop top condition for .endif
76 print OUTFIL "#> ",$_ unless $do_trim;
81 next if ($do_trim && !$conditions[0]);
83 # spot new rule and pick up first source file, since some versions of
84 # Make don't provide a macro for this
86 if (/:\s+([^\s,]+)/) { $firstsrc = $1 }
87 else { $firstsrc = "\$<" }
90 #convert macros we expect to see in MakeMaker-generated Descrip.MMSs
91 s#/Descrip=\s*\n#-f \nMMS = make\n#;
93 s#MACROEND = \)#MACROEND = #;
94 if (m#\$\(USEMACROS\)(.*)(\$\(MACROEND\))?#) {
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
100 print OUTFIL $conditions[0] ? "#> " : "",$_;
102 m#(.*)(\$\(MACROEND\))?#;
107 s/^\.first/\.first:/i;
108 s/^\.suffixes/\.suffixes:/i;
109 s/\@\[\.vms\]/\$\$\@\[\.vms\]/;
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];