Zero entries were skipped, fix from Adrian Goalby
[p5sagit/p5-mst-13.2.git] / win32 / genmk95.pl
1 # genmk95.pl - uses miniperl to generate a makefile that command.com will
2 #              understand given one that cmd.exe will understand
3
4 # Author: Benjamin K. Stuhl
5 # Date: 10-16-1999
6
7 # how it works:
8 #    dmake supports an alternative form for its recipes, called "group
9 #    recipes", in which all elements of a recipe are run with only one shell.
10 #    This program converts the standard dmake makefile.mk to one using group
11 #    recipes. This is done so that lines using && or || (which command.com
12 #    doesn't understand) may be split into two lines that will still be run
13 #    with one shell.
14
15 my ($filein, $fileout) = @ARGV;
16
17 open my $in, $filein or die "Error opening input file: $!\n";
18 open my $out, "> $fileout" or die "Error opening output file: $!\n";
19
20 print $out <<_EOH_;
21 # *** Warning: this file is autogenerated from $filein by $0 ***
22 # *** Do not edit this file - edit $filein instead           ***
23
24 _HOME_DIR := \$(PWD)
25
26 _EOH_
27
28 my $inrec = 0;
29
30 while (<$in>)
31 {
32  chomp;
33  if (/^[^#.\t][^#=]*?:(?:[^=]|$)/)
34  {
35     if (! $inrec)
36     {
37        print $out "$_\n";
38        while (/\\\s*$/)
39        {
40           chomp($_ = <$in>);
41           print $out "$_\n";
42        }
43        print $out "@[\n";
44        $inrec = 1;
45        next;
46     }
47     else {
48        if (!/^\t/) {
49            seek ($out, -4, 2);      # no recipe, so back up and undo grouping
50                                     # should be -3, but MS has its CR/LF thing...
51            $inrec = 0;
52        }
53        print $out "$_\n";
54        next;
55     }
56  }
57  if ((/^\s*$/ || /^[^#.\t][^#=]*?:/) && $inrec)
58  {
59     print $out "]\n";
60     print $out "$_\n";
61     $inrec = 0;
62     next;
63  }
64  if (/^(.*?)(&&|\|\|)(.*)$/)  # two commands separated by && or ||
65  {
66     my ($one, $sep, $two) = ($1, $2, $3);
67 LINE_CONT:
68     if ($two =~ /\\\s*$/)
69     {
70        chomp ($two .= "\n" . scalar <$in>);
71        goto LINE_CONT;
72     }
73     s/^\s*// for ($one, $two);
74     print $out "\t$one\n\t$two\n" if ($sep eq "&&");
75     print $out "\t$one\n\tif errorlevel 1 $two\n" if ($sep eq "||");
76     print $out "\tcd \$(_HOME_DIR)\n";
77     next;
78  }
79      # fall through - no need for special handling
80  print $out "$_\n";
81 }
82 print $out "]\n" if ($inrec);
83
84 close $in or warn "Error closing \$in: $!\n";
85 close $out or warn "Error closing \$out: $!\n";