Encode is actually version 2.37 from CPAN.
[perl.git] / win32 / genmk95.pl
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     $one =~ s/^\t(?:-(?!-))?\@?(.*?)$/\t$1/;   # no -,@ in group recipes
68 LINE_CONT:
69     if ($two =~ /\\\s*$/)
70     {
71        chomp ($two .= "\n" . scalar <$in>);
72        goto LINE_CONT;
73     }
74     s/^\s*// for ($one, $two);
75     print $out "\t$one\n\t$two\n" if ($sep eq "&&");
76     print $out "\t$one\n\tif errorlevel 1 $two\n" if ($sep eq "||");
77     print $out "\tcd \$(_HOME_DIR)\n";
78     next;
79  }
80      # fall through - no need for special handling
81  s/^\t(?:-(?!-))?\@?(.*?)$/\t$1/;      # no -,@ in group recipes
82  print $out "$_\n";
83 }
84 print $out "]\n" if ($inrec);
85
86 close $in or warn "Error closing \$in: $!\n";
87 close $out or warn "Error closing \$out: $!\n";