diff options
Diffstat (limited to 'win32/genmk95.pl')
-rw-r--r-- | win32/genmk95.pl | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/win32/genmk95.pl b/win32/genmk95.pl new file mode 100644 index 0000000000..8fe4f86dbf --- /dev/null +++ b/win32/genmk95.pl @@ -0,0 +1,85 @@ +# genmk95.pl - uses miniperl to generate a makefile that command.com will +# understand given one that cmd.exe will understand + +# Author: Benjamin K. Stuhl +# Date: 10-16-1999 + +# how it works: +# dmake supports an alternative form for its recipes, called "group +# recipes", in which all elements of a recipe are run with only one shell. +# This program converts the standard dmake makefile.mk to one using group +# recipes. This is done so that lines using && or || (which command.com +# doesn't understand) may be split into two lines that will still be run +# with one shell. + +my ($filein, $fileout) = @ARGV; + +open my $in, $filein or die "Error opening input file: $!\n"; +open my $out, "> $fileout" or die "Error opening output file: $!\n"; + +print $out <<_EOH_; +# *** Warning: this file is autogenerated from $filein by $0 *** +# *** Do not edit this file - edit $filein instead *** + +_HOME_DIR := \$(PWD) + +_EOH_ + +my $inrec = 0; + +while (<$in>) +{ + chomp; + if (/^[^#.\t][^#=]*?:(?:[^=]|$)/) + { + if (! $inrec) + { + print $out "$_\n"; + while (/\\\s*$/) + { + chomp($_ = <$in>); + print $out "$_\n"; + } + print $out "@[\n"; + $inrec = 1; + next; + } + else { + if (!/^\t/) { + seek ($out, -4, 2); # no recipe, so back up and undo grouping + # should be -3, but MS has its CR/LF thing... + $inrec = 0; + } + print $out "$_\n"; + next; + } + } + if ((/^\s*$/ || /^[^#.\t][^#=]*?:/) && $inrec) + { + print $out "]\n"; + print $out "$_\n"; + $inrec = 0; + next; + } + if (/^(.*?)(&&|\|\|)(.*)$/) # two commands separated by && or || + { + my ($one, $sep, $two) = ($1, $2, $3); +LINE_CONT: + if ($two =~ /\\\s*$/) + { + chomp ($two .= "\n" . scalar <$in>); + goto LINE_CONT; + } + s/^\s*// for ($one, $two); + print $out "\t$one\n\t$two\n" if ($sep eq "&&"); + print $out "\t$one\n\tif errorlevel 1 $two\n" if ($sep eq "||"); + print $out "\tcd \$(_HOME_DIR)\n"; + next; + } + # fall through - no need for special handling + print $out "$_\n"; +} +print $out "]\n" if ($inrec); + +close $in or warn "Error closing \$in: $!\n"; +close $out or warn "Error closing \$out: $!\n"; |