# Extra autoconf macros for the Glasgow fptools # # To be a good autoconf citizen, names of local macros have prefixed with FP_ to # ensure we don't clash with any pre-supplied autoconf ones. 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(<>, translit(htype_$1, [a-z *], [A-Z_P]))dnl dnl The cache variable name. define(<>, translit(fptools_cv_htype_$1, [ *], [_p]))dnl define(<>, 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 #include #if HAVE_SYS_TYPES_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if HAVE_FCNTL_H # include #endif #if HAVE_SIGNAL_H # include #endif #if HAVE_TIME_H # include #endif #if HAVE_TERMIOS_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_CTYPE_H # include #endif #if defined(HAVE_GL_GL_H) # include #elif defined(HAVE_OPENGL_GL_H) # include #endif #if defined(HAVE_AL_AL_H) # include #elif defined(HAVE_OPENAL_AL_H) # include #endif #if defined(HAVE_AL_ALC_H) # include #elif defined(HAVE_OPENAL_ALC_H) # include #endif #if HAVE_SYS_RESOURCE_H # include #endif typedef $1 testing; main() { 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", 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 ]) # FP_ARG_OPENGL # ------------- AC_DEFUN([FP_ARG_OPENGL], [AC_ARG_ENABLE([opengl], [AC_HELP_STRING([--enable-opengl], [build a Haskell binding for OpenGL (GL/GLU). On Mac OS X, use --enable-opengl=x11 to use X11 instead of the "native" libraries. (default=autodetect)])], [enable_opengl=$enableval], [enable_opengl=yes]) ])# FP_ARG_OPENGL # FP_ARG_GLUT # ------------- AC_DEFUN([FP_ARG_GLUT], [AC_REQUIRE([FP_ARG_OPENGL]) AC_ARG_ENABLE([glut], [AC_HELP_STRING([--enable-glut], [build a Haskell binding for GLUT (default=autodetect)])], [enable_glut=$enableval], [enable_glut=yes]) ])# FP_ARG_GLUT # FP_CHECK_QUARTZ_OPENGL # ---------------------- AC_DEFUN([FP_CHECK_QUARTZ_OPENGL], [AC_REQUIRE([FP_ARG_OPENGL]) AC_REQUIRE([AC_CANONICAL_TARGET]) use_quartz_opengl=no if test x"$enable_opengl" = xyes; then case $target_os in darwin*) AC_DEFINE([USE_QUARTZ_OPENGL], [1], [Define to 1 if native OpenGL should be used on Mac OS X]) use_quartz_opengl=yes ;; esac fi GLU_FRAMEWORKS= GLUT_FRAMEWORKS= GLUT_EXTRA_LIBS= if test x"$use_quartz_opengl" = xyes; then GLU_FRAMEWORKS=OpenGL GLUT_FRAMEWORKS=GLUT GLUT_EXTRA_LIBS=objc fi AC_SUBST([GLU_FRAMEWORKS]) AC_SUBST([GLUT_FRAMEWORKS]) AC_SUBST([GLUT_EXTRA_LIBS]) ])# FP_CHECK_QUARTZ_OPENGL # FP_CHECK_WIN32 # -------------- # If Windows is the target platform (e.g. MinGW/MSYS or Cygwin with # -mno-cygwin), the variable "fp_is_win32" is set to "yes", otherwise (e.g. *nix # systems or plain Cygwin) it is set to "no". AC_DEFUN([FP_CHECK_WIN32], [AC_CACHE_CHECK([for Windows environment], [fp_cv_is_win32], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [ #if !_WIN32 syntax error; #endif ])], [fp_cv_is_win32=yes], [fp_cv_is_win32=no])]) fp_is_win32="$fp_cv_is_win32"[]dnl ])# FP_CHECK_WIN32 # FP_PATH_XTRA # ------------ # Same as AC_PATH_XTRA, but works even for broken Cygwins which try to include # the non-existant header when -mno-cygwin is used. AC_DEFUN([FP_PATH_XTRA], [AC_REQUIRE([FP_CHECK_WIN32]) if test x"$fp_is_win32" = xyes; then no_x=yes else AC_PATH_XTRA fi ])# FP_PATH_XTRA # FP_CHECK_GL_HELPER(LIBNAME, LIBS, INCLUDES, FUNCTION-BODY) # ---------------------------------------------------------- # Try each library in LIBS to successfully link INCLUDES plus FUNCTION-BODY, # setting LIBNAME_CFLAGS and LIBNAME_LIBS to the corresponding values. Sets # no_LIBNAME to "yes" if no suitable library was found. (LIBNAME_CFLAGS0 # contains the value of LIBNAME_CFLAGS without CPPFLAGS, and LIBNAME_LIBS0 # contains the value of LIBNAME_LIBS without LDFLAGS, but these are only # used internally.) AC_DEFUN([FP_CHECK_GL_HELPER], [AC_CACHE_CHECK([for $1 library], [fp_cv_check_$1_lib], [fp_cv_check_$1_lib="no" fp_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS ${$1_CFLAGS}" fp_save_LIBS="$LIBS" for fp_try_lib in $2; do # transform "-lfoo" to "foo.lib" when using cl if test x"$CC" = xcl; then fp_try_lib=`echo $fp_try_lib | sed -e 's/^-l//' -e 's/$/.lib/'` fi LIBS="$fp_try_lib ${$1_LIBS} $fp_save_LIBS" AC_LINK_IFELSE([AC_LANG_PROGRAM([$3], [$4])], [fp_cv_check_$1_lib="$fp_try_lib ${$1_LIBS}"; break]) done LIBS="$fp_save_LIBS" CPPFLAGS="$fp_save_CPPFLAGS"]) if test x"$fp_cv_check_$1_lib" = xno; then no_$1=yes $1_CFLAGS= $1_LIBS= else $1_CFLAGS0="${$1_CFLAGS}" $1_CFLAGS="$CPPFLAGS ${$1_CFLAGS0}" $1_LIBS0="$fp_cv_check_$1_lib" $1_LIBS="$LDFLAGS ${$1_LIBS0}" fi ])# FP_CHECK_GL_HELPER # FP_CHECK_GL # ----------- AC_DEFUN([FP_CHECK_GL], [AC_REQUIRE([FP_PATH_XTRA]) AC_REQUIRE([FP_CHECK_QUARTZ_OPENGL]) AC_REQUIRE([FP_CHECK_WIN32]) if test x"$use_quartz_opengl" = xno; then AC_CHECK_FUNC(atan,[fp_libm_not_needed=yes],[fp_libm_not_needed=dunno]) if test x"$fp_libm_not_needed" = xdunno; then AC_CHECK_LIB([m], [atan], [GL_LIBS="-lm $GL_LIBS"]) fi if test x"$no_x" != xyes; then test -n "$x_includes" && GL_CFLAGS="-I$x_includes $GL_CFLAGS" test -n "$x_libraries" && GL_LIBS="-L$x_libraries -lX11 $GL_LIBS" fi FP_CHECK_GL_HELPER([GL], [-lGL -lopengl32], [@%:@include ], [glEnd()]) if test x"$fp_is_win32" = xyes; then # Ugly: To get wglGetProcAddress on Windows, we have to link with # opengl32.dll, too, even when we are using Cygwin with X11. case "$GL_LIBS" in *-lopengl32*|*opengl32.lib*) ;; *) fp_save_LIBS="$LIBS" LIBS="$LIBS -lopengl32" AC_LINK_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], [[glEnd()]])], [GL_LIBS="$GL_LIBS -lopengl32"; GL_LIBS0="$GL_LIBS0 -lopengl32"]) LIBS="$fp_save_LIBS" ;; esac fi fi AC_SUBST([GL_CFLAGS]) AC_SUBST([GL_LIBS]) ])# FP_CHECK_GL # FP_CHECK_GLU # ------------ AC_DEFUN([FP_CHECK_GLU], [AC_REQUIRE([FP_CHECK_GL])dnl GLU_CFLAGS="$GL_CFLAGS0" GLU_LIBS="$GL_LIBS0" if test x"$use_quartz_opengl" = xno; then FP_CHECK_GL_HELPER([GLU], [-lglu32 -lGLU], [@%:@include ], [gluNewQuadric()]) fi AC_SUBST([GLU_CFLAGS]) AC_SUBST([GLU_LIBS]) ])# FP_CHECK_GLU # FP_CHECK_GLUT # ------------- AC_DEFUN([FP_CHECK_GLUT], [AC_REQUIRE([FP_CHECK_GLU]) AC_REQUIRE([FP_CHECK_QUARTZ_OPENGL]) if test x"$use_quartz_opengl" = xno; then GLUT_CFLAGS="$GLU_CFLAGS0" GLUT_LIBS="$GLU_LIBS0" if test x"$no_x" != xyes; then GLUT_LIBS="$X_PRE_LIBS -lXmu -lXi $X_EXTRA_LIBS $GLUT_LIBS" fi AC_CHECK_HEADERS([windows.h]) fp_save_cppflags="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $X_CFLAGS" AC_CHECK_HEADERS([GL/glut.h]) CPPFLAGS="$fp_save_cppflags" # Note 1: On Cygwin with X11, GL/GLU functions use the "normal" calling # convention, but GLUT functions use stdcall. To get this right, it is # necessary to include first. # Note 2: MinGW/MSYS comes without a GLUT header, so we use Cygwin's one in # that case. FP_CHECK_GL_HELPER([GLUT], [-lglut32 -lglut], [ #if HAVE_WINDOWS_H #include #endif #if HAVE_GL_GLUT_H #include #else #include "glut_local.h" #endif ], [glutMainLoop()]) fi AC_SUBST([GLUT_CFLAGS]) AC_SUBST([GLUT_LIBS]) ])# FP_CHECK_GLUT # FP_ARG_COMPILER # ------------- AC_DEFUN([FP_ARG_COMPILER], [AC_ARG_WITH([compiler], [AC_HELP_STRING([--with-compiler@<:@=HC@:>@], [use the given Haskell compiler (default=ghc)])], [with_compiler=$withval], [with_compiler=ghc]) ])# FP_ARG_COMPILER