]> Savannah Git Hosting - gnulib.git/commitdiff
endian: Fix compilation error on NetBSD 7.1.
authorBruno Haible <bruno@clisp.org>
Sat, 28 Dec 2024 15:47:16 +0000 (16:47 +0100)
committerBruno Haible <bruno@clisp.org>
Tue, 31 Dec 2024 09:40:27 +0000 (10:40 +0100)
* m4/endian_h.m4 (gl_ENDIAN_H): Test for <sys/endian.h>. 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
lib/endian.in.h
m4/endian_h.m4
modules/endian

index 83a75d572a3065934644eef9032a8d636d77313a..09d4db94b2f4f6cc711eeccc03d82d06d286256d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2024-12-28  Bruno Haible  <bruno@clisp.org>
+
+       endian: Fix compilation error on NetBSD 7.1.
+       * m4/endian_h.m4 (gl_ENDIAN_H): Test for <sys/endian.h>. 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  <bruno@clisp.org>
 
        wchar: Fix wcrtomb prototype conflict in C++ mode on OpenBSD 6.0.
index 156fe49fbdaa1ba558d4aac75c8a118e23a48f48..09b5dfb42ca64f884ed879e0ba9e922ccf49cfa0 100644 (file)
 /* The include_next requires a split double-inclusion guard.  */
 # @INCLUDE_NEXT@ @NEXT_ENDIAN_H@
 
+#elif @HAVE_SYS_ENDIAN_H@
+
+# include <sys/endian.h>
+
 #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
index 3149b4922708a986e906211f59a5eb6b435ab95f..834fb0803164f99e87f8e3b2ee21ea7b0809f64b 100644 (file)
@@ -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,
@@ -79,6 +79,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 <sys/endian.h>
+            ]],
+            [[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 <sys/endian.h>
+]],
+[[
+#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
@@ -99,5 +168,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])
 ])
index 95b9a91e8e3f19ab4ac5f266dace3487a7559ce5..e91b9288a3651ae06e3affe7eb077a27602a5fa4 100644 (file)
@@ -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 $@