summaryrefslogtreecommitdiff
path: root/m4/ax_check_glu.m4
diff options
context:
space:
mode:
authorBastien ROUCARIÈS <roucaries.bastien@gmail.com>2013-04-06 16:12:44 +0200
committerPeter Simons <simons@cryp.to>2013-04-07 22:43:52 +0200
commit3e58e4f5229cfb6679d80ae72321585557f042bc (patch)
tree155403efb2ce4511817cdc456fd089e646dadb34 /m4/ax_check_glu.m4
parentd45fd53571cf9e92e5b4e107c456202d5e0cee75 (diff)
downloadautoconf-archive-3e58e4f5229cfb6679d80ae72321585557f042bc.tar.gz
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
Diffstat (limited to 'm4/ax_check_glu.m4')
-rw-r--r--m4/ax_check_glu.m4339
1 files 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 <windows.h>
+ # 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 <windows.h>
+# endif
+# ifdef HAVE_GL_GLU_H
+# include <GL/glu.h>
+# elif defined(HAVE_OPENGL_GLU_H)
+# include <OpenGL/glu.h>
+# 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 <GL/glu.h>
-# else
-# include <OpenGL/glu.h>
-# 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