Commit | Line | Data |
---|---|---|
7a958ec3 BS |
1 | # genmk95.pl - uses miniperl to generate a makefile that command.com will |
2 | # understand given one that cmd.exe will understand | |
8ec44883 GS |
3 | |
4 | # Author: Benjamin K. Stuhl | |
7a958ec3 | 5 | # Date: 10-16-1999 |
8ec44883 GS |
6 | |
7 | # how it works: | |
8 | # dmake supports an alternative form for its recipes, called "group | |
7a958ec3 BS |
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. | |
8ec44883 GS |
14 | |
15 | my ($filein, $fileout) = @ARGV; | |
16 | ||
7a958ec3 BS |
17 | open my $in, $filein or die "Error opening input file: $!\n"; |
18 | open my $out, "> $fileout" or die "Error opening output file: $!\n"; | |
8ec44883 GS |
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 | ||
7a958ec3 BS |
24 | _HOME_DIR := \$(PWD) |
25 | ||
8ec44883 GS |
26 | _EOH_ |
27 | ||
28 | my $inrec = 0; | |
29 | ||
30 | while (<$in>) | |
31 | { | |
32 | chomp; | |
7a958ec3 | 33 | if (/^[^#.\t][^#=]*?:(?:[^=]|$)/) |
8ec44883 GS |
34 | { |
35 | if (! $inrec) | |
36 | { | |
37 | print $out "$_\n"; | |
7a958ec3 | 38 | while (/\\\s*$/) |
8ec44883 GS |
39 | { |
40 | chomp($_ = <$in>); | |
41 | print $out "$_\n"; | |
42 | } | |
43 | print $out "@[\n"; | |
44 | $inrec = 1; | |
45 | next; | |
46 | } | |
47 | else { | |
5db10396 GS |
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 | } | |
8ec44883 | 53 | print $out "$_\n"; |
8ec44883 GS |
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 "||"); | |
7a958ec3 | 76 | print $out "\tcd \$(_HOME_DIR)\n"; |
8ec44883 GS |
77 | next; |
78 | } | |
79 | # fall through - no need for special handling | |
80 | print $out "$_\n"; | |
81 | } | |
82 | print $out "]\n" if ($inrec); | |
83 | ||
7a958ec3 BS |
84 | close $in or warn "Error closing \$in: $!\n"; |
85 | close $out or warn "Error closing \$out: $!\n"; |