X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=mkfiles.pl;h=1e9303270d4c910c26b87510f00c9f51fbcaac84;hb=145ecf611238c4f1e39d89d3eee40319a2c54fe8;hp=bb767c168313f0e905c9eeb8d6e0950676427130;hpb=a947c49bec36957cb5d38e1dc2e22dc0e3465849;p=PuTTY.git diff --git a/mkfiles.pl b/mkfiles.pl index bb767c16..1e930327 100755 --- a/mkfiles.pl +++ b/mkfiles.pl @@ -45,9 +45,10 @@ open IN, "Recipe" or do { }; # HACK: One of the source files in `charset' is auto-generated by -# sbcsgen.pl. We need to generate that _now_, before attempting -# dependency analysis. +# sbcsgen.pl, and licence.h is likewise generated by licence.pl. We +# need to generate those _now_, before attempting dependency analysis. eval 'chdir "charset"; require "sbcsgen.pl"; chdir ".."; select STDOUT;'; +eval 'require "licence.pl"; select STDOUT;'; @srcdirs = ("./"); @@ -83,7 +84,15 @@ while () { if ($_[0] eq "!specialobj" and &mfval($_[1])) { $specialobj{$_[1]}->{$_[2]} = 1; next;} if ($_[0] eq "!cflags" and &mfval($_[1])) { ($rest = $_) =~ s/^\s*\S+\s+\S+\s+\S+\s*//; # find rest of input line - $rest = 1 if $rest eq ""; + if ($rest eq "") { + # Make sure this file doesn't get lumped together with any + # other file's cflags. + $rest = "F" . $_[2]; + } else { + # Give this file a specific set of cflags, but permit it to + # go together with other files using the same set. + $rest = "C" . $rest; + } $cflags{$_[1]}->{$_[2]} = $rest; next; } @@ -131,9 +140,10 @@ while () { $i = shift @objs; if ($groups{$i}) { foreach $j (@{$groups{$i}}) { unshift @objs, $j; } - } elsif (($i eq "[G]" or $i eq "[C]" or $i eq "[M]" or - $i eq "[X]" or $i eq "[U]" or $i eq "[MX]") and defined $prog) { + } elsif (($i =~ /^\[([A-Z]*)\]$/) and defined $prog) { $type = substr($i,1,(length $i)-2); + die "unrecognised program type for $prog [$type]\n" + if ! grep { $type eq $_ } qw(G C X U MX XT UT); } else { push @$listref, $i; } @@ -458,10 +468,10 @@ if (defined $makefiles{'cygwin'}) { (join " ", map {"-I$dirpfx$_"} @srcdirs)) . "\n". "LDFLAGS = -mno-cygwin -s\n". - &splitline("RCFLAGS = \$(RCINC) --define WIN32=1 --define _WIN32=1". - " --define WINVER=0x0400")."\n". + &splitline("RCFLAGS = \$(RCINC) --define WIN32=1 --define _WIN32=1 ". + "--define WINVER=0x0400 ".(join " ", map {"-I$dirpfx$_"} @srcdirs))."\n". "\n". - $makefile_extra{'cygwin'}->{'vars'} . + &def($makefile_extra{'cygwin'}->{'vars'}) . "\n". ".SUFFIXES:\n". "\n"; @@ -491,7 +501,7 @@ if (defined $makefiles{'cygwin'}) { } } print "\n"; - print $makefile_extra{'cygwin'}->{'end'}; + print &def($makefile_extra{'cygwin'}->{'end'}); print "\nclean:\n". "\trm -f *.o *.exe *.res.o *.so *.map\n". "\n". @@ -540,7 +550,7 @@ if (defined $makefiles{'borland'}) { "BCB = \$(MAKEDIR)\\..\n". "!endif\n". "\n". - $makefile_extra{'borland'}->{'vars'} . + &def($makefile_extra{'borland'}->{'vars'}) . "\n". ".c.obj:\n". &splitline("\tbcc32 -w-aus -w-ccc -w-par -w-pia \$(COMPAT)". @@ -597,7 +607,7 @@ if (defined $makefiles{'borland'}) { } } print "\n"; - print $makefile_extra{'borland'}->{'end'}; + print &def($makefile_extra{'borland'}->{'end'}); print "\nclean:\n". "\t-del *.obj\n". "\t-del *.exe\n". @@ -634,70 +644,84 @@ if (defined $makefiles{'vc'}) { "# C compilation flags\n". "CFLAGS = /nologo /W3 /O1 " . (join " ", map {"-I$dirpfx$_"} @srcdirs) . - " /D_WINDOWS /D_WIN32_WINDOWS=0x500 /DWINVER=0x500\n". + " /D_WINDOWS /D_WIN32_WINDOWS=0x500 /DWINVER=0x500 /D_CRT_SECURE_NO_WARNINGS\n". "LFLAGS = /incremental:no /fixed\n". - "RCFLAGS = -DWIN32 -D_WIN32 -DWINVER=0x0400\n". + "RCFLAGS = ".(join " ", map {"-I$dirpfx$_"} @srcdirs). + " -DWIN32 -D_WIN32 -DWINVER=0x0400\n". "\n". - $makefile_extra{'vc'}->{'vars'} . + &def($makefile_extra{'vc'}->{'vars'}) . "\n". "\n"; - print &splitline("all:" . join "", map { " $_.exe" } &progrealnames("G:C")); + print &splitline("all:" . join "", map { " \$(BUILDDIR)$_.exe" } &progrealnames("G:C")); print "\n\n"; 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"; - $objstr = &objects($p, "X.obj", "X.res", "X.lib"); + $objstr = &objects($p, "\$(BUILDDIR)X.obj", "\$(BUILDDIR)X.res", undef); + print &splitline("\$(BUILDDIR)$prog.exe: " . $objstr), "\n"; + + $objstr = &objects($p, "\$(BUILDDIR)X.obj", "\$(BUILDDIR)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:\$(BUILDDIR)$prog.exe -map:\$(BUILDDIR)$prog.map -nologo -subsystem:$subsys \@$inlinefilename\n\n"; } - foreach $d (&deps("X.obj", "X.res", $dirpfx, "\\", "vc")) { + foreach $d (&deps("\$(BUILDDIR)X.obj", "\$(BUILDDIR)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"; - print $makefile_extra{'vc'}->{'end'}; + foreach $real_srcdir ("", @srcdirs) { + $srcdir = $real_srcdir; + 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". + "\t-del \$(BUILDDIR)*.exe\n\n". "tidy:\n". - "\t-del *.obj\n". - "\t-del *.res\n". - "\t-del *.pch\n". - "\t-del *.aps\n". - "\t-del *.ilk\n". - "\t-del *.pdb\n". - "\t-del *.rsp\n". - "\t-del *.dsp\n". - "\t-del *.dsw\n". - "\t-del *.ncb\n". - "\t-del *.opt\n". - "\t-del *.plg\n". - "\t-del *.map\n". - "\t-del *.idb\n". - "\t-del debug.log\n"; + "\t-del \$(BUILDDIR)*.obj\n". + "\t-del \$(BUILDDIR)*.res\n". + "\t-del \$(BUILDDIR)*.pch\n". + "\t-del \$(BUILDDIR)*.aps\n". + "\t-del \$(BUILDDIR)*.ilk\n". + "\t-del \$(BUILDDIR)*.pdb\n". + "\t-del \$(BUILDDIR)*.rsp\n". + "\t-del \$(BUILDDIR)*.dsp\n". + "\t-del \$(BUILDDIR)*.dsw\n". + "\t-del \$(BUILDDIR)*.ncb\n". + "\t-del \$(BUILDDIR)*.opt\n". + "\t-del \$(BUILDDIR)*.plg\n". + "\t-del \$(BUILDDIR)*.map\n". + "\t-del \$(BUILDDIR)*.idb\n". + "\t-del \$(BUILDDIR)debug.log\n"; select STDOUT; close OUT; } @@ -1158,7 +1182,7 @@ if (defined $makefiles{'vstudio10'} || defined $makefiles{'vstudio12'}) { " true\n" . " Level3\n" . " " . (join ";", map {"..\\..\\$dirpfx$_"} @srcdirs) . ";%(AdditionalIncludeDirectories)\n" . - " WIN32;NDEBUG;_WINDOWS;SECURITY_WIN32;POSIX;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)\n" . + " WIN32;NDEBUG;_WINDOWS;POSIX;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)\n" . " .\\Release\\\n" . " .\\Release\\$windows_project.pch\n" . " .\\Release\\\n" . @@ -1197,7 +1221,7 @@ if (defined $makefiles{'vstudio10'} || defined $makefiles{'vstudio12'}) { " true\n" . " ProgramDatabase\n" . " " . (join ";", map {"..\\..\\$dirpfx$_"} @srcdirs) . ";%(AdditionalIncludeDirectories)\n" . - " WIN32;_DEBUG;_WINDOWS;SECURITY_WIN32;POSIX;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)\n" . + " WIN32;_DEBUG;_WINDOWS;POSIX;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)\n" . " .\\Debug\\\n" . " .\\Debug\\$windows_project.pch\n" . " .\\Debug\\\n" . @@ -1341,7 +1365,7 @@ if (defined $makefiles{'gtk'}) { "# building with GTK 1.2, or you can set it to `pkg-config gtk+-2.0 x11'\n". "# if you want to enforce 2.0. The default is to try 2.0 and fall back\n". "# to 1.2 if it isn't found.\n". - "GTK_CONFIG = sh -c 'pkg-config gtk+-2.0 x11 \$\$0 2>/dev/null || gtk-config \$\$0'\n". + "GTK_CONFIG = sh -c 'pkg-config gtk+-3.0 x11 \$\$0 2>/dev/null || pkg-config gtk+-2.0 x11 \$\$0 2>/dev/null || gtk-config \$\$0'\n". "\n". "-include Makefile.local\n". "\n". @@ -1377,15 +1401,17 @@ if (defined $makefiles{'gtk'}) { ".SUFFIXES:\n". "\n". "\n"; - print &splitline("all:" . join "", map { " $_" } &progrealnames("X:U")); + print &splitline("all:" . join "", map { " $_" } + &progrealnames("X:XT:U:UT")); print "\n\n"; - foreach $p (&prognames("X:U")) { + foreach $p (&prognames("X:XT:U:UT")) { ($prog, $type) = split ",", $p; + ($ldflags = $type) =~ s/T$//; $objstr = &objects($p, "X.o", undef, undef); print &splitline($prog . ": " . $objstr), "\n"; $libstr = &objects($p, undef, undef, "-lX"); print &splitline("\t\$(CC) -o \$@ " . - $objstr . " \$(${type}LDFLAGS) $libstr", 69), "\n\n"; + $objstr . " \$(${ldflags}LDFLAGS) $libstr", 69), "\n\n"; } foreach $d (&deps("X.o", undef, $dirpfx, "/", "gtk")) { if ($forceobj{$d->{obj_orig}}) { @@ -1397,9 +1423,9 @@ if (defined $makefiles{'gtk'}) { print &splitline("\t\$(CC) \$(COMPAT) \$(CFLAGS) \$(XFLAGS) -c $d->{deps}->[0]\n"); } print "\n"; - print $makefile_extra{'gtk'}->{'end'}; + print &def($makefile_extra{'gtk'}->{'end'}); print "\nclean:\n". - "\trm -f *.o". (join "", map { " $_" } &progrealnames("X:U")) . "\n"; + "\trm -f *.o". (join "", map { " $_" } &progrealnames("X:XT:U:UT")) . "\n"; print "\nFORCE:\n"; select STDOUT; close OUT; } @@ -1444,9 +1470,9 @@ if (defined $makefiles{'unix'}) { ".SUFFIXES:\n". "\n". "\n"; - print &splitline("all:" . join "", map { " $_" } &progrealnames("U")); + print &splitline("all:" . join "", map { " $_" } &progrealnames("U:UT")); print "\n\n"; - foreach $p (&prognames("U")) { + foreach $p (&prognames("U:UT")) { ($prog, $type) = split ",", $p; $objstr = &objects($p, "X.o", undef, undef); print &splitline($prog . ": " . $objstr), "\n"; @@ -1466,7 +1492,7 @@ if (defined $makefiles{'unix'}) { print "\n"; print &def($makefile_extra{'unix'}->{'end'}); print "\nclean:\n". - "\trm -f *.o". (join "", map { " $_" } &progrealnames("U")) . "\n"; + "\trm -f *.o". (join "", map { " $_" } &progrealnames("U:UT")) . "\n"; print "\nFORCE:\n"; select STDOUT; close OUT; } @@ -1482,6 +1508,10 @@ if (defined $makefiles{'am'}) { "#\n# This file was created by `mkfiles.pl' from the `Recipe' file.\n". "# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.\n\n"; + # 2014-02-22: as of automake-1.14 we begin to get complained at if + # we don't use this option + print "AUTOMAKE_OPTIONS = subdir-objects\n\n"; + # Complete list of source and header files. Not used by the # auto-generated parts of this makefile, but Recipe might like to # have it available as a variable so that mandatory-rebuild things @@ -1505,6 +1535,13 @@ if (defined $makefiles{'am'}) { print &splitline(join " ", @cliprogs), "\n"; print "endif\n\n"; + @noinstcliprogs = ("noinst_PROGRAMS", "="); + foreach $p (&prognames("XT:UT")) { + ($prog, $type) = split ",", $p; + push @noinstcliprogs, $prog; + } + print &splitline(join " ", @noinstcliprogs), "\n"; + %objtosrc = (); foreach $d (&deps("X", undef, "", "/", "am")) { $objtosrc{$d->{obj}} = $d->{deps}->[0]; @@ -1523,17 +1560,19 @@ if (defined $makefiles{'am'}) { %amspeciallibs = (); foreach $obj (sort { $a cmp $b } keys %{$cflags{'am'}}) { + my $flags = $cflags{'am'}->{$obj}; + $flags = "" if $flags !~ s/^C//; print "lib${obj}_a_SOURCES = ", $objtosrc{$obj}, "\n"; print &splitline(join " ", "lib${obj}_a_CFLAGS", "=", @amcflags, - $cflags{'am'}->{$obj}), "\n"; + $flags), "\n"; $amspeciallibs{$obj} = "lib${obj}.a"; } print &splitline(join " ", "noinst_LIBRARIES", "=", sort { $a cmp $b } values %amspeciallibs), "\n\n"; - foreach $p (&prognames("X:U")) { + foreach $p (&prognames("X:XT:U:UT")) { ($prog, $type) = split ",", $p; - print "if HAVE_GTK\n" if $type eq "X"; + print "if HAVE_GTK\n" if $type eq "X" || $type eq "XT"; @progsources = ("${prog}_SOURCES", "="); %sourcefiles = (); @ldadd = (); @@ -1547,16 +1586,16 @@ if (defined $makefiles{'am'}) { } push @progsources, sort { $a cmp $b } keys %sourcefiles; print &splitline(join " ", @progsources), "\n"; - if ($type eq "X") { + if ($type eq "X" || $type eq "XT") { push @ldadd, "\$(GTK_LIBS)"; } if (@ldadd) { print &splitline(join " ", "${prog}_LDADD", "=", @ldadd), "\n"; } - print "endif\n" if $type eq "X"; + print "endif\n" if $type eq "X" || $type eq "XT"; print "\n"; } - print $makefile_extra{'am'}->{'end'}; + print &def($makefile_extra{'am'}->{'end'}); select STDOUT; close OUT; } @@ -1583,11 +1622,11 @@ if (defined $makefiles{'lcc'}) { (join " ", map {"-I$dirpfx$_"} @srcdirs) . "\n". "# Resource compilation flags\n". - "RCFLAGS = \n". + "RCFLAGS = ".(join " ", map {"-I$dirpfx$_"} @srcdirs)."\n". "\n". "# Get include directory for resource compiler\n". "\n". - $makefile_extra{'lcc'}->{'vars'} . + &def($makefile_extra{'lcc'}->{'vars'}) . "\n"; print &splitline("all:" . join "", map { " $_.exe" } &progrealnames("G:C")); print "\n\n"; @@ -1618,7 +1657,7 @@ if (defined $makefiles{'lcc'}) { } } print "\n"; - print $makefile_extra{'lcc'}->{'end'}; + print &def($makefile_extra{'lcc'}->{'end'}); print "\nclean:\n". "\t-del *.obj\n". "\t-del *.exe\n". @@ -1649,9 +1688,9 @@ if (defined $makefiles{'osx'}) { "MLDFLAGS = -framework Cocoa\n". "ULDFLAGS =\n". "\n" . - $makefile_extra{'osx'}->{'vars'} . + &def($makefile_extra{'osx'}->{'vars'}) . "\n" . - &splitline("all:" . join "", map { " $_" } &progrealnames("MX:U")) . + &splitline("all:" . join "", map { " $_" } &progrealnames("MX:U:UT")) . "\n"; foreach $p (&prognames("MX")) { ($prog, $type) = split ",", $p; @@ -1679,7 +1718,7 @@ if (defined $makefiles{'osx'}) { print &splitline("\t\$(CC) \$(MLDFLAGS) -o \$@ " . $objstr . " $libstr", 69), "\n\n"; } - foreach $p (&prognames("U")) { + foreach $p (&prognames("U:UT")) { ($prog, $type) = split ",", $p; $objstr = &objects($p, "X.o", undef, undef); print &splitline($prog . ": " . $objstr), "\n"; @@ -1703,7 +1742,7 @@ if (defined $makefiles{'osx'}) { } print "\n".&def($makefile_extra{'osx'}->{'end'}); print "\nclean:\n". - "\trm -f *.o *.dmg". (join "", map { " $_" } &progrealnames("U")) . "\n". + "\trm -f *.o *.dmg". (join "", map { " $_" } &progrealnames("U:UT")) . "\n". "\trm -rf *.app\n". "\n". "FORCE:\n";