Add checks for endianness
This commit is contained in:
parent
d72596f486
commit
17aa02d771
2
libbuild2-autoconf-tests/checks/byte-order/.gitignore
vendored
Normal file
2
libbuild2-autoconf-tests/checks/byte-order/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
driver
|
||||||
|
driver-posix
|
23
libbuild2-autoconf-tests/checks/byte-order/buildfile
Normal file
23
libbuild2-autoconf-tests/checks/byte-order/buildfile
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# Build two executables: one with no macros defined and one with
|
||||||
|
# _POSIX_C_SOURCE defined.
|
||||||
|
#
|
||||||
|
# _POSIX_C_SOURCE and similar macros can affect whether or not BYTE_ORDER,
|
||||||
|
# BIG_ENDIAN, and LITTLE_ENDIAN are defined. Only do _POSIX_C_SOURCE here
|
||||||
|
# because the others are used much less frequently.
|
||||||
|
#
|
||||||
|
|
||||||
|
./: exe{driver}: c{driver}
|
||||||
|
|
||||||
|
./: h{config}: in{config}
|
||||||
|
|
||||||
|
c.poptions += "-I$out_base"
|
||||||
|
|
||||||
|
if ($c.target.system != 'win32-msvc')
|
||||||
|
{
|
||||||
|
./: exe{driver-posix}: obje{driver-posix}
|
||||||
|
|
||||||
|
obje{driver-posix}: c{driver}
|
||||||
|
{
|
||||||
|
c.poptions += -D_POSIX_C_SOURCE
|
||||||
|
}
|
||||||
|
}
|
1
libbuild2-autoconf-tests/checks/byte-order/config.h.in
Normal file
1
libbuild2-autoconf-tests/checks/byte-order/config.h.in
Normal file
@ -0,0 +1 @@
|
|||||||
|
#undef BYTE_ORDER
|
39
libbuild2-autoconf-tests/checks/byte-order/driver.c
Normal file
39
libbuild2-autoconf-tests/checks/byte-order/driver.c
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#include <stdint.h> // uint32_t
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
/* Test that the byte order detected at runtime matches the one detected at
|
||||||
|
* compile time.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Return:
|
||||||
|
*
|
||||||
|
* 0 if the runtime and compile time byte orders match
|
||||||
|
*
|
||||||
|
* 1 if the runtime and compile time byte orders do not match
|
||||||
|
*
|
||||||
|
* 2 if the BYTE_ORDER macro has a value other than BIG_ENDIAN or
|
||||||
|
* LITTLE_ENDIAN
|
||||||
|
*
|
||||||
|
* 3 if not all of the byte order macros are defined
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
#if !defined(BYTE_ORDER) || !defined(BIG_ENDIAN) || !defined(LITTLE_ENDIAN)
|
||||||
|
return 3;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
union {
|
||||||
|
uint32_t i;
|
||||||
|
unsigned char a[4];
|
||||||
|
} u = {1};
|
||||||
|
|
||||||
|
#if BYTE_ORDER == LITTLE_ENDIAN
|
||||||
|
return u.a[0] == 1 ? 0 : 1;
|
||||||
|
#elif BYTE_ORDER == BIG_ENDIAN
|
||||||
|
return u.a[3] == 1 ? 0 : 1;
|
||||||
|
#else
|
||||||
|
return 2;
|
||||||
|
#endif
|
||||||
|
}
|
59
libbuild2-autoconf/libbuild2/autoconf/checks/BYTE_ORDER.h
Normal file
59
libbuild2-autoconf/libbuild2/autoconf/checks/BYTE_ORDER.h
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
// BYTE_ORDER!
|
||||||
|
|
||||||
|
/* Include the endianness header based on platform.
|
||||||
|
*
|
||||||
|
* Each of these headers should define BYTE_ORDER, LITTLE_ENDIAN, BIG_ENDIAN,
|
||||||
|
* AND PDP_ENDIAN but this can be affected by macros like _ANSI_SOURCE,
|
||||||
|
* _POSIX_C_SOURCE, _XOPEN_SOURCE and _NETBSD_SOURCE, depending on the
|
||||||
|
* platform (in which case most of them define underscored versions only).
|
||||||
|
*/
|
||||||
|
#if defined(__GLIBC__) || defined(__OpenBSD__)
|
||||||
|
# include <endian.h>
|
||||||
|
#elif defined(__FreeBSD__) || defined(__NetBSD__)
|
||||||
|
# include <sys/endian.h>
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
# include <machine/endian.h>
|
||||||
|
#elif !defined(_WIN32)
|
||||||
|
# include <sys/param.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Try various system- and compiler-specific byte order macro names if the
|
||||||
|
* endianness headers did not define BYTE_ORDER.
|
||||||
|
*/
|
||||||
|
#if !defined(BYTE_ORDER)
|
||||||
|
# if defined(__linux__)
|
||||||
|
# if defined(__BYTE_ORDER)
|
||||||
|
# define BYTE_ORDER __BYTE_ORDER
|
||||||
|
# define BIG_ENDIAN __BIG_ENDIAN
|
||||||
|
# define LITTLE_ENDIAN __LITTLE_ENDIAN
|
||||||
|
# endif
|
||||||
|
# elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
|
||||||
|
# if defined(_BYTE_ORDER)
|
||||||
|
# define BYTE_ORDER _BYTE_ORDER
|
||||||
|
# define BIG_ENDIAN _BIG_ENDIAN
|
||||||
|
# define LITTLE_ENDIAN _LITTLE_ENDIAN
|
||||||
|
# endif
|
||||||
|
# elif defined(__APPLE__)
|
||||||
|
# if defined(__DARWIN_BYTE_ORDER)
|
||||||
|
# define BYTE_ORDER __DARWIN_BYTE_ORDER
|
||||||
|
# define BIG_ENDIAN __DARWIN_BIG_ENDIAN
|
||||||
|
# define LITTLE_ENDIAN __DARWIN_LITTLE_ENDIAN
|
||||||
|
# endif
|
||||||
|
# elif defined(_WIN32)
|
||||||
|
# define BIG_ENDIAN 4321
|
||||||
|
# define LITTLE_ENDIAN 1234
|
||||||
|
# define BYTE_ORDER LITTLE_ENDIAN
|
||||||
|
# elif defined(__BYTE_ORDER__) && \
|
||||||
|
defined(__ORDER_BIG_ENDIAN__) && \
|
||||||
|
defined(__ORDER_LITTLE_ENDIAN__)
|
||||||
|
/* GCC, Clang (and others, potentially).
|
||||||
|
*/
|
||||||
|
# define BYTE_ORDER __BYTE_ORDER__
|
||||||
|
# define BIG_ENDIAN __ORDER_BIG_ENDIAN__
|
||||||
|
# define LITTLE_ENDIAN __ORDER_LITTLE_ENDIAN__
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef BYTE_ORDER
|
||||||
|
# error no byte order macros defined
|
||||||
|
#endif
|
@ -0,0 +1,7 @@
|
|||||||
|
// HAVE_BIGENDIAN : BYTE_ORDER
|
||||||
|
|
||||||
|
#undef HAVE_BIGENDIAN
|
||||||
|
|
||||||
|
#if BYTE_ORDER == BIG_ENDIAN
|
||||||
|
# define HAVE_BIGENDIAN 1
|
||||||
|
#endif
|
@ -0,0 +1,7 @@
|
|||||||
|
// WORDS_BIGENDIAN : BYTE_ORDER
|
||||||
|
|
||||||
|
#undef WORDS_BIGENDIAN
|
||||||
|
|
||||||
|
#if BYTE_ORDER == BIG_ENDIAN
|
||||||
|
# define WORDS_BIGENDIAN 1
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user