| From bb3505b564b4aba061c9f3167dbcc1460c690501 Mon Sep 17 00:00:00 2001 |
| From: Eric Le Bihan <eric.le.bihan.dev@free.fr> |
| Date: Mon, 14 Sep 2015 12:43:27 +0200 |
| Subject: [PATCH] No runtime tests for type sizes nor endianness |
| |
| Replace build and execution of runtime test programs for determining |
| some type sizes and the endianness of the target with compile time test |
| programs. |
| |
| This improves support for cross-compilation. |
| |
| Signed-off-by: Eric Le Bihan <eric.le.bihan.dev@free.fr> |
| --- |
| configure | 38 ++++++++++++++++++++++++++++++++------ |
| src/sysdeps/trybigendian.c | 16 ++++++++++++++++ |
| src/sysdeps/trylittleendian.c | 16 ++++++++++++++++ |
| 3 files changed, 64 insertions(+), 6 deletions(-) |
| create mode 100644 src/sysdeps/trybigendian.c |
| create mode 100644 src/sysdeps/trylittleendian.c |
| |
| diff --git a/configure b/configure |
| index 910fb7b..4503178 100755 |
| --- a/configure |
| +++ b/configure |
| @@ -155,10 +155,28 @@ choose () { |
| |
| trytypesize() { |
| echo "Checking size of $3..." |
| - $CC_AUTO $CPPFLAGS_AUTO $CFLAGS_AUTO $LDFLAGS_AUTO -o trysizeof$1 src/sysdeps/trysizeof$1.c |
| - type_size=$(./trysizeof$1) || fail "$0: unable to determine size of $3" |
| + r=false |
| + type_size=0 |
| + while true; do |
| + cat<<EOF>trysizeof$1.c |
| +#include <sys/types.h> |
| + |
| +int main(void) |
| +{ |
| + static int v = 1 / !!((sizeof($3) == $type_size)); |
| + return 0; |
| +} |
| +EOF |
| + if $CC_AUTO $CPPFLAGS_AUTO $CFLAGS_AUTO $LDFLAGS_AUTO -o trysizeof$1 trysizeof$1.c 2>/dev/null; then |
| + r=true |
| + break |
| + fi |
| + type_size=$(expr $type_size + 1) |
| + test $type_size -le 16 || break |
| + done |
| + test $r = true || fail "$0: unable to determine size of $3" |
| type_bits=$(expr 8 \* $type_size) |
| - rm -f trysizeof$1 |
| + rm -f trysizeof$1 trysizeof$1.c |
| echo "sizeof$1: $type_size" >> $sysdeps/sysdeps |
| echo "#define ${package_macro_name}_SIZEOF$2 $type_size" >> $sysdeps/sysdeps.h |
| echo "#define ${package_macro_name}_$2_BITS $type_bits" >> $sysdeps/sysdeps.h |
| @@ -432,12 +450,20 @@ EOF |
| fi |
| |
| echo "Checking system endianness..." |
| - $CC_AUTO $CPPFLAGS_AUTO $CFLAGS_AUTO -o tryendianness src/sysdeps/tryendianness.c |
| - endianness=$(./tryendianness) || fail "$0: unable to determine endianness" |
| + if $CC_AUTO $CPPFLAGS_AUTO $CFLAGS_AUTO -o trybigendian src/sysdeps/trybigendian.c 2>/dev/null; then |
| + endianness=big |
| + else |
| + if $CC_AUTO $CPPFLAGS_AUTO $CFLAGS_AUTO -o trylittleendian src/sysdeps/trylittleendian.c 2>/dev/null; then |
| + endianness=little |
| + else |
| + fail "$0: unable to determine endianness" |
| + fi |
| + fi |
| + |
| echo "endianness: $endianness" >> $sysdeps/sysdeps |
| echo "#define ${package_macro_name}_ENDIANNESS \"$endianness\"" >> $sysdeps/sysdeps.h |
| echo " ... $endianness" |
| - rm -f tryendianness |
| + rm -f trybigendian trylittleendian |
| |
| trytypesize ushort USHORT "unsigned short" |
| trytypesize uint UINT "unsigned int" |
| diff --git a/src/sysdeps/trybigendian.c b/src/sysdeps/trybigendian.c |
| new file mode 100644 |
| index 0000000..d857572 |
| --- /dev/null |
| +++ b/src/sysdeps/trybigendian.c |
| @@ -0,0 +1,16 @@ |
| +#if defined(__BYTE_ORDER) && (__BYTE_ORDER == __BIG_ENDIAN) || \ |
| + defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) || \ |
| + defined(__BIG_ENDIAN) || \ |
| + defined(__ARMEB__) || \ |
| + defined(__THUMBEB__) || \ |
| + defined(__AARCH64EB__) || \ |
| + defined(_MIPSEB) || defined(__MIPSEB) || defined(__MIPSEB__) |
| +#define YEAH |
| +#else |
| +#error "not big endian" |
| +#endif |
| + |
| +int main(void) |
| +{ |
| + return 0; |
| +} |
| diff --git a/src/sysdeps/trylittleendian.c b/src/sysdeps/trylittleendian.c |
| new file mode 100644 |
| index 0000000..eba065a |
| --- /dev/null |
| +++ b/src/sysdeps/trylittleendian.c |
| @@ -0,0 +1,16 @@ |
| +#if defined(__BYTE_ORDER) && (__BYTE_ORDER == __LITTLE_ENDIAN) || \ |
| + defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || \ |
| + defined(__LITTLE_ENDIAN) || \ |
| + defined(__ARMEL__) || \ |
| + defined(__THUMBEL__) || \ |
| + defined(__AARCH64EL__) || \ |
| + defined(_MIPSEL) || defined(__MIPSEL) || defined(__MIPSEL__) |
| +#define YEAH |
| +#else |
| +#error "not little endian" |
| +#endif |
| + |
| +int main(void) |
| +{ |
| + return 0; |
| +} |
| -- |
| 2.5.1 |
| |