# genmk95.pl - uses miniperl to generate a makefile that command.com # (and dmake) will understand given one that cmd.exe will understand # Author: Benjamin K. Stuhl # Date: 8-18-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. my ($filein, $fileout) = @ARGV; chomp (my $loc = `cd`); open my $in, $filein or die "Error opening input file: $!"; open my $out, "> $fileout" or die "Error opening output file: $!"; print $out <<_EOH_; # *** Warning: this file is autogenerated from $filein by $0 *** # *** Do not edit this file - edit $filein instead *** _EOH_ my $inrec = 0; while (<$in>) { chomp; if (/^[^#.\t][^#=]*?:/) { if (! $inrec) { print $out "$_\n"; while (/\\$/) { chomp($_ = <$in>); print $out "$_\n"; } print $out "@[\n"; $inrec = 1; next; } else { seek ($out, -3, 2); # no recipe, so back up and undo grouping print $out "$_\n"; $inrec = 0; 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 $loc\n"; next; } # fall through - no need for special handling print $out "$_\n"; } print $out "]\n" if ($inrec); close $in; close $out;