diff options
author | Ian Lynagh <igloo@earth.li> | 2011-03-31 01:18:08 +0000 |
---|---|---|
committer | Ian Lynagh <igloo@earth.li> | 2011-03-31 01:18:08 +0000 |
commit | 5534946929ff20d52b04b582a079860a8d089661 (patch) | |
tree | 05171d70018b0145ac61eda957ccba357b955fbc /libraries | |
parent | 31cb13b785839d518e317db24b3ebc1a40b36689 (diff) | |
download | haskell-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.m4 | 124 |
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 ]) |