changeset 677:3089685bbb7e HEAD

Created AC_TYPEOF() which tells what base type (int/long/long long) the given type is. This cleans up the ssize_t and off_t checks. We also try another way to figure out the size by checking if compiler allows us to redeclare the type using typedef, at least it works with gcc. This should get rid of the warnings with OSX where ssize_t was previously declared as int instead of long.
author Timo Sirainen <tss@iki.fi>
date Tue, 26 Nov 2002 14:28:11 +0200
parents 3e23fa94f762
children 1e5c655bad25
files configure.in
diffstat 1 files changed, 104 insertions(+), 69 deletions(-) [+]
line wrap: on
line diff
--- a/configure.in	Tue Nov 26 12:28:40 2002 +0200
+++ b/configure.in	Tue Nov 26 14:28:11 2002 +0200
@@ -179,84 +179,119 @@
 		;;
 esac
 
-dnl * off_t checks, try to make it 64bit
-AC_DEFINE_UNQUOTED(_FILE_OFFSET_BITS, $preferred_off_t_bits)
-
 AC_CHECK_SIZEOF(int)
 AC_CHECK_SIZEOF(long)
 AC_CHECK_SIZEOF(void *)
 AC_CHECK_SIZEOF(long long)
 
-dnl * older autoconfs don't include sys/types.h, so do it manually
-AC_MSG_CHECKING([size of ssize_t])
-AC_TRY_RUN([
-  #include <stdio.h>
-  #include <sys/types.h>
-  int main() {
-    FILE *f=fopen("conftestval", "w");
-    if (!f) exit(1);
-    fprintf(f, "%d\n", sizeof(ssize_t));
-    exit(0);
-  }
-], [
-  sizeof_ssize_t=`cat conftestval`
-  rm -f conftestval
-], [
-  sizeof_ssize_t=0
-  AC_ERROR([Unsupported ssize_t size])
-])
-AC_MSG_RESULT($sizeof_ssize_t)
+AC_DEFUN(AC_TYPEOF, [
+  dnl * first check if we can get the size with redefining typedefs
+
+  order="$2"
+  if test "$2" = ""; then
+    order="int long long-long"
+  fi
+
+  result=""
+  visible="unknown"
+
+  AC_MSG_CHECKING([type of $1])
+  for type in $order; do
+    type="`echo $type|sed 's/-/ /g'`"
+    AC_TRY_COMPILE([
+      #include <sys/types.h>
+      typedef $type $1;
+    ],, [
+      if test "$result" != ""; then
+        dnl * compiler allows redefining to anything
+        result=""
+	visible="unknown"
+        break
+      fi
+      result="$type"
+      visible="$type"
+    ])
+  done
+
+  if test "$result" = ""; then
+    dnl * check with sizes
+
+    dnl * older autoconfs don't include sys/types.h, so do it manually
+    AC_TRY_RUN([
+      #include <stdio.h>
+      #include <sys/types.h>
+      int main() {
+	FILE *f=fopen("conftestval", "w");
+	if (!f) exit(1);
+	fprintf(f, "%d\n", sizeof($1));
+	exit(0);
+      }
+    ], [
+      size=`cat conftestval`
+      rm -f conftestval
 
-AC_MSG_CHECKING([size of off_t])
-AC_TRY_RUN([
-  #include <stdio.h>
-  #include <sys/types.h>
-  int main() {
-    FILE *f=fopen("conftestval", "w");
-    if (!f) exit(1);
-    fprintf(f, "%d\n", sizeof(off_t));
-    exit(0);
-  }
-], [
-  sizeof_off_t=`cat conftestval`
-  rm -f conftestval
-], [
-  AC_ERROR([Unsupported off_t size])
+      for type in $order; do
+        actype="ac_cv_sizeof_`echo $type|sed 's/-/_/g'`"
+        if test "$size" = "`eval \"echo \\$$actype\"`"; then
+	  result="`echo $type|sed 's/-/ /g'`"
+	  visible="`expr $size \* 8`bit (using $result)"
+	  break
+	fi
+      done
+      if test "$result" = ""; then
+        visible="`expr $size \* 8`bit (unknown type)"
+      fi
+    ])
+  fi
+
+  typeof_$1=$result
+  AC_MSG_RESULT($visible)
 ])
-AC_MSG_RESULT($sizeof_off_t)
-offt_bits=`expr 8 \* $sizeof_off_t`
+
+dnl * off_t checks, try to make it 64bit
+AC_DEFINE_UNQUOTED(_FILE_OFFSET_BITS, $preferred_off_t_bits)
 
-if test x$sizeof_off_t = x$ac_cv_sizeof_long; then
-  # try to use unsigned long always first
-  AC_DEFINE_UNQUOTED(OFF_T_MAX, LONG_MAX)
-  AC_DEFINE_UNQUOTED(PRIuUOFF_T, "lu")
-  AC_DEFINE(UOFF_T_LONG)
-elif test x$sizeof_off_t = x$ac_cv_sizeof_int; then
-  # next try int
-  AC_DEFINE_UNQUOTED(OFF_T_MAX, INT_MAX)
-  AC_DEFINE_UNQUOTED(PRIuUOFF_T, "u")
-  AC_DEFINE(UOFF_T_INT)
-elif test x$sizeof_off_t = x$ac_cv_sizeof_long_long; then
-  # and finally long long
-  AC_DEFINE_UNQUOTED(OFF_T_MAX, LLONG_MAX)
-  AC_DEFINE_UNQUOTED(PRIuUOFF_T, "llu")
-  AC_DEFINE(UOFF_T_LONG_LONG)
-else
-  AC_ERROR([Couldn't find integer type for off_t])
-fi
+AC_TYPEOF(off_t, long int long-long)
+case "$typeof_off_t" in
+  int)
+    AC_DEFINE_UNQUOTED(OFF_T_MAX, LONG_MAX)
+    AC_DEFINE_UNQUOTED(PRIuUOFF_T, "lu")
+    AC_DEFINE(UOFF_T_LONG)
+    offt_bits=`expr 8 \* $ac_cv_sizeof_int`
+    ;;
+  long)
+    AC_DEFINE_UNQUOTED(OFF_T_MAX, INT_MAX)
+    AC_DEFINE_UNQUOTED(PRIuUOFF_T, "u")
+    AC_DEFINE(UOFF_T_INT)
+    offt_bits=`expr 8 \* $ac_cv_sizeof_long`
+    ;;
+  "long long")
+    AC_DEFINE_UNQUOTED(OFF_T_MAX, LLONG_MAX)
+    AC_DEFINE_UNQUOTED(PRIuUOFF_T, "llu")
+    AC_DEFINE(UOFF_T_LONG_LONG)
+    offt_bits=`expr 8 \* $ac_cv_sizeof_long_long`
+    ;;
+  *)
+    AC_ERROR([Unsupported off_t type])
+    ;;
+esac
 
-if test x$sizeof_ssize_t = x$ac_cv_sizeof_int; then
-  AC_DEFINE_UNQUOTED(SSIZE_T_MAX, INT_MAX)
-  AC_DEFINE_UNQUOTED(PRIuSIZE_T, "u")
-elif test x$sizeof_ssize_t = x$ac_cv_sizeof_long; then
-  AC_DEFINE_UNQUOTED(SSIZE_T_MAX, LONG_MAX)
-  AC_DEFINE_UNQUOTED(PRIuSIZE_T, "lu")
-elif test x$sizeof_ssize_t = x$ac_cv_sizeof_long_long; then
-  AC_DEFINE_UNQUOTED(SSIZE_T_MAX, LLONG_MAX)
-  AC_DEFINE_UNQUOTED(PRIuSIZE_T, "llu")
-else
-  AC_ERROR([Couldn't find integer type for ssize_t])
-fi
+AC_TYPEOF(ssize_t)
+case "$typeof_ssize_t" in
+  long)
+    AC_DEFINE_UNQUOTED(SSIZE_T_MAX, LONG_MAX)
+    AC_DEFINE_UNQUOTED(PRIuSIZE_T, "lu")
+    ;;
+  "long long")
+    AC_DEFINE_UNQUOTED(SSIZE_T_MAX, LLONG_MAX)
+    AC_DEFINE_UNQUOTED(PRIuSIZE_T, "llu")
+    ;;
+  *)
+    dnl older systems didn't have ssize_t, default to int
+    AC_DEFINE_UNQUOTED(SSIZE_T_MAX, INT_MAX)
+    AC_DEFINE_UNQUOTED(PRIuSIZE_T, "u")
+    ;;
+esac
 
 if test x$ac_cv_sizeof_long_long != x0; then
   AC_DEFINE(LARGEST_T_LONG_LONG)