Subject: bug#54063: automake cannot run without generated Texinfo manual

From: Karl Berry <[email-masked]>
Date: Fri, 14 Jul 2023 15:27:02 -0600

I meant to include the patch I actually applied.

commit 5c85a9d31830a61facc298fa7d7d82f5651f1a6c
Author: Bogdan <[email-masked]>
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
+
+: