I meant to include the patch I actually applied. commit 5c85a9d31830a61facc298fa7d7d82f5651f1a6c Author: Bogdan <bogdro_...@gmx.us> AuthorDate: Thu Jul 13 15:32:34 2023 -0700
texi: assume .texi.in generates .texi. This change refines the fix for https://bugs.gnu.org/54063. * bin/automake.in (scan_texinfo_file): if .texi doesn't exist, but .texi.in exists, read the latter for the Texinfo source. Use the @setfilename argument, if present, to generate rules. * t/txinfo-no-texi-but-texi-in.sh: new test. * t/list-of-tests.mk (handwritten_tests): add it. * doc/automake.texi (Texinfo): document this. * NEWS: mention this. (Doc changes written by Karl.) --- NEWS | 6 ++++ bin/automake.in | 37 ++++++++++++++++++++---- doc/automake.texi | 32 +++++++++++++++++---- t/list-of-tests.mk | 1 + t/txinfo-no-texi-but-texi-in.sh | 63 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 128 insertions(+), 11 deletions(-) diff --git a/NEWS b/NEWS index 23b2cc50a..c64d4ef15 100644 --- a/NEWS +++ b/NEWS @@ -21,6 +21,12 @@ New in 1.17: - Variables using escaped \# will trigger portability warnings, but be retained when appended. GNU Make & BSD Makes are known to support it. + - For Texinfo documents, if a .texi.in file exists, but no .texi, the + .texi.in will be read. Texinfo source files need not be present at + all, and if present, need not contain @setfilename. Then the file name + as given in the Makefile.am will be used. If @setfilename is present, + it should be the basename of the Texinfo file, extended with .info. + * Bugs fixed - Generated file timestamp checks now handle filesystems with sub-second diff --git a/bin/automake.in b/bin/automake.in index 1c13a3187..369a47fa2 100644 --- a/bin/automake.in +++ b/bin/automake.in @@ -3061,11 +3061,24 @@ sub handle_scripts () sub scan_texinfo_file { my ($filename) = @_; + my $orig_filename = $filename; # If the source file doesn't exist, we'll fall back below. - my $source = -e $filename ? $filename : "/dev/null"; - my $texi = new Automake::XFile "< $source"; - verb "reading $filename"; + if (! -e $filename) + { + if (-e ($filename . '.in')) + { + # $filename.texi.in exists: assume $filename.texi is generated + # and parse $filename.texi.in as the real input. + $filename .= '.in'; + } + else + { + $filename = '/dev/null'; + } + } + my $texi = new Automake::XFile "< $filename"; + verb "reading texinfo_file $filename"; my ($outfile, $vfile); while ($_ = $texi->getline) @@ -3077,6 +3090,18 @@ sub scan_texinfo_file # to use @setfilename...) next if $outfile; + # Although we notice the @setfilename, and the rules are + # adjusted to sort of use it, they don't actually work. + # Specifically, if foo.texi contains @setfilename bar.info, + # the generated .texi.info suffix rule will not run. + # + # Also, although we change the .info target to be bar.info, + # the HTML(S) variable/etc. is not changed. + # + # Since @setfilename is optional nowadays, doesn't seem worth + # the trouble to handle (which looks to be nontrivial). + # https://bugs.gnu.org/54063 + $outfile = $1; if (index ($outfile, '.') < 0) { @@ -3100,8 +3125,10 @@ sub scan_texinfo_file if (! $outfile) { - # Replace a .texi extension with .info - $outfile = basename($filename); + # If no explicit @setfilename, use the original filename as passed + # (not foo.texi.in or /dev/null) in the generated rules, while + # replacing any extension (presumably .texi) with .info. + $outfile = basename ($orig_filename); $outfile =~ s/\.[^.]+$//; $outfile .= '.info'; } diff --git a/doc/automake.texi b/doc/automake.texi index 1bf74cd73..4561d1948 100644 --- a/doc/automake.texi +++ b/doc/automake.texi @@ -8036,6 +8036,7 @@ Currently Automake provides support for Texinfo and man pages. @node Texinfo @section Texinfo +@cindex Texinfo support @cindex @code{_TEXINFOS} primary, defined @cindex @code{TEXINFOS} primary, defined @cindex Primary variable, @code{TEXINFOS} @@ -8069,7 +8070,25 @@ rather than in the @code{builddir}. This can be changed with the If the Texinfo sources are in a subdirectory relative to the Makefile, then @code{-I} flags for the subdirectory, both in the source directory and in the build directory, will automatically be added. There is no need to specify -these in @samp{$(MAKEINFO)}, @samp{$(MAKEINFOFLAGS)}, etc... +these in @samp{$(MAKEINFO)}, @samp{$(MAKEINFOFLAGS)}, etc. + +@cindex @samp{@@setfilename} Texinfo directive +If a Texinfo source file contains an @samp{@@setfilename} directive, +and its argument has extension @samp{.info} (or no extension, but this +is discouraged), that argument should be the same as the basename of +the Texinfo file, extended with @samp{.info}. The Make rules +generated by Automake assume this, and will not work if the +@samp{@@setfilename} is for some other name. + +@cindex @file{.texi.in} file, read +If a Texinfo source @samp{foo.texi} is not present, but +@file{foo.texi.in} exists, Texinfo will read that @file{.texi.in} file +for @code{@@setfilename} and @code{@@include version.texi} (described +below). + +Texinfo source files need not be present at all, and if present, need +not contain @code{@@setfilename}. Then the file name given in the +Makefile.am will be used. @trindex dvi @trindex html @@ -8102,11 +8121,12 @@ All of these targets can be extended using @samp{-local} rules @cindex @file{mdate-sh} -If the @file{.texi} file @code{@@include}s @file{version.texi}, then -that file will be automatically generated. The file @file{version.texi} -defines four Texinfo flags you can reference using -@code{@@value@{EDITION@}}, @code{@@value@{VERSION@}}, -@code{@@value@{UPDATED@}}, and @code{@@value@{UPDATED-MONTH@}}. +If a @file{.texi} file @code{@@include}s @file{version.texi} (actually +any file named @file{vers...texi}, then that file will be +automatically generated. The file @file{version.texi} defines four +Texinfo flags you can reference using @code{@@value@{EDITION@}}, +@code{@@value@{VERSION@}}, @code{@@value@{UPDATED@}}, and +@code{@@value@{UPDATED-MONTH@}}. @table @code @item EDITION diff --git a/t/list-of-tests.mk b/t/list-of-tests.mk index 6f25f0494..94781d9b0 100644 --- a/t/list-of-tests.mk +++ b/t/list-of-tests.mk @@ -1232,6 +1232,7 @@ t/txinfo-no-installinfo.sh \ t/txinfo-no-repeated-targets.sh \ t/txinfo-no-setfilename.sh \ t/txinfo-no-setfilename-no-inputs.sh \ +t/txinfo-no-texi-but-texi-in.sh \ t/txinfo-other-suffixes.sh \ t/txinfo-override-infodeps.sh \ t/txinfo-override-texinfo-tex.sh \ diff --git a/t/txinfo-no-texi-but-texi-in.sh b/t/txinfo-no-texi-but-texi-in.sh new file mode 100644 index 000000000..7975d4b01 --- /dev/null +++ b/t/txinfo-no-texi-but-texi-in.sh @@ -0,0 +1,63 @@ +#! /bin/sh +# Copyright (C) 2023 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +# Check if Automake doesn't exit with an error for Texinfo output files +# without a direct input file, but with a matching input file processed +# by 'configure' (file.texi.in). +# https://debbugs.gnu.org/cgi/bugreport.cgi?bug=54063#41 +# +# This also tests an @setfilename that is different from the file name, +# and the lack of any @setfilename, in the case of using .texi.in. +# (See scan_texinfo_file in automake.) + +. test-init.sh + +echo AC_OUTPUT >> configure.ac + +cat > Makefile.am << 'END' +info_TEXINFOS = main.texi +END + +cat > main.texi.in << 'END' +\input texinfo +@setfilename main.info +@settitle main +@node Top +Hello world. +@bye +END + +$ACLOCAL +$AUTOMAKE --add-missing + +grep '/main.info:' Makefile.in + +# Recreate the test document without @setfilename. +cat > main.texi.in << 'END' +\input texinfo +@settitle main +@node Top +Hello world. +@bye +END + +$ACLOCAL +$AUTOMAKE + +# The result should use main.info (from the .texi file name). +grep '/main.info:' Makefile.in + +: