From 1146bf07624b5820b942b84b68e66f0d3dd25914 Mon Sep 17 00:00:00 2001 From: Ola Jeppsson Date: Mon, 7 Oct 2019 18:07:30 -0400 Subject: [PATCH] configure: Fix cross-compilation errors AC_RUN_IFELSE does not work when cross-compiling so we need to provide fallback methods for those cases. I tried to use constructs that work with Autoconf 2.52. Alas, I wasn't able to generate a working build system with that version. Autoconf 2.58 / Automake 1.7.9 is the earliest combo that I could get to work (with and without this patch). Perhaps it's time for a slight bump for the required version numbers? Cross-compiles sucessfully against: riscv64-unknown-linux-gnu Downloaded from upstream PR: https://github.com/memcached/memcached/pull/552 Signed-off-by: Bernd Kuhls --- configure.ac | 80 +++++++++++++++++++++++++++------------------------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/configure.ac b/configure.ac index fb78fc5..27dc939 100644 --- a/configure.ac +++ b/configure.ac @@ -264,23 +264,42 @@ return sizeof(void*) == 8 ? 0 : 1; ],[ CFLAGS="-m64 $org_cflags" ],[ - AC_MSG_ERROR([Don't know how to build a 64-bit object.]) + AC_MSG_ERROR([Don't know how to build a 64-bit object.]) + ],[ + dnl cross compile + AC_MSG_WARN([Assuming no extra CFLAGS are required for cross-compiling 64bit version.]) ]) fi dnl If data pointer is 64bit or not. -AC_RUN_IFELSE( - [AC_LANG_PROGRAM([], [dnl -return sizeof(void*) == 8 ? 0 : 1; - ]) -],[ - have_64bit_ptr=yes -],[ +AC_CHECK_HEADERS([stdint.h]) +AS_IF([test -z "$have_64bit_ptr"], + [AC_RUN_IFELSE( + [AC_LANG_PROGRAM([], [return sizeof(void*) == 8 ? 0 : 1;])], + [have_64bit_ptr=yes ], + [have_64bit_ptr=no], + [dnl cross compile (this test requires C99) + AS_IF([test "x$ac_cv_header_stdint_h" = xyes], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([ + #include + #if UINTPTR_MAX == 0xFFFFFFFFFFFFFFFFUL + /* 64 bit pointer */ + #else + #error 32 bit pointer + #endif + ], [])], + [have_64bit_ptr=yes], + [have_64bit_ptr=no])], + [have_64bit_ptr=unknown]) + ]) ]) - -if test $have_64bit_ptr = yes; then +AS_IF([test "$have_64bit_ptr" = "unknown" ],[ + AC_MSG_ERROR([Cannot detect pointer size. Must pass have_64bit_ptr={yes,no} to configure.]) +]) +AS_IF([test "$have_64bit_ptr" = yes],[ AC_DEFINE(HAVE_64BIT_PTR, 1, [data pointer is 64bit]) -fi +]) # Issue 213: Search for clock_gettime to help people linking # with a static version of libevent @@ -570,30 +589,10 @@ fi AC_C_SOCKLEN_T dnl Check if we're a little-endian or a big-endian system, needed by hash code -AC_DEFUN([AC_C_ENDIAN], -[AC_CACHE_CHECK(for endianness, ac_cv_c_endian, -[ - AC_RUN_IFELSE( - [AC_LANG_PROGRAM([], [dnl - long val = 1; - char *c = (char *) &val; - exit(*c == 1); - ]) - ],[ - ac_cv_c_endian=big - ],[ - ac_cv_c_endian=little - ]) -]) -if test $ac_cv_c_endian = big; then - AC_DEFINE(ENDIAN_BIG, 1, [machine is bigendian]) -fi -if test $ac_cv_c_endian = little; then - AC_DEFINE(ENDIAN_LITTLE, 1, [machine is littleendian]) -fi -]) - -AC_C_ENDIAN +AC_C_BIGENDIAN( + [AC_DEFINE(ENDIAN_BIG, 1, [machine is bigendian])], + [AC_DEFINE(ENDIAN_LITTLE, 1, [machine is littleendian])], + [AC_MSG_ERROR([Cannot detect endianness. Must pass ac_cv_c_bigendian={yes,no} to configure.])]) AC_DEFUN([AC_C_HTONLL], [ @@ -670,12 +669,15 @@ AC_DEFUN([AC_C_ALIGNMENT], ],[ ac_cv_c_alignment=need ],[ - ac_cv_c_alignment=need + dnl cross compile + ac_cv_c_alignment=maybe ]) ]) -if test $ac_cv_c_alignment = need; then - AC_DEFINE(NEED_ALIGN, 1, [Machine need alignment]) -fi +AS_IF([test $ac_cv_c_alignment = need], + [AC_DEFINE(NEED_ALIGN, 1, [Machine need alignment])]) +AS_IF([test $ac_cv_c_alignment = maybe], + [AC_MSG_WARN([Assuming aligned access is required when cross-compiling]) + AC_DEFINE(NEED_ALIGN, 1, [Machine need alignment])]) ]) AC_C_ALIGNMENT -- 2.20.1