1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-07-01 19:42:48 -05:00

Switch to using automake for the Unix autoconfigured build.

mkfiles.pl no longer generates a Makefile.in, but instead generates a
Makefile.am on which mkauto.sh runs automake. This means that the
autoconfigured makefile now does build-time dependency tracking (a
standard feature of automake-generated makefiles), and is generally
more like what Unix people will expect.

Some of the old-style make command-line settings (VER=-DRELEASE=foo,
XFLAGS=-DDEBUG) will still work; the COMPAT settings are better done
by autoconfiguration, and my habitual 'XFLAGS="-g -O0"' for an easily
debuggable build will actually not work any more because CFLAGS is
specified _after_ XFLAGS, so I should instead write 'make CFLAGS=-O0'
(-g is the default in automake, removed at 'make install' time).

The new makefile will automatically degrade into one that builds the
command-line tools only, in the case where GTK could not be found. In
principle, therefore, it should be an adequate replacement for _both_
the static Unix makefiles, Makefile.gtk and Makefile.ux. I haven't
actually retired those in this commit, but I'm pretty tempted.

[originally from svn r9239]
This commit is contained in:
Simon Tatham
2011-07-23 11:33:29 +00:00
parent 860cd79efd
commit 64150a5ef2
7 changed files with 211 additions and 125 deletions

View File

@ -64,6 +64,12 @@ while (<IN>) {
if ($_[0] eq "!srcdir") { push @srcdirs, $_[1]; next; }
if ($_[0] eq "!makefile" and &mfval($_[1])) { $makefiles{$_[1]}=$_[2]; next;}
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 "";
$cflags{$_[1]}->{$_[2]} = $rest;
next;
}
if ($_[0] eq "!forceobj") { $forceobj{$_[1]} = 1; next; }
if ($_[0] eq "!begin") {
if (&mfval($_[1])) {
@ -177,11 +183,13 @@ foreach $i (@prognames) {
# file name into a listref containing further source file names.
%further = ();
%allsourcefiles = (); # this is wanted by some makefiles
while (scalar @scanlist > 0) {
$file = shift @scanlist;
next if defined $further{$file}; # skip if we've already done it
$further{$file} = [];
$dirfile = &findfile($file);
$allsourcefiles{$dirfile} = 1;
open IN, "$dirfile" or die "unable to open source file $file\n";
while (<IN>) {
chomp;
@ -226,7 +234,7 @@ sub mfval($) {
# prints a warning and returns false;
if (grep { $type eq $_ }
("vc","vcproj","cygwin","borland","lcc","devcppproj","gtk","unix",
"ac","osx",)) {
"am","osx",)) {
return 1;
}
warn "$.:unknown makefile type '$type'\n";
@ -1084,71 +1092,89 @@ if (defined $makefiles{'unix'}) {
select STDOUT; close OUT;
}
if (defined $makefiles{'ac'}) {
$dirpfx = &dirpfx($makefiles{'ac'}, "/");
if (defined $makefiles{'am'}) {
$dirpfx = "\$(srcdir)/" . &dirpfx($makefiles{'am'}, "/");
##-- Unix/autoconf makefile
open OUT, ">$makefiles{'ac'}"; select OUT;
##-- Unix/autoconf Makefile.am
open OUT, ">$makefiles{'am'}"; select OUT;
print
"# Makefile.in for $project_name under Unix with Autoconf.\n".
"# Makefile.am for $project_name under Unix with Autoconf/Automake.\n".
"#\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";
# gcc command line option is -D not /D
($_ = $help) =~ s/([=" ])\/D/$1-D/gs;
print $_;
print
"\n".
"CC = \@CC\@\n".
"\n".
&splitline("CFLAGS = \@CFLAGS\@ \@PUTTYCFLAGS\@ \@CPPFLAGS\@ " .
"\@DEFS\@ \@GTK_CFLAGS\@ " .
(join " ", map {"-I$dirpfx$_"} @srcdirs))."\n".
"XLDFLAGS = \@LDFLAGS\@ \@LIBS\@ \@GTK_LIBS\@\n".
"ULDFLAGS = \@LDFLAGS\@ \@LIBS\@\n".
"INSTALL=\@INSTALL\@\n".
"INSTALL_PROGRAM=\$(INSTALL)\n".
"INSTALL_DATA=\$(INSTALL)\n".
"prefix=\@prefix\@\n".
"exec_prefix=\@exec_prefix\@\n".
"bindir=\@bindir\@\n".
"datarootdir=\@datarootdir\@\n".
"mandir=\@mandir\@\n".
"man1dir=\$(mandir)/man1\n".
"\n".
&def($makefile_extra{'gtk'}->{'vars'}) .
"\n".
".SUFFIXES:\n".
"\n".
"\n".
"all: \@all_targets\@\n".
&splitline("all-cli:" . join "", map { " $_" } &progrealnames("U"))."\n".
&splitline("all-gtk:" . join "", map { " $_" } &progrealnames("X"))."\n";
print "\n";
"# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.\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
# (version.o) can conveniently be made to depend on it.
@sources = ("allsources", "=",
map {"${dirpfx}$_"} sort keys %allsourcefiles);
print &splitline(join " ", @sources), "\n\n";
@cliprogs = ("bin_PROGRAMS", "=");
foreach $p (&prognames("U")) {
($prog, $type) = split ",", $p;
push @cliprogs, $prog;
}
@allprogs = @cliprogs;
foreach $p (&prognames("X")) {
($prog, $type) = split ",", $p;
push @allprogs, $prog;
}
print "if HAVE_GTK\n";
print &splitline(join " ", @allprogs), "\n";
print "else\n";
print &splitline(join " ", @cliprogs), "\n";
print "endif\n\n";
%objtosrc = ();
foreach $d (&deps("X", undef, $dirpfx, "/", "am")) {
$objtosrc{$d->{obj}} = $d->{deps}->[0];
}
@amcflags = ("\$(COMPAT)", "\$(XFLAGS)", map {"-I$dirpfx$_"} @srcdirs);
print "if HAVE_GTK\n";
print &splitline(join " ", "AM_CFLAGS", "=",
"\$(GTK_CFLAGS)", @amcflags), "\n";
print "else\n";
print &splitline(join " ", "AM_CFLAGS", "=", @amcflags), "\n";
print "endif\n\n";
%amspeciallibs = ();
foreach $obj (sort { $a cmp $b } keys %{$cflags{'am'}}) {
print "lib${obj}_a_SOURCES = ", $objtosrc{$obj}, "\n";
print &splitline(join " ", "lib${obj}_a_CFLAGS", "=", @amcflags,
$cflags{'am'}->{$obj}), "\n";
$amspeciallibs{$obj} = "lib${obj}.a";
}
print &splitline(join " ", "noinst_LIBRARIES", "=",
sort { $a cmp $b } values %amspeciallibs), "\n\n";
foreach $p (&prognames("X:U")) {
($prog, $type) = split ",", $p;
$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";
}
foreach $d (&deps("X.o", undef, $dirpfx, "/", "gtk")) {
if ($forceobj{$d->{obj_orig}}) {
printf("%s: FORCE\n", $d->{obj});
} else {
print &splitline(sprintf("%s: %s", $d->{obj},
join " ", @{$d->{deps}})), "\n";
print "if HAVE_GTK\n" if $type eq "X";
@progsources = ("${prog}_SOURCES", "=");
%sourcefiles = ();
@ldadd = ();
$objstr = &objects($p, "X", undef, undef);
foreach $obj (split / /,$objstr) {
if ($amspeciallibs{$obj}) {
push @ldadd, $amspeciallibs{$obj};
} else {
$sourcefiles{$objtosrc{$obj}} = 1;
}
}
print &splitline("\t\$(CC) \$(COMPAT) \$(CFLAGS) \$(XFLAGS) -c $d->{deps}->[0]\n");
push @progsources, sort { $a cmp $b } keys %sourcefiles;
print &splitline(join " ", @progsources), "\n";
if ($type eq "X") {
push @ldadd, "\$(GTK_LIBS)";
}
if (@ldadd) {
print &splitline(join " ", "${prog}_LDADD", "=", @ldadd), "\n";
}
print "endif\n" if $type eq "X";
print "\n";
}
print "\n";
print $makefile_extra{'gtk'}->{'end'};
print "\nclean:\n".
"\trm -f *.o". (join "", map { " $_" } &progrealnames("X:U")) . "\n";
print "\ndistclean: clean\n".
"\t". &splitline("rm -f config.status config.cache config.log ".
"configure.lineno config.status.lineno Makefile") . "\n";
print "\nFORCE:\n";
print $makefile_extra{'am'}->{'end'};
select STDOUT; close OUT;
}