cannam@85: dnl @synopsis MN_C_FIND_ENDIAN cannam@85: dnl cannam@85: dnl Determine endian-ness of target processor. cannam@85: dnl @version 1.1 Mar 03 2002 cannam@85: dnl @author Erik de Castro Lopo cannam@85: dnl cannam@85: dnl Majority written from scratch to replace the standard autoconf macro cannam@85: dnl AC_C_BIGENDIAN. Only part remaining from the original it the invocation cannam@85: dnl of the AC_TRY_RUN macro. cannam@85: dnl cannam@85: dnl Permission to use, copy, modify, distribute, and sell this file for any cannam@85: dnl purpose is hereby granted without fee, provided that the above copyright cannam@85: dnl and this permission notice appear in all copies. No representations are cannam@85: dnl made about the suitability of this software for any purpose. It is cannam@85: dnl provided "as is" without express or implied warranty. cannam@85: cannam@85: dnl Find endian-ness in the following way: cannam@85: dnl 1) Look in . cannam@85: dnl 2) If 1) fails, look in and . cannam@85: dnl 3) If 1) and 2) fails and not cross compiling run a test program. cannam@85: dnl 4) If 1) and 2) fails and cross compiling then guess based on target. cannam@85: cannam@85: AC_DEFUN([MN_C_FIND_ENDIAN], cannam@85: [AC_CACHE_CHECK(processor byte ordering, cannam@85: ac_cv_c_byte_order, cannam@85: cannam@85: # Initialize to unknown cannam@85: ac_cv_c_byte_order=unknown cannam@85: cannam@85: if test x$ac_cv_header_endian_h = xyes ; then cannam@85: cannam@85: # First try which should set BYTE_ORDER. cannam@85: cannam@85: [AC_TRY_LINK([ cannam@85: #include cannam@85: #if BYTE_ORDER != LITTLE_ENDIAN cannam@85: not big endian cannam@85: #endif cannam@85: ], return 0 ;, cannam@85: ac_cv_c_byte_order=little cannam@85: )] cannam@85: cannam@85: [AC_TRY_LINK([ cannam@85: #include cannam@85: #if BYTE_ORDER != BIG_ENDIAN cannam@85: not big endian cannam@85: #endif cannam@85: ], return 0 ;, cannam@85: ac_cv_c_byte_order=big cannam@85: )] cannam@85: cannam@85: fi cannam@85: cannam@85: if test $ac_cv_c_byte_order = unknown ; then cannam@85: cannam@85: [AC_TRY_LINK([ cannam@85: #include cannam@85: #include cannam@85: #if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN cannam@85: bogus endian macros cannam@85: #endif cannam@85: ], return 0 ;, cannam@85: cannam@85: [AC_TRY_LINK([ cannam@85: #include cannam@85: #include cannam@85: #if BYTE_ORDER != LITTLE_ENDIAN cannam@85: not big endian cannam@85: #endif cannam@85: ], return 0 ;, cannam@85: ac_cv_c_byte_order=little cannam@85: )] cannam@85: cannam@85: [AC_TRY_LINK([ cannam@85: #include cannam@85: #include cannam@85: #if BYTE_ORDER != LITTLE_ENDIAN cannam@85: not big endian cannam@85: #endif cannam@85: ], return 0 ;, cannam@85: ac_cv_c_byte_order=little cannam@85: )] cannam@85: cannam@85: )] cannam@85: cannam@85: fi cannam@85: cannam@85: if test $ac_cv_c_byte_order = unknown ; then cannam@85: if test $cross_compiling = yes ; then cannam@85: # This is the last resort. Try to guess the target processor endian-ness cannam@85: # by looking at the target CPU type. cannam@85: [ cannam@85: case "$target_cpu" in cannam@85: alpha* | i?86* | mipsel* | ia64*) cannam@85: ac_cv_c_byte_order=little cannam@85: ;; cannam@85: cannam@85: m68* | mips* | powerpc* | hppa* | sparc*) cannam@85: ac_cv_c_byte_order=big cannam@85: ;; cannam@85: cannam@85: esac cannam@85: ] cannam@85: else cannam@85: AC_TRY_RUN( cannam@85: [[ cannam@85: int main (void) cannam@85: { /* Are we little or big endian? From Harbison&Steele. */ cannam@85: union cannam@85: { long l ; cannam@85: char c [sizeof (long)] ; cannam@85: } u ; cannam@85: u.l = 1 ; cannam@85: return (u.c [sizeof (long) - 1] == 1); cannam@85: } cannam@85: ]], , ac_cv_c_byte_order=big, cannam@85: ) cannam@85: cannam@85: AC_TRY_RUN( cannam@85: [[int main (void) cannam@85: { /* Are we little or big endian? From Harbison&Steele. */ cannam@85: union cannam@85: { long l ; cannam@85: char c [sizeof (long)] ; cannam@85: } u ; cannam@85: u.l = 1 ; cannam@85: return (u.c [0] == 1); cannam@85: }]], , ac_cv_c_byte_order=little, cannam@85: ) cannam@85: fi cannam@85: fi cannam@85: cannam@85: ) cannam@85: cannam@85: if test $ac_cv_c_byte_order = big ; then cannam@85: ac_cv_c_big_endian=1 cannam@85: ac_cv_c_little_endian=0 cannam@85: elif test $ac_cv_c_byte_order = little ; then cannam@85: ac_cv_c_big_endian=0 cannam@85: ac_cv_c_little_endian=1 cannam@85: else cannam@85: ac_cv_c_big_endian=0 cannam@85: ac_cv_c_little_endian=0 cannam@85: cannam@85: AC_MSG_WARN([[*****************************************************************]]) cannam@85: AC_MSG_WARN([[*** Not able to determine endian-ness of target processor. ]]) cannam@85: AC_MSG_WARN([[*** The constants CPU_IS_BIG_ENDIAN and CPU_IS_LITTLE_ENDIAN in ]]) cannam@85: AC_MSG_WARN([[*** src/config.h may need to be hand editied. ]]) cannam@85: AC_MSG_WARN([[*****************************************************************]]) cannam@85: fi cannam@85: cannam@85: ] cannam@85: )# MN_C_FIND_ENDIAN cannam@85: cannam@85: