Home | History | Annotate | Download | only in conftools
      1 dnl @synopsis AC_C_BIGENDIAN_CROSS
      2 dnl
      3 dnl Check endianess even when crosscompiling
      4 dnl (partially based on the original AC_C_BIGENDIAN).
      5 dnl
      6 dnl The implementation will create a binary, and instead of running
      7 dnl the binary it will be grep'ed for some symbols that will look
      8 dnl different for different endianess of the binary.
      9 dnl
     10 dnl @version $Id: ac_c_bigendian_cross.m4,v 1.2 2001/10/01 20:03:13 fdrake Exp $
     11 dnl @author Guido Draheim <guidod (a] gmx.de>
     12 dnl
     13 AC_DEFUN([AC_C_BIGENDIAN_CROSS],
     14 [AC_CACHE_CHECK(whether byte ordering is bigendian, ac_cv_c_bigendian,
     15 [ac_cv_c_bigendian=unknown
     16 # See if sys/param.h defines the BYTE_ORDER macro.
     17 AC_TRY_COMPILE([#include <sys/types.h>
     18 #include <sys/param.h>], [
     19 #if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
     20  bogus endian macros
     21 #endif], [# It does; now see whether it defined to BIG_ENDIAN or not.
     22 AC_TRY_COMPILE([#include <sys/types.h>
     23 #include <sys/param.h>], [
     24 #if BYTE_ORDER != BIG_ENDIAN
     25  not big endian
     26 #endif], ac_cv_c_bigendian=yes, ac_cv_c_bigendian=no)])
     27 if test $ac_cv_c_bigendian = unknown; then
     28 AC_TRY_RUN([main () {
     29   /* Are we little or big endian?  From Harbison&Steele.  */
     30   union
     31   {
     32     long l;
     33     char c[sizeof (long)];
     34   } u;
     35   u.l = 1;
     36   exit (u.c[sizeof (long) - 1] == 1);
     37 }], ac_cv_c_bigendian=no, ac_cv_c_bigendian=yes,
     38 [ echo $ac_n "cross-compiling... " 2>&AC_FD_MSG ])
     39 fi])
     40 if test $ac_cv_c_bigendian = unknown; then
     41 AC_MSG_CHECKING(to probe for byte ordering)
     42 [
     43 cat >conftest.c <<EOF
     44 short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
     45 short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
     46 void _ascii() { char* s = (char*) ascii_mm; s = (char*) ascii_ii; }
     47 short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
     48 short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
     49 void _ebcdic() { char* s = (char*) ebcdic_mm; s = (char*) ebcdic_ii; }
     50 int main() { _ascii (); _ebcdic (); return 0; }
     51 EOF
     52 ] if test -f conftest.c ; then
     53      if ${CC-cc} -c conftest.c -o conftest.o && test -f conftest.o ; then
     54         if test `grep -l BIGenDianSyS conftest.o` ; then
     55            echo $ac_n ' big endian probe OK, ' 1>&AC_FD_MSG
     56            ac_cv_c_bigendian=yes
     57         fi
     58         if test `grep -l LiTTleEnDian conftest.o` ; then
     59            echo $ac_n ' little endian probe OK, ' 1>&AC_FD_MSG
     60            if test $ac_cv_c_bigendian = yes ; then
     61             ac_cv_c_bigendian=unknown;
     62            else
     63             ac_cv_c_bigendian=no
     64            fi
     65         fi
     66         echo $ac_n 'guessing bigendian ...  ' >&AC_FD_MSG
     67      fi
     68   fi
     69 AC_MSG_RESULT($ac_cv_c_bigendian)
     70 fi
     71 if test $ac_cv_c_bigendian = yes; then
     72   AC_DEFINE(WORDS_BIGENDIAN, 1, [whether byteorder is bigendian])
     73   BYTEORDER=4321
     74 else
     75   BYTEORDER=1234
     76 fi
     77 AC_DEFINE_UNQUOTED(BYTEORDER, $BYTEORDER, [1234 = LIL_ENDIAN, 4321 = BIGENDIAN])
     78 if test $ac_cv_c_bigendian = unknown; then
     79   AC_MSG_ERROR(unknown endianess - sorry, please pre-set ac_cv_c_bigendian)
     80 fi
     81 ])
     82