Hi Paul,
Paul Eggert <[email protected]> writes:
> Yes, that should work, so long as the build host isn't a Microsoft
> Windows platform that would require $(BUILD_EXEEXT). And that should
> be good enough; we don't need the full power of AX_PROG_CC_FOR_BUILD
> from the Autoconf Archive.
Here is a patch that worked in an x86 docker container with an arm64
cross compiler.
Can we just assume that crc will always be used and depend on
build-cc.m4? I guess the more robust way to do things is to do the
following in bootstrap.conf:
bootstrap_post_import_hook ()
{
$gnulib_tool --copy-file m4/build-cc.m4
}
Like we do for tests/init.sh.
Collin
>From 9dab53ad3f15e0482020253f3f87f7be03748d53 Mon Sep 17 00:00:00 2001
From: Collin Funk <[email protected]>
Date: Thu, 15 May 2025 22:02:26 -0700
Subject: [PATCH] build: allow make-prime-list to build when cross-compiling
* src/local.mk: Compile the make-prime-list in a temporary directory
using $(BUILD_CC) so it can be run even when $(CC) is a cross-compiler.
Add some comments.
(noinst_PROGRAMS): Remove src/make-prime-list.
(src_make_prime_list_LDADD): Remove variable.
* src/make-prime-list.c: Don't include config.h and attributes.h.
Remove unnecessary #undefs
(ATTRIBUTE_CONST, ATTRIBUTE_MALLOC): Define for the host compiler.
---
src/local.mk | 33 ++++++++++++++++++---------------
src/make-prime-list.c | 22 ++++++++++++++--------
2 files changed, 32 insertions(+), 23 deletions(-)
diff --git a/src/local.mk b/src/local.mk
index fd9dc81c2..833c714e1 100644
--- a/src/local.mk
+++ b/src/local.mk
@@ -36,8 +36,7 @@ pkglibexec_PROGRAMS = @pkglibexec_PROGRAMS@
# Needed by the testsuite.
noinst_PROGRAMS = \
- src/getlimits \
- src/make-prime-list
+ src/getlimits
noinst_HEADERS = \
src/chown.h \
@@ -150,11 +149,6 @@ src_ln_LDADD = $(LDADD)
src_logname_LDADD = $(LDADD)
src_ls_LDADD = $(LDADD)
-# This must *not* depend on anything in lib/, since it is used to generate
-# src/primes.h. If it depended on libcoreutils.a, that would pull all lib/*.c
-# into BUILT_SOURCES.
-src_make_prime_list_LDADD =
-
src_md5sum_LDADD = $(LDADD)
src_mkdir_LDADD = $(LDADD)
src_mkfifo_LDADD = $(LDADD)
@@ -556,15 +550,24 @@ $(top_srcdir)/src/dircolors.h: src/dcgen src/dircolors.hin
# and it needs to be built on a widest-known-int architecture, so it's
# built only if absent. It is not cleaned because we don't want to
# insist that maintainers must build on hosts that support the widest
-# known ints (currently 128-bit).
+# known ints (currently 128-bit). It is built in a temporary directory
+# to avoid Gnulib and allow cross-compilers. The BUILD_* definitions
+# come from Gnulib's gl_BUILD_CC which is invoked for the crc module.
BUILT_SOURCES += $(top_srcdir)/src/primes.h
-$(top_srcdir)/src/primes.h:
- $(AM_V_at)${MKDIR_P} src
- $(MAKE) src/make-prime-list$(EXEEXT)
- $(AM_V_GEN)rm -f $@ $@-t
- $(AM_V_at)src/make-prime-list$(EXEEXT) 5000 > $@-t
- $(AM_V_at)chmod a-w $@-t
- $(AM_V_at)mv $@-t $@
+$(top_srcdir)/src/primes.h: $(top_srcdir)/src/make-prime-list.c
+ $(AM_V_GEN)if test -n '$(BUILD_CC)'; then \
+ $(MKDIR_P) $(top_srcdir)/src/primes-tmp \
+ && (cd $(top_srcdir)/src/primes-tmp \
+ && $(BUILD_CC) $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) \
+ $(BUILD_LDFLAGS) -o make-prime-list$(EXEEXT) \
+ $(abs_top_srcdir)/src/make-prime-list.c) \
+ && rm -f $@ $@-t \
+ && $(top_srcdir)/src/primes-tmp/make-prime-list$(EXEEXT) \
+ 5000 > $@-t \
+ && chmod a-w $@-t \
+ && mv $@-t $@ \
+ && rm -rf $(top_srcdir)/src/primes-tmp; \
+ fi
# false exits nonzero even with --help or --version.
# test doesn't support --help or --version.
diff --git a/src/make-prime-list.c b/src/make-prime-list.c
index 35cf3627c..1b4c50f34 100644
--- a/src/make-prime-list.c
+++ b/src/make-prime-list.c
@@ -17,9 +17,6 @@ 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/. */
-#include <config.h>
-
-#include <attribute.h>
#include <inttypes.h>
#include <limits.h>
@@ -29,11 +26,20 @@ this program. If not, see https://www.gnu.org/licenses/. */
#include <stdlib.h>
#include <errno.h>
-/* Deactivate "rpl_"-prefixed definitions of these symbols. */
-#undef fclose
-#undef free
-#undef malloc
-#undef strerror
+/* This program is compiled in a separate directory to avoid linking to Gnulib
+ which may be cross-compiled. Therefore, we also do not have config.h and
+ attribute.h. Just define what we need. */
+#if 2 < __GNUC__ + (95 <= __GNUC_MINOR__)
+# define ATTRIBUTE_CONST __attribute__ ((__const__))
+#else
+# define ATTRIBUTE_CONST
+#endif
+#if 3 < __GNUC__
+# define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+#else
+# define ATTRIBUTE_MALLOC
+#endif
+
/* An unsigned type that is no narrower than 32 bits and no narrower
than unsigned int. It's best to make it as wide as possible.
--
2.49.0