integrate mainline changes
[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        seek ($out, -3, 2);      # no recipe, so back up and undo grouping
49        print $out "$_\n";
50        $inrec = 0;
51        next;
52     }
53  }
54  if ((/^\s*$/ || /^[^#.\t][^#=]*?:/) && $inrec)
55  {
56     print $out "]\n";
57     print $out "$_\n";
58     $inrec = 0;
59     next;
60  }
61  if (/^(.*?)(&&|\|\|)(.*)$/)  # two commands separated by && or ||
62  {
63     my ($one, $sep, $two) = ($1, $2, $3);
64 LINE_CONT:
65     if ($two =~ /\\\s*$/)
66     {
67        chomp ($two .= "\n" . scalar <$in>);
68        goto LINE_CONT;
69     }
70     s/^\s*// for ($one, $two);
71     print $out "\t$one\n\t$two\n" if ($sep eq "&&");
72     print $out "\t$one\n\tif errorlevel 1 $two\n" if ($sep eq "||");
73     print $out "\tcd \$(_HOME_DIR)\n";
74     next;
75  }
76      # fall through - no need for special handling
77  print $out "$_\n";
78 }
79 print $out "]\n" if ($inrec);
80
81 close $in or warn "Error closing \$in: $!\n";
82 close $out or warn "Error closing \$out: $!\n";