From a2458aa898ced2e6e10135c07814347fbf29d916 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastien=20ROUCARI=C3=88S?= Date: Sat, 6 Apr 2013 16:12:44 +0200 Subject: [PATCH 3/7] Improve glu detection * use pkg-config if available * in all the case test tesselation callback * do not try to run with c++ glu is implicitly a c lib --- m4/ax_check_glu.m4 | 339 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 267 insertions(+), 72 deletions(-) diff --git a/m4/ax_check_glu.m4 b/m4/ax_check_glu.m4 index 98c520f..532d742 100644 --- a/m4/ax_check_glu.m4 +++ b/m4/ax_check_glu.m4 @@ -65,7 +65,7 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 10 +#serial 11 # exemple program m4_define([_AX_CHECK_GLU_PROGRAM], @@ -82,6 +82,20 @@ m4_define([_AX_CHECK_GLU_PROGRAM], # endif ]],[[gluBeginCurve(0)]])]) + +dnl Default include : add windows.h +dnl see http://www.opengl.org/wiki/Platform_specifics:_Windows +dnl (acceded 20120801) +AC_DEFUN([_AX_CHECK_GLU_INCLUDES_DEFAULT],dnl +[ + AC_INCLUDES_DEFAULT + [ + # if defined(HAVE_WINDOWS_H) && defined(_WIN32) + # include + # endif + ] +]) + dnl local save flags AC_DEFUN([_AX_CHECK_GLU_SAVE_FLAGS], [dnl @@ -91,6 +105,7 @@ ax_check_glu_saved_cppflags="${CPPFLAGS}" ax_check_glu_saved_ldflags="${LDFLAGS}" ]) + dnl local restore flags AC_DEFUN([_AX_CHECK_GLU_RESTORE_FLAGS], [dnl @@ -100,88 +115,268 @@ CPPFLAGS="${ax_check_glu_saved_cppflags}" LDFLAGS="${ax_check_glu_saved_ldflags}" ]) -AC_DEFUN([AX_CHECK_GLU], -[AC_REQUIRE([AX_CHECK_GL])dnl -AC_REQUIRE([AX_COMPILER_VENDOR])dnl -AC_REQUIRE([AC_PROG_CXX])dnl -GLU_CFLAGS="${GL_CFLAGS}" +# compile the example program +AC_DEFUN([_AX_CHECK_GLU_COMPILE], +[dnl + AC_LANG_PUSH([C]) + _AX_CHECK_GLU_SAVE_FLAGS() + CFLAGS="${GLU_CFLAGS} ${CFLAGS}" + AC_COMPILE_IFELSE([_AX_CHECK_GLU_PROGRAM], + [ax_check_glu_compile_opengl="yes"], + [ax_check_glu_compile_opengl="no"]) + _AX_CHECK_GLU_RESTORE_FLAGS() + AC_LANG_POP([C]) +]) + +# compile the example program (cache) +AC_DEFUN([_AX_CHECK_GLU_COMPILE_CV], +[dnl + AC_CACHE_CHECK([for compiling a minimal OpenGL Utility (GLU) program],[ax_cv_check_glu_compile_opengl], + [_AX_CHECK_GLU_COMPILE() + ax_cv_check_glu_compile_opengl="${ax_check_glu_compile_opengl}"]) + ax_check_glu_compile_opengl="${ax_cv_check_glu_compile_opengl}" +]) -_AX_CHECK_GLU_SAVE_FLAGS -CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}" -# TODO use real headers -AC_CHECK_HEADERS([GL/glu.h OpenGL/glu.h]) -_AX_CHECK_GLU_RESTORE_FLAGS +# link the example program +AC_DEFUN([_AX_CHECK_GLU_LINK], +[dnl + AC_LANG_PUSH([C]) + _AX_CHECK_GLU_SAVE_FLAGS() + CFLAGS="${GLU_CFLAGS} ${CFLAGS}" + LIBS="${GLU_LIBS} ${LIBS}" + LDFLAGS="${GLU_LDFLAGS} ${LDFLAGS}" + AC_LINK_IFELSE([_AX_CHECK_GLU_PROGRAM], + [ax_check_glu_link_opengl="yes"], + [ax_check_glu_link_opengl="no"]) + _AX_CHECK_GLU_RESTORE_FLAGS() + AC_LANG_POP([C]) +]) -AC_CACHE_CHECK([for OpenGL Utility library], [ax_cv_check_glu_libglu], -[ax_cv_check_glu_libglu="no" -ax_save_CPPFLAGS="${CPPFLAGS}" -CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}" -ax_save_LIBS="${LIBS}" +# link the example program (cache) +AC_DEFUN([_AX_CHECK_GLU_LINK_CV], +[dnl + AC_CACHE_CHECK([for linking a minimal OpenGL Utility (GLU) program],[ax_cv_check_glu_link_opengl], + [_AX_CHECK_GLU_LINK() + ax_cv_check_glu_link_opengl="${ax_check_glu_link_opengl}"]) + ax_check_glu_link_opengl="${ax_cv_check_glu_link_opengl}" +]) -# -# First, check for the possibility that everything we need is already in -# GL_LIBS. -# -LIBS="${GL_LIBS} ${ax_save_LIBS}" -# -# libGLU typically links with libstdc++ on POSIX platforms. -# However, setting the language to C++ means that test program -# source is named "conftest.cc"; and Microsoft cl doesn't know what -# to do with such a file. -# -AC_LANG_PUSH([C++]) -AS_IF([test X$ax_compiler_ms = Xyes], - [AC_LANG_PUSH([C])]) -AC_LINK_IFELSE( -[_AX_CHECK_GLU_PROGRAM], -[ax_cv_check_glu_libglu=yes], -[LIBS="" -ax_check_libs="-lglu32 -lGLU" -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} ${GL_LIBS} ${ax_save_LIBS}" - AC_LINK_IFELSE([_AX_CHECK_GLU_PROGRAM], - [ax_cv_check_glu_libglu="${ax_try_lib}"; break]) -done +dnl Check headers manually (default case) +AC_DEFUN([_AX_CHECK_GLU_HEADERS], +[AC_LANG_PUSH([C]) + _AX_CHECK_GL_SAVE_FLAGS() + CFLAGS="${GLU_CFLAGS} ${CFLAGS}" + # see comment in _AX_CHECK_GL_INCLUDES_DEFAULT + AC_CHECK_HEADERS([windows.h],[],[],[AC_INCLUDES_DEFAULT]) + AC_CHECK_HEADERS([GL/glu.h OpenGL/glu.h], + [ax_check_glu_have_headers="yes";break], + [ax_check_glu_have_headers_headers="no"], + [_AX_CHECK_GLU_INCLUDES_DEFAULT()]) + # do not try darwin specific OpenGl/gl.h + _AX_CHECK_GL_RESTORE_FLAGS() + AC_LANG_POP([C]) ]) -AS_IF([test X$ax_compiler_ms = Xyes], - [AC_LANG_POP([C])]) -AC_LANG_POP([C++]) - -LIBS=${ax_save_LIBS} -CPPFLAGS=${ax_save_CPPFLAGS}]) -AS_IF([test "X$ax_cv_check_glu_libglu" = Xno], - [no_glu=yes; GLU_CFLAGS=""; GLU_LIBS=""], - [AS_IF([test "X$ax_cv_check_glu_libglu" = Xyes], - [GLU_LIBS="$GL_LIBS"], - [GLU_LIBS="${ax_cv_check_glu_libglu} ${GL_LIBS}"])]) -AC_SUBST([GLU_CFLAGS]) -AC_SUBST([GLU_LIBS]) + +# check tesselation callback function signature. +m4_define([_AX_CHECK_GLU_VARARGS_TESSVB_PROGRAM], +[AC_LANG_PROGRAM([[ +# if defined(HAVE_WINDOWS_H) && defined(_WIN32) +# include +# endif +# ifdef HAVE_GL_GLU_H +# include +# elif defined(HAVE_OPENGL_GLU_H) +# include +# else +# error no glu.h +# endif +]], +[[GLvoid (*func)(...); gluTessCallback(0, 0, func)]]) +]) + +# compile the tesselation callback function program +# test with c++ +AC_DEFUN([_AX_CHECK_GLU_COMPILE_VARARGS_TESSVB_PROGRAM], +[dnl + AC_LANG_PUSH([C++]) + _AX_CHECK_GLU_SAVE_FLAGS() + CFLAGS="${GLU_CFLAGS} ${CFLAGS}" + AC_COMPILE_IFELSE([_AX_CHECK_GLU_VARARGS_TESSVB_PROGRAM], + [ax_check_glu_compile_varargs_tessvb_program="yes"], + [ax_check_glu_compile_varargs_tessvb_program="no"]) + _AX_CHECK_GLU_RESTORE_FLAGS() + AC_LANG_POP([C++]) +]) + # # Some versions of Mac OS X include a broken interpretation of the GLU # tesselation callback function signature. # -AS_IF([test "X$ax_cv_check_glu_libglu" != Xno], -[AC_CACHE_CHECK([for varargs GLU tesselator callback function type], +AC_DEFUN([_AX_CHECK_GLU_VARARGS_TESSVB], +[ +AC_CACHE_CHECK([for varargs OpenGL Utility (GLU) tesselator callback function type], [ax_cv_varargs_glu_tesscb], -[ax_cv_varargs_glu_tesscb=no -ax_save_CFLAGS="$CFLAGS" -CFLAGS="$GL_CFLAGS $CFLAGS" -AC_COMPILE_IFELSE( -[AC_LANG_PROGRAM([[ -# ifdef HAVE_GL_GLU_H -# include -# else -# include -# endif]], - [[GLvoid (*func)(...); gluTessCallback(0, 0, func)]])], -[ax_cv_varargs_glu_tesscb=yes]) -CFLAGS="$ax_save_CFLAGS"]) + [_AX_CHECK_GLU_COMPILE_VARARGS_TESSVB_PROGRAM + ax_cv_varargs_glu_tesscb="${ax_check_glu_compile_varargs_tessvb_program}"]) +ax_check_glu_compile_varargs_tessvb_program="${ax_cv_varargs_glu_tesscb}" + AS_IF([test X$ax_cv_varargs_glu_tesscb = Xyes], [AC_DEFINE([HAVE_VARARGS_GLU_TESSCB], [1], - [Use nonstandard varargs form for the GLU tesselator callback])])]) + [Use nonstandard varargs form for the GLU tesselator callback])]) +]) + + +# dnl try to found library (generic case) +# dnl $1 is set to the library to found +AC_DEFUN([_AX_CHECK_GLU_MANUAL_LIBS_GENERIC], +[dnl + ax_check_glu_manual_libs_generic_extra_libs="$1" + AS_IF([test "X$ax_check_glu_manual_libs_generic_extra_libs" = "X"], + [AC_MSG_ERROR([AX_CHECK_GLU_MANUAL_LIBS_GENERIC argument must no be empty])]) + + AC_LANG_PUSH([C]) + _AX_CHECK_GLU_SAVE_FLAGS() + CFLAGS="${GLU_CFLAGS} ${CFLAGS}" + LIBS="${GLU_LIBS} ${LIBS}" + AC_SEARCH_LIBS([gluBeginCurve],[$ax_check_glu_manual_libs_generic_extra_libs], + [ax_check_glu_lib_opengl="yes"], + [ax_check_glu_lib_opengl="no"]) + AS_CASE([$ac_cv_search_gluBeginCurve], + ["none required"],[], + [no],[], + [GLU_LIBS="${ac_cv_search_gluBeginCurve} ${GLU_LIBS}"]) + _AX_CHECK_GLU_RESTORE_FLAGS() + AC_LANG_PUSH([C]) +]) + + +dnl Check library manually: subroutine must set +dnl $ax_check_gl_lib_opengl={yes,no} +AC_DEFUN([_AX_CHECK_GLU_MANUAL_LIBS], +[AC_REQUIRE([AC_CANONICAL_HOST]) + GLU_LIBS="${GLU_LIBS} ${GL_LIBS}" + AS_CASE([${host}], + # try first cygwin version + [*-cygwin*],[_AX_CHECK_GLU_MANUAL_LIBS_GENERIC([GLU glu MesaGLU glu32])], + # try first native + [*-mingw*],[_AX_CHECK_GLU_MANUAL_LIBS_GENERIC([glu32 GLU glu MesaGLU])], + [_AX_CHECK_GLU_MANUAL_LIBS_GENERIC([GLU glu MesaGLU])]) + + AC_CACHE_CHECK([for OpenGL Utility (GLU) libraries],[ax_cv_check_glu_lib_opengl], + [ax_cv_check_glu_lib_opengl="${ax_check_glu_lib_opengl}"]) + ax_check_glu_lib_opengl="${ax_cv_check_glu_lib_opengl}" ]) + + +dnl Manual way to detect GLU +AC_DEFUN([_AX_CHECK_GLU_MANUAL], +[AC_REQUIRE([AX_CHECK_GL])dnl +AC_REQUIRE([AX_COMPILER_VENDOR])dnl +AC_REQUIRE([AC_PROG_CXX])dnl + +# inherit cflags +GLU_CFLAGS="${GLU_CFLAGS} ${GL_CFLAGS}" + +# check headers +_AX_CHECK_GLU_HEADERS + +AS_IF([test "X$ax_check_glu_have_headers" = "Xyes"], + [_AX_CHECK_GLU_MANUAL_LIBS], + [ax_check_glu_lib_opengl="no"]) + +AS_IF([test "X$ax_check_glu_lib_opengl" = "Xyes"], + [_AX_CHECK_GLU_COMPILE_CV()], + [ax_cv_check_glu_compile_opengl="no"]) + +AS_IF([test "X$ax_cv_check_glu_compile_opengl" = "Xyes"], + [_AX_CHECK_GLU_LINK_CV()], + [ax_cv_check_glu_link_opengl="no"]) + +AS_IF([test "X$ax_cv_check_glu_link_opengl" = "Xyes"], + [no_glu="no"], + [no_glu="yes"]) +]) + +# detect using pkgconfig +AC_DEFUN([_AX_CHECK_GLU_PKG_CONFIG], +[ + AC_REQUIRE([PKG_PROG_PKG_CONFIG]) + + PKG_CHECK_MODULES([GLU],[glu],[ax_check_glu_pkg_config=yes],[ax_check_glu_pkg_config=no]) + + AS_IF([test "X$ax_check_glu_pkg_config" = "Xyes"],[ + # check headers + AC_LANG_PUSH([C]) + _AX_CHECK_GLU_SAVE_FLAGS() + CFLAGS="${GLU_CFLAGS} ${CFLAGS}" + AC_CHECK_HEADERS([windows.h],[],[],[AC_INCLUDES_DEFAULT]) + AC_CHECK_HEADERS([GL/glu.h OpenGL/glu.h], + [ax_check_glu_have_headers="yes";break], + [ax_check_glu_have_headers_headers="no"], + [_AX_CHECK_GLU_INCLUDES_DEFAULT()]) + _AX_CHECK_GL_RESTORE_FLAGS() + AC_LANG_POP([C]) + AC_CACHE_CHECK([for OpenGL Utility (GLU) headers],[ax_cv_check_glu_have_headers], + [ax_cv_check_glu_have_headers="${ax_check_glu_have_headers}"]) + + # pkgconfig library are suposed to work ... + AS_IF([test "X$ax_cv_check_glu_have_headers" = "Xno"], + [AC_MSG_ERROR("Pkgconfig detected OpenGL Utility (GLU) library has no headers!")]) + + _AX_CHECK_GLU_COMPILE_CV() + AS_IF([test "X$ax_cv_check_glu_compile_opengl" = "Xno"], + [AC_MSG_ERROR("Pkgconfig detected OpenGL Utility (GLU) library could not be used for compiling minimal program!")]) + + _AX_CHECK_GLU_LINK_CV() + AS_IF([test "X$ax_cv_check_glu_link_opengl" = "Xno"], + [AC_MSG_ERROR("Pkgconfig detected OpenGL Utility (GLU) library could not be used for linking minimal program!")]) + ]) +]) + +# entry point +AC_DEFUN([AX_CHECK_GLU],dnl +[ + AC_REQUIRE([AX_CHECK_GL]) + AC_REQUIRE([PKG_PROG_PKG_CONFIG]) + + # set flags + no_glu="yes" + + AC_MSG_CHECKING([for a working OpenGL Utility (GLU) implementation by pkg-config]) + # try first pkgconfig + AS_IF([test "X${PKG_CONFIG}" = "X"], + [AC_MSG_RESULT([no]) + ax_check_glu_pkg_config=no], + [AC_MSG_RESULT([yes]) + _AX_CHECK_GLU_PKG_CONFIG()]) + + # if no pkg-config or pkg-config fail try manual way + AS_IF([test "X$ax_check_glu_pkg_config" = "Xno"], + [_AX_CHECK_GLU_MANUAL()], + [no_glu=no]) + + # check broken implementation + AS_IF([test "X$no_glu" = "Xno"], + [_AX_CHECK_GLU_VARARGS_TESSVB],[]) + + AC_MSG_CHECKING([for a working OpenGL Utility (GLU) implementation]) + AS_IF([test "X$no_glu" = "Xno"], + [AC_MSG_RESULT([yes]) + AC_MSG_CHECKING([for CFLAGS needed for OpenGL Utility (GLU)]) + AC_MSG_RESULT(["${GLU_CFLAGS}"]) + AC_MSG_CHECKING([for LIBS needed for OpenGL Utility (GLU)]) + AC_MSG_RESULT(["${GLU_LIBS}"]) + AC_MSG_CHECKING([for LDFLAGS needed for OpenGL Utility (GLU)]) + AC_MSG_RESULT(["${GLU_LDFLAGS}"])], + [AC_MSG_RESULT([no]) + GLU_CFLAGS="" + GLU_LIBS="" + GLU_LDFLAGS=""]) + + AC_SUBST([GLU_CFLAGS]) + AC_SUBST([GLU_LIBS]) + AC_SUBST([GLU_LDFLAGS]) + +]) \ No newline at end of file -- 1.7.10.4