Skip to content

Commit

Permalink
Rewrite FPTOOLS_CHECK_HTYPE to be cross-compilation-friendly
Browse files Browse the repository at this point in the history
Inspired by a patch from Mark Lentczner
  • Loading branch information
igfoo committed Mar 31, 2011
1 parent 763b8e7 commit fd2318b
Showing 1 changed file with 77 additions and 47 deletions.
124 changes: 77 additions & 47 deletions aclocal.m4
Expand Up @@ -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
Expand Down Expand Up @@ -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
])


Expand Down

0 comments on commit fd2318b

Please sign in to comment.