From cedffa9fd8309ba03d761b03a6b06fc8625261b1 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sat, 28 Dec 2024 16:47:16 +0100 Subject: [PATCH] endian: Fix compilation error on NetBSD 7.1. * m4/endian_h.m4 (gl_ENDIAN_H): Test for . Set HAVE_SYS_ENDIAN_H. * lib/endian.in.h: Test HAVE_SYS_ENDIAN_H as an alternative to HAVE_ENDIAN_H. * modules/endian (Makefile.am): Substitute HAVE_SYS_ENDIAN_H. --- ChangeLog | 9 +++++++ lib/endian.in.h | 6 ++++- m4/endian_h.m4 | 72 ++++++++++++++++++++++++++++++++++++++++++++++++- modules/endian | 1 + 4 files changed, 86 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 35bc1b6763..e94766431b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2024-12-28 Bruno Haible + + endian: Fix compilation error on NetBSD 7.1. + * m4/endian_h.m4 (gl_ENDIAN_H): Test for . Set + HAVE_SYS_ENDIAN_H. + * lib/endian.in.h: Test HAVE_SYS_ENDIAN_H as an alternative to + HAVE_ENDIAN_H. + * modules/endian (Makefile.am): Substitute HAVE_SYS_ENDIAN_H. + 2024-12-28 Bruno Haible wchar-h: Fix wcrtomb prototype conflict in C++ mode on OpenBSD 6.0. diff --git a/lib/endian.in.h b/lib/endian.in.h index 156fe49fbd..09b5dfb42c 100644 --- a/lib/endian.in.h +++ b/lib/endian.in.h @@ -29,6 +29,10 @@ /* The include_next requires a split double-inclusion guard. */ # @INCLUDE_NEXT@ @NEXT_ENDIAN_H@ +#elif @HAVE_SYS_ENDIAN_H@ + +# include + #endif @@ -69,7 +73,7 @@ _GL_INLINE_HEADER_BEGIN # define BYTE_ORDER LITTLE_ENDIAN #endif -#if @HAVE_ENDIAN_H@ +#if @HAVE_ENDIAN_H@ || @HAVE_SYS_ENDIAN_H@ /* Make sure we don't have any system definitions. */ # undef be16toh diff --git a/m4/endian_h.m4 b/m4/endian_h.m4 index c205a44464..712c435fe8 100644 --- a/m4/endian_h.m4 +++ b/m4/endian_h.m4 @@ -1,5 +1,5 @@ # endian_h.m4 -# serial 4 +# serial 5 dnl Copyright 2024 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -80,6 +80,75 @@ return !(value16_1 + value32_1 + value64_1 HAVE_ENDIAN_H=0 fi + AC_CHECK_HEADERS_ONCE([sys/endian.h]) + if test $ac_cv_header_sys_endian_h = yes; then + HAVE_SYS_ENDIAN_H=1 + dnl Check if sys/endian.h defines uint16_t, uint32_t, and uint64_t. + dnl Note: We don't use the result of this test for now. + AC_CACHE_CHECK([if sys/endian.h defines stdint types], + [gl_cv_header_sys_endian_h_stdint_types], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#include + ]], + [[uint16_t t1 = 0; + uint32_t t2 = 0; + uint64_t t3 = 0; + return !(t1 + t2 + t3); + ]])], + [gl_cv_header_sys_endian_h_stdint_types=yes], + [gl_cv_header_sys_endian_h_stdint_types=no]) + ]) + dnl Note: We don't use the result of this test for now. + AC_CACHE_CHECK([if sys/endian.h defines functions and macros], + [gl_cv_header_working_sys_endian_h], + [gl_cv_header_working_sys_endian_h=no + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( +[[ +#include +]], +[[ +#if LITTLE_ENDIAN == BIG_ENDIAN +# error "Endian macros not unique." +#endif +#if BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN +# error "Byte order not defined." +#endif + +/* Big endian to host. */ +int value16_1 = be16toh (0.0); +int value32_1 = be32toh (0.0); +int value64_1 = be64toh (0.0); + +/* Host to big endian. */ +int value16_2 = htobe16 (0.0); +int value32_2 = htobe32 (0.0); +int value64_2 = htobe64 (0.0); + +/* Little endian to host. */ +int value16_3 = le16toh (0.0); +int value32_3 = le32toh (0.0); +int value64_3 = le64toh (0.0); + +/* Host to little endian. */ +int value16_4 = htole16 (0.0); +int value32_4 = htole32 (0.0); +int value64_4 = htole64 (0.0); + +/* Make sure the variables get used. */ +return !(value16_1 + value32_1 + value64_1 + + value16_2 + value32_2 + value64_2 + + value16_3 + value32_3 + value64_3 + + value16_4 + value32_4 + value64_4); +]])], + [gl_cv_header_working_sys_endian_h=yes], + [gl_cv_header_working_sys_endian_h=no]) + ]) + else + HAVE_SYS_ENDIAN_H=0 + fi + dnl Check if endian.h should be generated. if test "$gl_cv_header_endian_h_stdint_types" = yes \ && test "$gl_cv_header_working_endian_h" = yes; then @@ -100,5 +169,6 @@ return !(value16_1 + value32_1 + value64_1 fi AC_SUBST([HAVE_ENDIAN_H]) + AC_SUBST([HAVE_SYS_ENDIAN_H]) AC_SUBST([ENDIAN_H_JUST_MISSING_STDINT]) ]) diff --git a/modules/endian b/modules/endian index c4cef9dc90..676d5b6064 100644 --- a/modules/endian +++ b/modules/endian @@ -33,6 +33,7 @@ endian.h: endian.in.h $(top_builddir)/config.status -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''HAVE_ENDIAN_H''@|$(HAVE_ENDIAN_H)|g' \ -e 's|@''NEXT_ENDIAN_H''@|$(NEXT_ENDIAN_H)|g' \ + -e 's|@''HAVE_SYS_ENDIAN_H''@|$(HAVE_SYS_ENDIAN_H)|g' \ -e 's|@''ENDIAN_H_JUST_MISSING_STDINT''@|$(ENDIAN_H_JUST_MISSING_STDINT)|g' \ $(srcdir)/endian.in.h > $@-t $(AM_V_at)mv $@-t $@ -- 2.39.5