AC_DEFUN([AC_COMPILE_CHECK_SIZEOF],
[changequote(<<, >>)define(<<AC_TYPE_NAME>>, translit(sizeof_$1, [a-z *], [A-Z_P]))define(<<AC_CV_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))changequote([, ])AC_MSG_CHECKING(size of $1)
AC_CACHE_VAL(AC_CV_NAME,
[for ac_size in 4 8 1 2 16 $2 ; do AC_TRY_COMPILE([$2
], [switch (0) case 0: case (sizeof ($1) == $ac_size):;], AC_CV_NAME=$ac_size)
if test x$AC_CV_NAME != x ; then break; fi
done
])
if test x$AC_CV_NAME = x ; then
AC_MSG_ERROR([cannot determine a size for $1])
fi
AC_MSG_RESULT($AC_CV_NAME)
AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The number of bytes in type $1])
undefine([AC_TYPE_NAME])undefine([AC_CV_NAME])])
AC_DEFUN([AC_CREATE_STDINT_H],
[AC_MSG_CHECKING([for stdint-types....])
ac_stdint_h=`echo ifelse($1, , _stdint.h, $1)`
if test "$ac_stdint_h" = "stdint.h" ; then
AC_MSG_RESULT("(are you sure you want them in ./stdint.h?)")
elif test "$ac_stdint_h" = "inttypes.h" ; then
AC_MSG_RESULT("(are you sure you want them in ./inttypes.h?)")
else
AC_MSG_RESULT("(putting them into $ac_stdint_h)")
fi
inttype_headers=`echo inttypes.h sys/inttypes.h sys/inttypes.h $2 \
| sed -e 's/,/ /g'`
ac_cv_header_stdint_x="no-file"
ac_cv_header_stdint_o="no-file"
ac_cv_header_stdint_u="no-file"
for i in stdint.h $inttype_headers ; do
unset ac_cv_type_uintptr_t
unset ac_cv_type_uint64_t
_AC_CHECK_TYPE_NEW(uintptr_t,[ac_cv_header_stdint_x=$i], continue,[ AC_CHECK_TYPE(uint64_t,[and64="(uint64_t too)"],[and64=""],[ AC_MSG_RESULT(... seen our uintptr_t in $i $and64)
break;
done
if test "$ac_cv_header_stdint_x" = "no-file" ; then
for i in stdint.h $inttype_headers ; do
unset ac_cv_type_uint32_t
unset ac_cv_type_uint64_t
AC_CHECK_TYPE(uint32_t,[ac_cv_header_stdint_o=$i], continue,[ AC_CHECK_TYPE(uint64_t,[and64="(uint64_t too)"],[and64=""],[ AC_MSG_RESULT(... seen our uint32_t in $i $and64)
break;
done
if test "$ac_cv_header_stdint_o" = "no-file" ; then
for i in sys/types.h $inttype_headers ; do
unset ac_cv_type_u_int32_t
unset ac_cv_type_u_int64_t
AC_CHECK_TYPE(u_int32_t,[ac_cv_header_stdint_u=$i], continue,[ AC_CHECK_TYPE(uint64_t,[and64="(u_int64_t too)"],[and64=""],[ AC_MSG_RESULT(... seen our u_int32_t in $i $and64)
break;
done
fi
fi
if test "$ac_cv_header_stdint_x" = "no-file" ; then
AC_COMPILE_CHECK_SIZEOF(char)
AC_COMPILE_CHECK_SIZEOF(short)
AC_COMPILE_CHECK_SIZEOF(int)
AC_COMPILE_CHECK_SIZEOF(long)
AC_COMPILE_CHECK_SIZEOF(void*)
ac_cv_header_stdint_test="yes"
else
ac_cv_header_stdint_test="no"
fi
_ac_stdint_h=AS_TR_CPP(_$ac_stdint_h)
AC_MSG_RESULT(creating $ac_stdint_h : $_ac_stdint_h)
echo "echo "echo "echo "if test "$GCC" = "yes" ; then
echo "/* generated using a gnu compiler version" `$CC --version` "*/" \
>>$ac_stdint_h
else
echo "/* generated using $CC */" >>$ac_stdint_h
fi
echo "" >>$ac_stdint_h
if test "$ac_cv_header_stdint_x" != "no-file" ; then
ac_cv_header_stdint="$ac_cv_header_stdint_x"
elif test "$ac_cv_header_stdint_o" != "no-file" ; then
ac_cv_header_stdint="$ac_cv_header_stdint_o"
elif test "$ac_cv_header_stdint_u" != "no-file" ; then
ac_cv_header_stdint="$ac_cv_header_stdint_u"
else
ac_cv_header_stdint="stddef.h"
fi
unset ac_cv_type_int_least32_t
unset ac_cv_type_int_fast32_t
AC_CHECK_TYPE(int_least32_t,,,[AC_CHECK_TYPE(int_fast32_t,,,[
if test "$ac_cv_header_stdint" != "stddef.h" ; then
if test "$ac_cv_header_stdint" != "stdint.h" ; then
AC_MSG_RESULT(..adding include stddef.h)
echo "fi ; fi
AC_MSG_RESULT(..adding include $ac_cv_header_stdint)
echo "echo "" >>$ac_stdint_h
if test "$ac_cv_header_stdint_x" = "no-file" ; then
AC_MSG_RESULT(... need to look at C basic types)
else
AC_MSG_RESULT(... seen good stdint.h inttypes)
fi
if test "$ac_cv_header_stdint_u" != "no-file" ; then
AC_MSG_RESULT(... seen bsd/sysv typedefs)
cat >>$ac_stdint_h <<EOF
/* int8_t int16_t int32_t defined by inet code, redeclare the u_intXX types */
typedef u_int8_t uint8_t;
typedef u_int16_t uint16_t;
typedef u_int32_t uint32_t;
EOF
cat >>$ac_stdint_h <<EOF
/* glibc compatibility */
EOF
fi
ac_cv_sizeof_x="$ac_cv_sizeof_char:$ac_cv_sizeof_short"
ac_cv_sizeof_X="$ac_cv_sizeof_x:$ac_cv_sizeof_int"
ac_cv_sizeof_X="$ac_cv_sizeof_X:$ac_cv_sizeof_voidp:$ac_cv_sizeof_long"
if test "$ac_cv_header_stdint" = "stddef.h" ; then
cat >>$ac_stdint_h <<EOF
/* ------------ BITSPECIFIC INTTYPES SECTION --------------- */
EOF
t="typedefs for a"
case "$ac_cv_sizeof_X" in
1:2:2:2:4) AC_MSG_RESULT(..adding $t normal 16-bit system)
cat >>$ac_stdint_h <<EOF
/* a normal 16-bit system */
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned long uint32_t;
typedef char int8_t;
typedef short int16_t;
typedef long int32_t;
EOF
;;
1:2:2:4:4) AC_MSG_RESULT(..adding $t 32-bit system derived from a 16-bit)
cat >>$ac_stdint_h <<EOF
/* a 32-bit system derived from a 16-bit */
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef char int8_t;
typedef short int16_t;
typedef int int32_t;
EOF
;;
1:2:4:4:4) AC_MSG_RESULT(..adding $t normal 32-bit system)
cat >>$ac_stdint_h <<EOF
/* a normal 32-bit system */
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef char int8_t;
typedef short int16_t;
typedef int int32_t;
EOF
;;
1:2:4:4:8) AC_MSG_RESULT(..adding $t 32-bit system prepared for 64-bit)
cat >>$ac_stdint_h <<EOF
/* a 32-bit system prepared for 64-bit */
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef char int8_t;
typedef short int16_t;
typedef int int32_t;
EOF
;;
1:2:4:8:8) AC_MSG_RESULT(..adding $t normal 64-bit system)
cat >>$ac_stdint_h <<EOF
/* a normal 64-bit system */
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef char int8_t;
typedef short int16_t;
typedef int int32_t;
EOF
;;
1:2:4:8:4) AC_MSG_RESULT(..adding $t 64-bit system derived from a 32-bit)
cat >>$ac_stdint_h <<EOF
/* a 64-bit system derived from a 32-bit system */
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef char int8_t;
typedef short int16_t;
typedef int int32_t;
EOF
;;
*)
AC_MSG_ERROR([ $ac_cv_sizeof_X what is that a system? contact the author, quick! http://ac-archive.sf.net])
exit 1
;;
esac
fi
if test "$ac_cv_type_uint64_t" = "yes"
then AC_MSG_RESULT(... seen good uint64_t)
cat >>$ac_stdint_h <<EOF
/* system headers have good uint64_t */
EOF
elif test "$ac_cv_type_u_int64_t" = "yes"
then AC_MSG_RESULT(..adding typedef u_int64_t uint64_t)
cat >>$ac_stdint_h <<EOF
/* system headers have an u_int64_t */
typedef u_int64_t uint64_t;
EOF
else AC_MSG_RESULT(..adding generic uint64_t runtime checks)
cat >>$ac_stdint_h <<EOF
/* -------------------- 64 BIT GENERIC SECTION -------------------- */
/* here are some common heuristics using compiler runtime specifics */
typedef long long int64_t;
typedef unsigned long long uint64_t;
typedef __int64 int64_t;
typedef unsigned __int64 uint64_t;
typedef long long int64_t;
typedef unsigned long long uint64_t;
typedef long int64_t;
typedef unsigned long uint64_t;
/* compiler/cpu type ... or just ISO C99 */
EOF
case "$ac_cv_sizeof_x:$ac_cv_sizeof_voidp:$ac_cv_sizeof_long" in
1:2:8:8) AC_MSG_RESULT(..adding uint64_t default, normal 64-bit system)
cat >>$ac_stdint_h <<EOF
/* DEFAULT: */
/* seen normal 64-bit system, CC has sizeof(long and void*) == 8 bytes */
typedef long int64_t;
typedef unsigned long uint64_t;
EOF
;;
1:2:4:8) AC_MSG_RESULT(..adding uint64_t default, typedef to long)
cat >>$ac_stdint_h <<EOF
/* DEFAULT: */
/* seen 32-bit system prepared for 64-bit, CC has sizeof(long) == 8 bytes */
typedef long int64_t;
typedef unsigned long uint64_t;
EOF
;;
1:2:8:4) AC_MSG_RESULT(..adding uint64_t default, typedef long long)
cat >>$ac_stdint_h <<EOF
/* DEFAULT: */
/* seen 64-bit derived from a 32-bit, CC has sizeof(long) == 4 bytes */
typedef long long int64_t;
typedef unsigned long long uint64_t;
EOF
;;
*)
cat >>$ac_stdint_h <<EOF
/* NOTE: */
/* the configure-checks for the basic types did not make us believe */
/* that we could add a fallback to a 'long long' typedef to int64_t */
EOF
esac
fi
if test "$ac_cv_header_stdint_x" = "no-file" ; then
cat >>$ac_stdint_h <<EOF
/* -------------------------- INPTR SECTION --------------------------- */
EOF
case "$ac_cv_sizeof_x:$ac_cv_sizeof_voidp" in
1:2:2)
a="int16_t" ; cat >>$ac_stdint_h <<EOF
/* we tested sizeof(void*) to be of 2 chars, hence we declare it 16-bit */
typedef uint16_t uintptr_t;
typedef int16_t intptr_t;
EOF
;;
1:2:4)
a="int32_t" ; cat >>$ac_stdint_h <<EOF
/* we tested sizeof(void*) to be of 4 chars, hence we declare it 32-bit */
typedef uint32_t uintptr_t;
typedef int32_t intptr_t;
EOF
;;
1:2:8)
a="int64_t" ; cat >>$ac_stdint_h <<EOF
/* we tested sizeof(void*) to be of 8 chars, hence we declare it 64-bit */
typedef uint64_t uintptr_t;
typedef int64_t intptr_t;
EOF
;;
*)
a="long" ; cat >>$ac_stdint_h <<EOF
/* we tested sizeof(void*) but got no guess, hence we declare it as if long */
typedef unsigned long uintptr_t;
typedef long intptr_t;
EOF
;;
esac
AC_MSG_RESULT(..adding typedef $a intptr_t)
fi
if test "$ac_cv_type_int_least32_t" = "no"; then
AC_MSG_RESULT(..adding generic int_least-types)
cat >>$ac_stdint_h <<EOF
/* --------------GENERIC INT_LEAST ------------------ */
typedef int8_t int_least8_t;
typedef int16_t int_least16_t;
typedef int32_t int_least32_t;
typedef int64_t int_least64_t;
typedef uint8_t uint_least8_t;
typedef uint16_t uint_least16_t;
typedef uint32_t uint_least32_t;
typedef uint64_t uint_least64_t;
EOF
fi
if test "$ac_cv_type_int_fast32_t" = "no"; then
AC_MSG_RESULT(..adding generic int_fast-types)
cat >>$ac_stdint_h <<EOF
/* --------------GENERIC INT_FAST ------------------ */
typedef int8_t int_fast8_t;
typedef int32_t int_fast16_t;
typedef int32_t int_fast32_t;
typedef int64_t int_fast64_t;
typedef uint8_t uint_fast8_t;
typedef uint32_t uint_fast16_t;
typedef uint32_t uint_fast32_t;
typedef uint64_t uint_fast64_t;
EOF
fi
if test "$ac_cv_header_stdint_x" = "no-file" ; then
cat >>$ac_stdint_h <<EOF
typedef int64_t intmax_t;
typedef uint64_t uintmax_t;
typedef long int intmax_t;
typedef unsigned long uintmax_t;
EOF
fi
AC_MSG_RESULT(... DONE $ac_stdint_h)
cat >>$ac_stdint_h <<EOF
/* once */
EOF
])