home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / perl560.zip / win32 / genmk95.pl < prev    next >
Text File  |  1999-12-28  |  2KB  |  86 lines

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