summaryrefslogtreecommitdiff
path: root/libraries
diff options
context:
space:
mode:
authorIan Lynagh <igloo@earth.li>2011-03-31 01:18:08 +0000
committerIan Lynagh <igloo@earth.li>2011-03-31 01:18:08 +0000
commit5534946929ff20d52b04b582a079860a8d089661 (patch)
tree05171d70018b0145ac61eda957ccba357b955fbc /libraries
parent31cb13b785839d518e317db24b3ebc1a40b36689 (diff)
downloadhaskell-5534946929ff20d52b04b582a079860a8d089661.tar.gz
Rewrite FPTOOLS_CHECK_HTYPE to be cross-compilation-friendly
Inspired by a patch from Mark Lentczner
Diffstat (limited to 'libraries')
-rw-r--r--libraries/base/aclocal.m4124
1 files changed, 77 insertions, 47 deletions
diff --git a/libraries/base/aclocal.m4 b/libraries/base/aclocal.m4
index 5e82969b5a..7278320247 100644
--- a/libraries/base/aclocal.m4
+++ b/libraries/base/aclocal.m4
@@ -49,24 +49,10 @@ done
])# FP_CHECK_CONSTS
-dnl ** Map an arithmetic C type to a Haskell type.
-dnl Based on autconf's AC_CHECK_SIZEOF.
-
-dnl FPTOOLS_CHECK_HTYPE(TYPE [, DEFAULT_VALUE, [, VALUE-FOR-CROSS-COMPILATION])
-AC_DEFUN([FPTOOLS_CHECK_HTYPE],
-[changequote(<<, >>)dnl
-dnl The name to #define.
-define(<<AC_TYPE_NAME>>, translit(htype_$1, [a-z *], [A-Z_P]))dnl
-dnl The cache variable name.
-define(<<AC_CV_NAME>>, translit(fptools_cv_htype_$1, [ *], [_p]))dnl
-define(<<AC_CV_NAME_supported>>, translit(fptools_cv_htype_sup_$1, [ *], [_p]))dnl
-changequote([, ])dnl
-AC_MSG_CHECKING(Haskell type for $1)
-AC_CACHE_VAL(AC_CV_NAME,
-[AC_CV_NAME_supported=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <stdio.h>
+dnl FPTOOLS_HTYPE_INCLUDES
+AC_DEFUN([FPTOOLS_HTYPE_INCLUDES],
+[
+#include <stdio.h>
#include <stddef.h>
#if HAVE_SYS_TYPES_H
@@ -118,36 +104,80 @@ AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <stdio.h>
#endif
#include <stdlib.h>
+])
+
+
+dnl ** Map an arithmetic C type to a Haskell type.
+dnl Based on autconf's AC_CHECK_SIZEOF.
-typedef $1 testing;
-
-int main(void) {
- FILE *f=fopen("conftestval", "w");
- if (!f) exit(1);
- if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
- fprintf(f, "%s%d\n",
- ((testing)(-1) < (testing)0) ? "Int" : "Word",
- (int)(sizeof(testing)*8));
- } else {
- fprintf(f,"%s\n",
- (sizeof(testing) > sizeof(double)) ? "LDouble" :
- (sizeof(testing) == sizeof(double)) ? "Double" : "Float");
- }
- fclose(f);
- exit(0);
-}]])],[AC_CV_NAME=`cat conftestval`],
-[ifelse([$2], , [AC_CV_NAME=NotReallyAType; AC_CV_NAME_supported=no], [AC_CV_NAME=$2])],
-[ifelse([$3], , [AC_CV_NAME=NotReallyATypeCross; AC_CV_NAME_supported=no], [AC_CV_NAME=$3])])
-CPPFLAGS="$fp_check_htype_save_cppflags"]) dnl
-if test "$AC_CV_NAME_supported" = yes; then
- AC_MSG_RESULT($AC_CV_NAME)
- AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [Define to Haskell type for $1])
-else
- AC_MSG_RESULT([not supported])
-fi
-undefine([AC_TYPE_NAME])dnl
-undefine([AC_CV_NAME])dnl
-undefine([AC_CV_NAME_supported])dnl
+dnl FPTOOLS_CHECK_HTYPE(TYPE [, DEFAULT_VALUE ])
+AC_DEFUN([FPTOOLS_CHECK_HTYPE],[
+ changequote(<<, >>)
+ dnl The name to #define.
+ define(<<AC_TYPE_NAME>>, translit(htype_$1, [a-z *], [A-Z_P]))
+ dnl The cache variable names.
+ define(<<AC_CV_NAME>>, translit(fptools_cv_htype_$1, [ *], [_p]))
+ define(<<AC_CV_NAME_supported>>, translit(fptools_cv_htype_sup_$1, [ *], [_p]))
+ changequote([, ])
+
+ AC_MSG_CHECKING(Haskell type for $1)
+ AC_CACHE_VAL(AC_CV_NAME,[
+ AC_CV_NAME_supported=yes
+ AC_COMPUTE_INT([HTYPE_IS_INTEGRAL],
+ [(($1)((int)(($1)1.4))) == (($1)1.4)],
+ [FPTOOLS_HTYPE_INCLUDES],[AC_CV_NAME_supported=no])
+ if test "$AC_CV_NAME_supported" = "yes"
+ then
+ if test "$HTYPE_IS_INTEGRAL" -eq 0
+ then
+ AC_COMPUTE_INT([HTYPE_IS_FLOAT],[sizeof($1) == sizeof(float)],
+ [FPTOOLS_HTYPE_INCLUDES],
+ [AC_CV_NAME_supported=no])
+ AC_COMPUTE_INT([HTYPE_IS_DOUBLE],[sizeof($1) == sizeof(double)],
+ [FPTOOLS_HTYPE_INCLUDES],
+ [AC_CV_NAME_supported=no])
+ AC_COMPUTE_INT([HTYPE_IS_LDOUBLE],[sizeof($1) == sizeof(long double)],
+ [FPTOOLS_HTYPE_INCLUDES],
+ [AC_CV_NAME_supported=no])
+ if test "$HTYPE_IS_FLOAT" -eq 1
+ then
+ AC_CV_NAME=Float
+ elif test "$HTYPE_IS_DOUBLE" -eq 1
+ then
+ AC_CV_NAME=Double
+ elif test "$HTYPE_IS_LDOUBLE" -eq 1
+ then
+ AC_CV_NAME=LDouble
+ else
+ AC_CV_NAME_supported=no
+ fi
+ else
+ AC_COMPUTE_INT([HTYPE_IS_SIGNED],[(($1)(-1)) < (($1)0)],
+ [FPTOOLS_HTYPE_INCLUDES],
+ [AC_CV_NAME_supported=no])
+ AC_COMPUTE_INT([HTYPE_SIZE],[sizeof($1) * 8],
+ [FPTOOLS_HTYPE_INCLUDES],
+ [AC_CV_NAME_supported=no])
+ if test "$HTYPE_IS_SIGNED" -eq 0
+ then
+ AC_CV_NAME="Word$HTYPE_SIZE"
+ else
+ AC_CV_NAME="Int$HTYPE_SIZE"
+ fi
+ fi
+ fi
+ ])
+ if test "$AC_CV_NAME_supported" = yes; then
+ AC_MSG_RESULT($AC_CV_NAME)
+ AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME,
+ [Define to Haskell type for $1])
+ else
+ AC_CV_NAME=NotReallyAType
+ AC_MSG_RESULT([not supported])
+ fi
+ undefine([AC_TYPE_NAME])dnl
+ undefine([AC_CV_NAME])dnl
+ undefine([AC_CV_NAME_supported])dnl
])