package/ncftp: fix cross compilation detection

ncftp still ships a configure script generated with autoconf 2.13, which
determines whether it is cross compiling by simply trying to run a
trivial program built with $CC, instead of looking at --host/--build.
That heuristic breaks when the build machine is able to execute the
binaries produced by the cross compiler, which is typically the case
when building for x86/x86-64 on an x86-64 machine:

  checking whether the C compiler (...) is a cross-compiler... no

configure then takes the AC_TRY_RUN path for the remaining tests. Those
tests link against the target libraries but are executed on the build
machine, so they fail as soon as more than the bare C library is
involved. The most visible victim is the curses detection, which links
the test program against the target libncurses and then runs it:

  checking for curses library headers... checking for ncurses.h... yes
  checking for curses.h... yes
  checking for curses library... no

With no curses library, ncftpbookmarks is silently dropped from the
build and installation later fails with:

  install: cannot stat '.../build/ncftp-3.3.0/bin/ncftpbookmarks': No such file or directory

Other checks are mis-detected the same way, e.g. the 64-bit integral
type checks, which end up breaking the build itself:

  checking how to scan a 64-bit integral type... cannot scan
  io_get.c:763:96: error: expected ')' before 'PRINTF_LONG_LONG'

So add a patch making the generated configure script follow what
autoconf has been doing since 2.50, and consider the build cross
compilation as soon as --host is given and differs from --build,
regardless of whether the produced binaries happen to be runnable.

Regenerating configure instead is not an option: the macros in
autoconf_local/aclocal.m4 rely on autoconf 2.13 internals (AC_LANG used
as a value, AC_FD_CC, __oline__, ...) and upstream generates configure
with a patched autoconf 2.13 (see autoconf_local/acgeneral-2.13.m4.patch
and acspecific-2.13.m4.patch). A modern autoconf fails with:

  configure.in:53: error: AC_LANG: unknown language:

This regression was introduced by commit
f8bc271115 ("package/ncftp: bump to
version 3.2.9"). Before it, a pre-configure hook regenerated configure
with autoconf precisely because the bundled script "doesn't detect
cross-compilation correctly". With 3.2.9 that regeneration started to
fail, so the hook was dropped, which brought the broken detection back.
That commit left the host-autoconf dependency behind though, so drop it
now.

The issue is present since 2025.05, and in 2025.02.x since 2025.02.1,
where the 3.2.9 bump was backported as commit
6b0e4d82c3.

Fixes:
https://autobuild.buildroot.org/results/ab25f98d7ab8b397e2aa4f87af9cf1d814f3d6cc/

Fixes: f8bc271115 ("package/ncftp: bump to version 3.2.9")
Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
This commit is contained in:
Yegor Yefremov
2026-10-19 16:18:01 +02:00
committed by Thomas Petazzoni
parent 145bbce3ea
commit c65582cfd2
2 changed files with 60 additions and 1 deletions

View File

@@ -0,0 +1,60 @@
From: Yegor Yefremov <yegorslists@googlemail.com>
Date: Thu, 3 Sep 2026 10:00:00 +0200
Subject: [PATCH] configure: detect cross compilation from --host and --build
ncftp still ships a configure script generated with autoconf 2.13, which
determines whether it is cross compiling by simply trying to run a
trivial program built with $CC. That heuristic breaks when the build
machine is able to execute the binaries produced by the cross compiler,
which is typically the case when building for x86/x86-64 on an x86-64
machine: configure then concludes it is not cross compiling and starts
using AC_TRY_RUN based tests.
Those tests link against the target libraries but are executed on the
build machine, so they fail as soon as more than the bare C library is
involved. The most visible victim is the curses detection, which links
the test program against the target libncurses and then runs it:
checking for curses library headers... checking for ncurses.h... yes
checking for curses.h... yes
checking for curses library... no
With no curses library, ncftpbookmarks is silently dropped from the
build and installation later fails with:
install: cannot stat '.../build/ncftp-3.3.0/bin/ncftpbookmarks': No such file or directory
Follow what autoconf has been doing since 2.50 and consider the build
cross compilation as soon as --host is given and differs from --build,
regardless of whether the produced binaries happen to be runnable.
Note: configure is not regenerated during the build, hence the generated
script is patched directly.
Upstream: N/A, patching a generated file (upstream has neither a public
VCS nor a bug tracker)
Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
---
configure | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/configure b/configure
index d955e20..2311c73 100755
--- a/configure
+++ b/configure
@@ -845,8 +845,13 @@ int main(void){return(0);}
EOF
if { (eval echo configure:847: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
ac_cv_prog_cc_works=yes
+ # If --host was given and differs from --build, we are cross compiling,
+ # even when the build machine happens to be able to run the binaries
+ # produced by the cross compiler.
+ if test "$host" != NONE && test "$host" != "$build"; then
+ ac_cv_prog_cc_cross=yes
# If we can't run a trivial program, we are probably using a cross compiler.
- if (./conftest; exit) 2>/dev/null; then
+ elif (./conftest; exit) 2>/dev/null; then
ac_cv_prog_cc_cross=no
else
ac_cv_prog_cc_cross=yes

View File

@@ -11,7 +11,6 @@ NCFTP_TARGET_BINS = ncftp
NCFTP_LICENSE = ClArtistic
NCFTP_LICENSE_FILES = doc/LICENSE.txt
NCFTP_DEPENDENCIES = host-autoconf
NCFTP_CONF_OPTS = --disable-ccdv
ifeq ($(BR2_PACKAGE_NCFTP_GET),y)