This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[PATCH: perl@11564] introducing perlivp
[perl5.git] / win32 / genmk95.pl
CommitLineData
7a958ec3
BS
1# genmk95.pl - uses miniperl to generate a makefile that command.com will
2# understand given one that cmd.exe will understand
8ec44883
GS
3
4# Author: Benjamin K. Stuhl
7a958ec3 5# Date: 10-16-1999
8ec44883
GS
6
7# how it works:
8# dmake supports an alternative form for its recipes, called "group
7a958ec3
BS
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.
8ec44883
GS
14
15my ($filein, $fileout) = @ARGV;
16
7a958ec3
BS
17open my $in, $filein or die "Error opening input file: $!\n";
18open my $out, "> $fileout" or die "Error opening output file: $!\n";
8ec44883
GS
19
20print $out <<_EOH_;
21# *** Warning: this file is autogenerated from $filein by $0 ***
22# *** Do not edit this file - edit $filein instead ***
23
7a958ec3
BS
24_HOME_DIR := \$(PWD)
25
8ec44883
GS
26_EOH_
27
28my $inrec = 0;
29
30while (<$in>)
31{
32 chomp;
7a958ec3 33 if (/^[^#.\t][^#=]*?:(?:[^=]|$)/)
8ec44883
GS
34 {
35 if (! $inrec)
36 {
37 print $out "$_\n";
7a958ec3 38 while (/\\\s*$/)
8ec44883
GS
39 {
40 chomp($_ = <$in>);
41 print $out "$_\n";
42 }
43 print $out "@[\n";
44 $inrec = 1;
45 next;
46 }
47 else {
5db10396
GS
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 }
8ec44883 53 print $out "$_\n";
8ec44883
GS
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);
67LINE_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 "||");
7a958ec3 76 print $out "\tcd \$(_HOME_DIR)\n";
8ec44883
GS
77 next;
78 }
79 # fall through - no need for special handling
80 print $out "$_\n";
81}
82print $out "]\n" if ($inrec);
83
7a958ec3
BS
84close $in or warn "Error closing \$in: $!\n";
85close $out or warn "Error closing \$out: $!\n";