blob: 7680840f654099bd45c3fb2f9620f747c50f07b0 [file] [log] [blame]
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