On 22/03/2026 19.09, Gavin Smith wrote:
On Tue, Mar 17, 2026 at 11:20:17AM +0100, Manuel Jacob wrote:
Hi,

When cross-compiling texinfo in an environment where ncurses is available
for the host machine (e.g. in a sysroot), but not for the build machine,
running `make` fails with the following error:

...

The same error has been reported here:
https://lists.gnu.org/archive/html/bug-texinfo/2013-11/msg00017.html

In the case of cross-compiling, parts of texinfo are built for running on
the build machine (in the `tools` directory). For each of the build machine
and the host machine, it is decided whether the `info` subdirectory is built
or not, based on `HAVE_TERMLIBS`. If `HAVE_TERMLIBS` is false for the build
machine and true for the host machine, `tools/info` will not be built, but
`info` will be built, trying to execute `../tools/info/makedoc`, which is
not there.

A possible workaround is to execute `make -C tools/info makedoc` before
executing `make`.

Thanks for testing and investigating this.  I'm surprised that
cross-compilation works at all - the support in the build system for it is
very old and is from before the Perl implementation of makeinfo, as far as
I am aware.

I've attempted a fix based on your description.  I'm not really sure how
I would test this, but if you can confirm this works, we could make this
change.

I can confirm that these two ways to build texinfo produce exactly the same end result:

1) without your patch and with `make -C tools/info makedoc` workaround
2) with your patch and without `make -C tools/info makedoc` workaround

diff --git a/ChangeLog b/ChangeLog
index ba1f5e1d7d..8bbc9d546e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2026-03-22  Gavin Smith <[email protected]>
+
+       Always build info/makedoc when cross-compiling
+
+       * Makefile.am (SUBDIRS) [TOOLS_ONLY]:
+       Always include "info" subdirectory to allow "makedoc" program
+       to be built on "build" system when cross-compiling, even if terminal
+       library is not found on "build".
+       * info/Makefile.am (bin_PROGRAMS): Use HAVE_TERMLIBS conditional to
+       only include "ginfo" if terminal library is found.
+       (LDADD, ginfo_LDADD): Only use $(TERMLIBS) in ginfo_LDADD.
+
  2026-03-22 Patrice Dumas  <[email protected]>
Put lineraw line commands leading and trailing directly in tree
diff --git a/Makefile.am b/Makefile.am
index 5002ff9371..88e673b41b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -51,15 +51,7 @@ install-tex:
  SUBDIRS =
  if TOOLS_ONLY
    # Build native tools only.
-  SUBDIRS += gnulib/lib install-info tta util
-if HAVE_TERMLIBS
-    SUBDIRS += info
-else
-# DOS/Windows don't need TERMLIBS to build Info
-if HOST_IS_WINDOWS
-  SUBDIRS += info
-endif
-endif
+  SUBDIRS += gnulib/lib info install-info tta util

We could avoid building the `info` directory for build if it’s not needed for host. But, unless you can think of an easy way to that, it’s probably not worth any extra effort.

  else
    # All subdirectories.
    # Do libs first since the C programs depend on it.
@@ -74,9 +66,8 @@ if HOST_IS_WINDOWS
    SUBDIRS += info
  endif
  endif
-  SUBDIRS += install-info po po_document tta Pod-Simple-Texinfo \
-             texindex util doc man
-  SUBDIRS += js
+  SUBDIRS += install-info js po po_document texindex tta Pod-Simple-Texinfo \
+             util doc man
  endif
distclean-local:
diff --git a/info/Makefile.am b/info/Makefile.am
index 265f538371..f66db95245 100644
--- a/info/Makefile.am
+++ b/info/Makefile.am
@@ -18,10 +18,18 @@
  # distributed even without no-dist-built-sources
  AUTOMAKE_OPTIONS = 1.16
+if HAVE_TERMLIBS
+bin_PROGRAMS = ginfo
+else
+# DOS/Windows don't need TERMLIBS to build Info
+if HOST_IS_WINDOWS
+bin_PROGRAMS = ginfo
+endif
+endif

You could wrap the whole block in `if ! TOOLS_ONLY` because it doesn’t seem like the info tool is needed for the build machine.

+
  # Use `ginfo' for building to avoid confusion with the standard `info'
  # target.  Removes the `g' in the install rule before applying any
  # user-specified name transformations.

Maybe this comment should be moved up to before the previous block?

-bin_PROGRAMS = ginfo
  transform = s/ginfo/info/; $(program_transform_name)
AM_CPPFLAGS = \
@@ -34,7 +42,7 @@ AM_CPPFLAGS =                                   \
    -DSYSCONFDIR=\"$(sysconfdir)\"                \
    -DPKGDATADIR=\"$(pkgdatadir)\"
-LDADD = $(top_builddir)/gnulib/lib/libgnu.a $(TERMLIBS)
+LDADD = $(top_builddir)/gnulib/lib/libgnu.a
# for various gnulib modules
  LDADD += $(LIBINTL) $(LIBICONV) $(LIBC32CONV) $(LIBUNISTRING) $(LIBTHREAD)
@@ -45,6 +53,8 @@ LDADD += $(HARD_LOCALE_LIB) $(SETLOCALE_NULL_LIB)
  # for mbrtowc gnulib module which is brought in indirectly
  LDADD += $(MBRTOWC_LIB)
+ginfo_LDADD = $(LDADD) $(TERMLIBS)
+
  # Needed if make has not run in the "gnulib" directory yet
  ../gnulib/lib/libgnu.a:
        cd ../gnulib/lib && $(MAKE) $(AM_MAKEFLAGS)


[unrelated to the diff:]

info/Makefile.am contains the following:

funs.h: makedoc$(EXEEXT) $(cmd_sources)
        rm -f $(generated_sources)
        $(top_builddir)/$(native_tools)/info/makedoc $(cmd_sources)

I think that the dependency on makedoc$(EXEEXT) is not necessary in the cross-compilation case. Skipping compilation of it won’t make a big difference in compilation time, but it probably clarifies things for the reader (even though it’s more verbose).

(This made me think whether there is a way to actually add a dependency on `$(top_builddir)/$(native_tools)/info/makedoc`. I’m not at all familiar with recursive automake, but there doesn’t seem a straightforward way).

Reply via email to