From c8fbf9c321b164e65bb4550205435efa659ac97e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastien=20ROUCARI=C3=88S?= Date: Sun, 7 Apr 2013 11:19:39 +0200 Subject: [PATCH 7/7] Improve ax_check_glut - Use modern construct - test link/compile/headers - add more comments --- m4/ax_check_glut.m4 | 259 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 203 insertions(+), 56 deletions(-) diff --git a/m4/ax_check_glut.m4 b/m4/ax_check_glut.m4 index 4c7696d..4b27ac7 100644 --- a/m4/ax_check_glut.m4 +++ b/m4/ax_check_glut.m4 @@ -2,11 +2,6 @@ # http://www.gnu.org/software/autoconf-archive/ax_check_glut.html # =========================================================================== # -# OBSOLETE MACRO -# -# This macro is no longer maintained here; the author prefers to publish -# it at . -# # SYNOPSIS # # AX_CHECK_GLUT @@ -21,9 +16,22 @@ # header "GLUT/glut.h" is found, HAVE_GLUT_GLUT_H is defined. These # preprocessor definitions may not be mutually exclusive. # +# You should use something like this in your headers: +# # if HAVE_WINDOWS_H && defined(_WIN32) +# # include +# # endif +# # if defined(HAVE_GL_GLUT_H) +# # include +# # elif defined(HAVE_GLUT_GLUT_H) +# # include +# # else +# # error no glut.h +# # endif +# # LICENSE # # Copyright (c) 2009 Braden McDaniel +# Copyright (c) 2013 Bastien Roucaries # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the @@ -51,21 +59,41 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 9 +#serial 11 -AC_DEFUN([AX_CHECK_GLUT], -[AC_REQUIRE([AX_CHECK_GLU])dnl -AC_REQUIRE([AC_PATH_XTRA])dnl +dnl local save flags +AC_DEFUN([_AX_CHECK_GLUT_SAVE_FLAGS], +[dnl +ax_check_glut_saved_libs="${LIBS}" +ax_check_glut_saved_cflags="${CFLAGS}" +ax_check_glut_saved_cppflags="${CPPFLAGS}" +ax_check_glut_saved_ldflags="${LDFLAGS}" +]) -ax_save_CPPFLAGS="${CPPFLAGS}" -CPPFLAGS="${GLU_CFLAGS} ${CPPFLAGS}" -AC_CHECK_HEADERS([GL/glut.h GLUT/glut.h]) -CPPFLAGS="${ax_save_CPPFLAGS}" -GLUT_CFLAGS=${GLU_CFLAGS} -GLUT_LIBS=${GLU_LIBS} +dnl local restore flags +AC_DEFUN([_AX_CHECK_GLUT_RESTORE_FLAGS], +[dnl +LIBS="${ax_check_glut_saved_libs}" +CFLAGS="${ax_check_glut_saved_cflags}" +CPPFLAGS="${ax_check_glut_saved_cppflags}" +LDFLAGS="${ax_check_glut_saved_ldflags}" +]) -m4_define([AX_CHECK_GLUT_PROGRAM], +dnl Default include : add windows.h +dnl see http://www.opengl.org/wiki/Platform_specifics:_Windows +dnl (acceded 20120801) +AC_DEFUN([_AX_CHECK_GLUT_INCLUDES_DEFAULT],dnl +[ + AC_INCLUDES_DEFAULT + [ + # if defined(HAVE_WINDOWS_H) && defined(_WIN32) + # include + # endif + ] +]) + +m4_define([_AX_CHECK_GLUT_PROGRAM], [AC_LANG_PROGRAM([[ # if HAVE_WINDOWS_H && defined(_WIN32) # include @@ -77,44 +105,163 @@ m4_define([AX_CHECK_GLUT_PROGRAM], # else # error no glut.h # endif]], - [[glutMainLoop()]])]) +[[glutMainLoop()]])]) -# -# If X is present, assume GLUT depends on it. -# -AS_IF([test X$no_x != Xyes], - [GLUT_LIBS="${X_PRE_LIBS} -lXmu -lXi ${X_EXTRA_LIBS} ${GLUT_LIBS}"]) - -AC_CACHE_CHECK([for GLUT library], [ax_cv_check_glut_libglut], -[ax_cv_check_glut_libglut="no" -AC_LANG_PUSH(C) -ax_save_CPPFLAGS="${CPPFLAGS}" -CPPFLAGS="${GLUT_CFLAGS} ${CPPFLAGS}" -ax_save_LIBS="${LIBS}" -LIBS="" -ax_check_libs="-lglut32 -lglut" -for ax_lib in ${ax_check_libs}; do - AS_IF([test X$ax_compiler_ms = Xyes], - [ax_try_lib=`echo $ax_lib | sed -e 's/^-l//' -e 's/$/.lib/'`], - [ax_try_lib="${ax_lib}"]) - LIBS="${ax_try_lib} ${GLUT_LIBS} ${ax_save_LIBS}" - AC_LINK_IFELSE([AX_CHECK_GLUT_PROGRAM], - [ax_cv_check_glut_libglut="${ax_try_lib}"; break]) -done - -AS_IF([test "X$ax_cv_check_glut_libglut" = Xno -a "X$no_x" = Xyes], -[LIBS='-framework GLUT' -AC_LINK_IFELSE([AX_CHECK_GLUT_PROGRAM], - [ax_cv_check_glut_libglut="$LIBS"])]) - -CPPFLAGS="${ax_save_CPPFLAGS}" -LIBS="${ax_save_LIBS}" -AC_LANG_POP(C)]) - -AS_IF([test "X$ax_cv_check_glut_libglut" = Xno], - [no_glut="yes"; GLUT_CFLAGS=""; GLUT_LIBS=""], - [GLUT_LIBS="${ax_cv_check_glut_libglut} ${GLUT_LIBS}"]) - -AC_SUBST([GLUT_CFLAGS]) -AC_SUBST([GLUT_LIBS]) -])dnl + +dnl Check headers manually (default case) +AC_DEFUN([_AX_CHECK_GLUT_HEADERS], +[AC_LANG_PUSH([C]) + _AX_CHECK_GLUT_SAVE_FLAGS() + CFLAGS="${GLUT_CFLAGS} ${CFLAGS}" + # see comment in _AX_CHECK_GL_INCLUDES_DEFAULT + AC_CHECK_HEADERS([windows.h],[],[],[AC_INCLUDES_DEFAULT]) + AC_CHECK_HEADERS([GL/glut.h OpenGL/glut.h], + [ax_check_glut_have_headers="yes";break], + [ax_check_glut_have_headers_headers="no"], + [_AX_CHECK_GLUT_INCLUDES_DEFAULT()]) + # do not try darwin specific OpenGl/gl.h + _AX_CHECK_GLUT_RESTORE_FLAGS() + AC_LANG_POP([C]) +]) + +# dnl try to found library (generic case) +# dnl $1 is set to the library to found +AC_DEFUN([_AX_CHECK_GLUT_MANUAL_LIBS_GENERIC], +[dnl + ax_check_glut_manual_libs_generic_extra_libs="$1" + AS_IF([test "X$ax_check_glut_manual_libs_generic_extra_libs" = "X"], + [AC_MSG_ERROR([AX_CHECK_GLUT_MANUAL_LIBS_GENERIC argument must no be empty])]) + + AC_LANG_PUSH([C]) + _AX_CHECK_GLUT_SAVE_FLAGS() + CFLAGS="${GLUT_CFLAGS} ${CFLAGS}" + LIBS="${GLUT_LIBS} ${LIBS}" + AC_SEARCH_LIBS([glutMainLoop],[$ax_check_glut_manual_libs_generic_extra_libs], + [ax_check_glut_lib_opengl="yes"], + [ax_check_glut_lib_opengl="no"]) + AS_CASE([$ac_cv_search_glutMainLoop], + ["none required"],[], + [no],[], + [GLUT_LIBS="${ac_cv_search_glutMainLoop} ${GLU_LIBS}"]) + _AX_CHECK_GLUT_RESTORE_FLAGS() + AC_LANG_PUSH([C]) +]) + + +dnl Check library manually: subroutine must set +dnl $ax_check_glut_lib_opengl={yes,no} +dnl for windows part see +dnl - http://www.transmissionzero.co.uk/computing/using-glut-with-mingw/ +dnl - http://user.xmission.com/~nate/glut.html +AC_DEFUN([_AX_CHECK_GLUT_MANUAL_LIBS], +[AC_REQUIRE([AC_CANONICAL_HOST]) + GLUT_LIBS="${GLUT_LIBS} ${GLU_LIBS}" + AS_CASE([${host}], + # try first cygwin version + [*-cygwin*],[_AX_CHECK_GLUT_MANUAL_LIBS_GENERIC([GLUT glut MesaGLUT freeglut freeglut32 glut32])], + # try first native + [*-mingw*],[_AX_CHECK_GLUT_MANUAL_LIBS_GENERIC([glut32 GLUT glut MesaGLUT freeglut freeglut32])], + [_AX_CHECK_GLUT_MANUAL_LIBS_GENERIC([GLUT glut freeglut MesaGLUT])]) + + AC_CACHE_CHECK([for OpenGL Utility Toolkit (GLUT) libraries],[ax_cv_check_glut_lib_opengl], + [ax_cv_check_glut_lib_opengl="${ax_check_glut_lib_opengl}"]) + ax_check_glut_lib_opengl="${ax_cv_check_glut_lib_opengl}" +]) + +# compile the example program +AC_DEFUN([_AX_CHECK_GLUT_COMPILE], +[dnl + AC_LANG_PUSH([C]) + _AX_CHECK_GLUT_SAVE_FLAGS() + CFLAGS="${GLUT_CFLAGS} ${CFLAGS}" + AC_COMPILE_IFELSE([_AX_CHECK_GLUT_PROGRAM], + [ax_check_glut_compile_opengl="yes"], + [ax_check_glut_compile_opengl="no"]) + _AX_CHECK_GLUT_RESTORE_FLAGS() + AC_LANG_POP([C]) +]) + +# compile the example program (cache) +AC_DEFUN([_AX_CHECK_GLUT_COMPILE_CV], +[dnl + AC_CACHE_CHECK([for compiling a minimal OpenGL Utility Toolkit (GLUT) program],[ax_cv_check_glut_compile_opengl], + [_AX_CHECK_GLUT_COMPILE() + ax_cv_check_glut_compile_opengl="${ax_check_glut_compile_opengl}"]) + ax_check_glut_compile_opengl="${ax_cv_check_glut_compile_opengl}" +]) + +# link the example program +AC_DEFUN([_AX_CHECK_GLUT_LINK], +[dnl + AC_LANG_PUSH([C]) + _AX_CHECK_GLUT_SAVE_FLAGS() + CFLAGS="${GLUT_CFLAGS} ${CFLAGS}" + LIBS="${GLUT_LIBS} ${LIBS}" + LDFLAGS="${GLUT_LDFLAGS} ${LDFLAGS}" + AC_LINK_IFELSE([_AX_CHECK_GLUT_PROGRAM], + [ax_check_glut_link_opengl="yes"], + [ax_check_glut_link_opengl="no"]) + _AX_CHECK_GLUT_RESTORE_FLAGS() + AC_LANG_POP([C]) +]) + +# link the example program (cache) +AC_DEFUN([_AX_CHECK_GLUT_LINK_CV], +[dnl + AC_CACHE_CHECK([for linking a minimal OpenGL Utility Toolkit (GLUT) program],[ax_cv_check_glut_link_opengl], + [_AX_CHECK_GLUT_LINK() + ax_cv_check_glut_link_opengl="${ax_check_glut_link_opengl}"]) + ax_check_glut_link_opengl="${ax_cv_check_glut_link_opengl}" +]) + + +# manually check GLUT +AC_DEFUN([_AX_CHECK_GLUT_MANUAL],dnl +[ +GLUT_CFLAGS="${GLUT_CFLAGS} ${GLU_CFLAGS}" +_AX_CHECK_GLUT_HEADERS + +AS_IF([test "X$ax_check_glut_have_headers" = "Xyes"], + [_AX_CHECK_GLUT_MANUAL_LIBS], + [ax_check_glut_lib="no"]) + +AS_IF([test "X$ax_check_glut_lib_opengl" = "Xyes"], + [_AX_CHECK_GLUT_COMPILE_CV()], + [ax_cv_check_glut_compile_opengl="no"]) + +AS_IF([test "X$ax_cv_check_glut_compile_opengl" = "Xyes"], + [_AX_CHECK_GLUT_LINK_CV()], + [ax_cv_check_glut_link_opengl="no"]) + +AS_IF([test "X$ax_cv_check_glut_link_opengl" = "Xyes"], + [no_glut="no"], + [no_glut="yes"]) +]) + + +# main entry point +AC_DEFUN([AX_CHECK_GLUT], +[dnl + AC_REQUIRE([AX_CHECK_GL])dnl + AC_REQUIRE([AX_CHECK_GLU])dnl + + _AX_CHECK_GLUT_MANUAL + + AC_MSG_CHECKING([for a working OpenGL Utility Toolkit (GLUT) implementation]) + AS_IF([test "X$no_glut" = "Xno"], + [AC_MSG_RESULT([yes]) + AC_MSG_CHECKING([for CFLAGS needed for OpenGL Utility Toolkit (GLUT)]) + AC_MSG_RESULT(["${GLUT_CFLAGS}"]) + AC_MSG_CHECKING([for LIBS needed for OpenGL Utility Toolkit (GLUT)]) + AC_MSG_RESULT(["${GLUT_LIBS}"]) + AC_MSG_CHECKING([for LDFLAGS needed for OpenGL Utility Toolkit (GLUT)]) + AC_MSG_RESULT(["${GLUT_LDFLAGS}"])], + [AC_MSG_RESULT([no]) + GLUT_CFLAGS="" + GLUT_LIBS="" + GLUT_LDFLAGS=""]) + + AC_SUBST([GLUT_CFLAGS]) + AC_SUBST([GLUT_LIBS]) + AC_SUBST([GLUT_LDFLAGS]) +]) -- 1.7.10.4