foreach $p (&prognames("G:C")) {
($prog, $type) = split ",", $p;
$objstr = &objects($p, "X.obj", "X.res", undef);
- print &splitline("$prog.exe: " . $objstr . " $prog.rsp"), "\n";
- print "\tlink \$(LFLAGS) \$(XLFLAGS) -out:$prog.exe -map:$prog.map \@$prog.rsp\n\n";
- }
- foreach $p (&prognames("G:C")) {
- ($prog, $type) = split ",", $p;
- print $prog, ".rsp: \$(MAKEFILE)\n";
+ print &splitline("$prog.exe: " . $objstr), "\n";
+
$objstr = &objects($p, "X.obj", "X.res", "X.lib");
+ $subsys = ($type eq "G") ? "windows" : "console";
+ $inlinefilename = "link_$prog";
+ print "\ttype <<$inlinefilename\n";
@objlist = split " ", $objstr;
@objlines = ("");
foreach $i (@objlist) {
- if (length($objlines[$#objlines] . " $i") > 50) {
+ if (length($objlines[$#objlines] . " $i") > 72) {
push @objlines, "";
}
$objlines[$#objlines] .= " $i";
}
- $subsys = ($type eq "G") ? "windows" : "console";
- print "\techo /nologo /subsystem:$subsys > $prog.rsp\n";
for ($i=0; $i<=$#objlines; $i++) {
- print "\techo$objlines[$i] >> $prog.rsp\n";
+ print "$objlines[$i]\n";
}
- print "\n";
+ print "<<\n";
+ print "\tlink \$(LFLAGS) \$(XLFLAGS) -out:$prog.exe -map:$prog.map -nologo -subsystem:$subsys \@$inlinefilename\n\n";
}
foreach $d (&deps("X.obj", "X.res", $dirpfx, "\\", "vc")) {
$extradeps = $forceobj{$d->{obj_orig}} ? ["*.c","*.h","*.rc"] : [];
print &splitline(sprintf("%s: %s", $d->{obj},
join " ", @$extradeps, @{$d->{deps}})), "\n";
- if ($d->{obj} =~ /.obj$/) {
- print "\tcl \$(COMPAT) \$(CFLAGS) \$(XFLAGS) /c ".$d->{deps}->[0],"\n\n";
- } else {
- print "\trc \$(RCFL) -r \$(RCFLAGS) ".$d->{deps}->[0],"\n\n";
+ if ($d->{obj} =~ /.res$/) {
+ print "\trc /Fo@{[$d->{obj}]} \$(RCFL) -r \$(RCFLAGS) ".$d->{deps}->[0],"\n\n";
}
}
print "\n";
+ foreach $srcdir ("", @srcdirs) {
+ if ($srcdir ne "") {
+ $srcdir =~ s!/!\\!g;
+ $srcdir = $dirpfx . $srcdir;
+ $srcdir =~ s!\\\.\\!\\!;
+ $srcdir = "{$srcdir}"
+ }
+ # The double colon at the end of the line makes this a
+ # 'batch-mode inference rule', which means that nmake will
+ # aggregate multiple invocations of the rule and issue just
+ # one cl command with multiple source-file arguments. That
+ # noticeably speeds up builds, since starting up the cl
+ # process is a noticeable overhead and now has to be done far
+ # fewer times.
+ print "${srcdir}.c.obj::\n\tcl /Fo\$(BUILDDIR) \$(COMPAT) \$(CFLAGS) \$(XFLAGS) /c \$<\n\n";
+ }
print &def($makefile_extra{'vc'}->{'end'});
print "\nclean: tidy\n".
"\t-del *.exe\n\n".