This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
(via private mail)
[perl5.git] / vms / mms2make.pl
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