| 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"; |