1# Check state of glx.h 2# 3# This file depends on the value of OPENGL_INCLUDE_DIR (/usr/include on Linux, 4# /usr/X11R6/include on Mac, ) defined by module FindOpenGL.cmake 5# (FIND_PACKAGE(OpenGL)) 6# 7# 8# 1. GLX_DEFINES_MACRO_GLX_VERSION_1_1: is macro GLX_VERSION_1_1 defined? 9# 2. GLX_DEFINES_MACRO_GLX_VERSION_1_2: is macro GLX_VERSION_1_2 defined? 10# 3. GLX_DEFINES_MACRO_GLX_VERSION_1_3: is macro GLX_VERSION_1_3 defined? 11# 4. GLX_DEFINES_MACRO_GLX_VERSION_1_4: is macro GLX_VERSION_1_4 defined? 12# 5. GLX_DEFINES_MACRO_GLX_ARB_get_proc_address: is macro 13# GLX_ARB_get_proc_address defined? 14# 6. GLX_INCLUDES_GLXEXT: does glx.h include glxext.h? 15# 7. GLX_USES_MACRO_GLX_GLXEXT_LEGACY: does glx.h look for macro 16# GLX_GLXEXT_LEGACY before including glxext.h? 17# 8. GLX_DEFINES_TYPE_GLXextFuncPtr: is type GLXextFuncPtr defined? 18# 9. GLX_DECLARES_FUNCTION_glXGetProcAddressARB: is function 19# glXGetProcAddressARB declared? 20# 10. GLX_DECLARES_FUNCTION_glXGetProcAddress: is function glXGetProcAddress 21# declared? 22# 11. GLX_DEFINES_TYPE_GLXextFuncPtr_AS_EMPTY: is type GLXextFuncPtr defined 23# with an empty parameter list (true), or with a void keyword (false) 24# 12. GLX_DECLARES_FUNCTION_glXGetProcAddress_AS_EMPTY: is function 25# glXGetProcAddress declared with an empty parameter list (true), or with 26# a void keyword (false) 27# 13. GLX_DEFINES_TYPE_GLXFBConfig: is type GLXFBConfig defined? 28# 29# Regarding test 11 and 12, here is a quick reminder for a difference between 30# C and C++: 31# C: f() function with any number of parameter 32# C: f(void) function with no parameter 33# C++: f()=f(void) function with no parameter 34# -ansi -pedantic 35 36# Why all this? 37# Some glx.h are bogus: 38# - HP: HP-UX defines GLX_VERSION_1_3 but not type GLXFBConfig 39# GLX_DEFINES_TYPE_GLXFBconfig 40# GLX_HAS_GLXFBConfig_bug : GLX_DEFINES_MACRO_GLX_VERSION_1_3 && !GLX_DEFINES_TYPE_GLXFBconfig 41# - sometimes typedef void (*__GLXextFuncPtr)(void); does not exist, or is 42# defined with () inside of (void), or only exits in glxext.h 43# - glXGetProcAddressARB should be 44# extern void (*glXGetProcAddressARB(const GLubyte *procName))(void); 45# - glXGetProcAddress should be 46# extern __GLXextFuncPtr glXGetProcAddress (const GLubyte *); 47# The GLX spec is actually wrong because it uses () which means any 48# number of parameters, not (void), which means no parameter. 49# SunOS follows the spec, Linux does not 50# extern void (*glXGetProcAddress(const GLubyte *procname))(); 51# - Mac Tiger: GLX_ARB_get_proc_address macro is defined but it does not define 52# __GLXextFuncPtr. 53# 54# 55#message("vtkTestGLX.cmake first line.") 56 57include(CheckCSourceCompiles) # defines CHECK_C_SOURCE_COMPILES() 58include(CheckCXXSourceCompiles) 59 60# cmake debugging 61#unset(GLX_DEFINES_MACRO_GLX_VERSION_1_1 CACHE) 62#unset(GLX_DEFINES_MACRO_GLX_VERSION_1_2 CACHE) 63#unset(GLX_DEFINES_MACRO_GLX_VERSION_1_3 CACHE) 64#unset(GLX_DEFINES_MACRO_GLX_VERSION_1_4 CACHE) 65#unset(GLX_DEFINES_MACRO_GLX_ARB_get_proc_address CACHE) 66#unset(GLX_INCLUDES_GLXEXT CACHE) 67#unset(GLX_USES_MACRO_GLX_GLXEXT_LEGACY CACHE) 68#unset(GLX_DEFINES_TYPE_GLXextFuncPtr CACHE) 69#unset(GLX_DECLARES_FUNCTION_glXGetProcAddressARB CACHE) 70#unset(GLX_DECLARES_FUNCTION_glXGetProcAddress CACHE) 71 72# False: void, True: empty 73#unset(GLX_DEFINES_TYPE_GLXextFuncPtr_AS_EMPTY CACHE) 74#unset(GLX_DECLARES_FUNCTION_glXGetProcAddressARB_AS_EMPTY CACHE) 75#unset(GLX_DECLARES_FUNCTION_glXGetProcAddress_AS_EMPTY CACHE) 76 77#unset(GLX_DEFINES_TYPE_GLXFBConfig CACHE) 78 79# for CHECK_C_SOURCE_COMPILES 80set(SAVE_CMAKE_REQUIRED_INCLUDES "${CMAKE_REQUIRED_INCLUDES}") 81set(SAVE_CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}") 82 83set(CMAKE_REQUIRED_INCLUDES ${OPENGL_INCLUDE_DIR}) 84 85# We cannot just use OPENGL_gl_LIBRARY: SunOS requires to link 86# with X11, which is available only in OPENGL_LIBRARIES. 87# Also, SunOS requires to explicitly link -lm 88set(CMAKE_REQUIRED_LIBRARIES 89 ${OPENGL_LIBRARIES} 90 ${CMAKE_REQUIRED_LIBRARIES} 91 -lm) 92 93if(DEFINED GLX_DEFINES_MACRO_GLX_VERSION_1_1) 94 set(REPORT_STATUS 0) 95else() 96 set(REPORT_STATUS 1) 97endif() 98 99# ----------------------------------------------------------------------------- 100# GLX_DEFINES_MACRO_GLX_VERSION_1_1 101# ----------------------------------------------------------------------------- 102CHECK_C_SOURCE_COMPILES( 103" 104#define GLX_GLXEXT_LEGACY 105#include <GL/glx.h> 106int main() 107{ 108#ifdef GLX_VERSION_1_1 109 return 0; 110#else 111 a; /* will raise a syntax error */ 112#endif 113} 114" 115 GLX_DEFINES_MACRO_GLX_VERSION_1_1) 116 117# ----------------------------------------------------------------------------- 118# GLX_DEFINES_MACRO_GLX_VERSION_1_2 119# ----------------------------------------------------------------------------- 120CHECK_C_SOURCE_COMPILES( 121" 122#define GLX_GLXEXT_LEGACY 123#include <GL/glx.h> 124int main() 125{ 126#ifdef GLX_VERSION_1_2 127 return 0; 128#else 129 a; /* will raise a syntax error */ 130#endif 131} 132" 133 GLX_DEFINES_MACRO_GLX_VERSION_1_2) 134 135# ----------------------------------------------------------------------------- 136# GLX_DEFINES_MACRO_GLX_VERSION_1_3 137# ----------------------------------------------------------------------------- 138CHECK_C_SOURCE_COMPILES( 139" 140#define GLX_GLXEXT_LEGACY 141#include <GL/glx.h> 142int main() 143{ 144#ifdef GLX_VERSION_1_3 145 return 0; 146#else 147 a; /* will raise a syntax error */ 148#endif 149} 150" 151 GLX_DEFINES_MACRO_GLX_VERSION_1_3) 152 153# ----------------------------------------------------------------------------- 154# GLX_DEFINES_MACRO_GLX_VERSION_1_4 155# ----------------------------------------------------------------------------- 156CHECK_C_SOURCE_COMPILES( 157" 158#define GLX_GLXEXT_LEGACY 159#include <GL/glx.h> 160int main() 161{ 162#ifdef GLX_VERSION_1_4 163 return 0; 164#else 165 a; /* will raise a syntax error */ 166#endif 167} 168" 169 GLX_DEFINES_MACRO_GLX_VERSION_1_4) 170 171# ----------------------------------------------------------------------------- 172# GLX_DEFINES_MACRO_GLX_ARB_get_proc_address 173# ----------------------------------------------------------------------------- 174CHECK_C_SOURCE_COMPILES( 175" 176#define GLX_GLXEXT_LEGACY 177#include <GL/glx.h> 178int main() 179{ 180#ifdef GLX_ARB_get_proc_address 181 return 0; 182#else 183 a; /* will raise a syntax error */ 184#endif 185} 186" 187 GLX_DEFINES_MACRO_GLX_ARB_get_proc_address) 188 189# ----------------------------------------------------------------------------- 190# GLX_INCLUDES_GLXEXT 191# ----------------------------------------------------------------------------- 192CHECK_C_SOURCE_COMPILES( 193" 194#include <GL/glx.h> 195int main() 196{ 197#ifdef __glxext_h_ 198 return 0; 199#else 200 a; /* will raise a syntax error */ 201#endif 202} 203" 204 GLX_INCLUDES_GLXEXT) 205 206# ----------------------------------------------------------------------------- 207# GLX_USES_MACRO_GLX_GLXEXT_LEGACY 208# ----------------------------------------------------------------------------- 209set(glx_h_full_path "${OPENGL_INCLUDE_DIR}/GL/glx.h") 210 211unset(GLX_GLXEXT_LEGACY_OCCURENCE) 212file(STRINGS ${glx_h_full_path} GLX_GLXEXT_LEGACY_OCCURENCE REGEX GLX_GLXEXT_LEGACY) 213if(GLX_GLXEXT_LEGACY_OCCURENCE) 214 set(GLX_USES_MACRO_GLX_GLXEXT_LEGACY TRUE CACHE INTERNAL "") 215else() 216 set(GLX_USES_MACRO_GLX_GLXEXT_LEGACY FALSE CACHE INTERNAL "") 217endif() 218 219 220# ----------------------------------------------------------------------------- 221# GLX_DEFINES_TYPE_GLXextFuncPtr 222# ----------------------------------------------------------------------------- 223CHECK_C_SOURCE_COMPILES( 224" 225#define GLX_GLXEXT_LEGACY 226#include <GL/glx.h> 227int main() 228{ 229 __GLXextFuncPtr f; 230 return 0; 231} 232" 233GLX_DEFINES_TYPE_GLXextFuncPtr) 234 235# ----------------------------------------------------------------------------- 236# GLX_DEFINES_TYPE_GLXextFuncPtr_AS_EMPTY 237# ----------------------------------------------------------------------------- 238CHECK_C_SOURCE_COMPILES( 239" 240#define GLX_GLXEXT_LEGACY 241#include <GL/glx.h> 242int main() 243{ 244 __GLXextFuncPtr f; 245 int x; 246 f(x); /* fails if prototype is void, pass if prototype is empty. */ 247 248 return 0; 249} 250" 251GLX_DEFINES_TYPE_GLXextFuncPtr_AS_EMPTY) 252 253# ----------------------------------------------------------------------------- 254# GLX_DECLARES_FUNCTION_glXGetProcAddressARB 255# ----------------------------------------------------------------------------- 256CHECK_C_SOURCE_COMPILES( 257" 258#define GLX_GLXEXT_LEGACY 259#include <GL/glx.h> 260int main() 261{ 262 glXGetProcAddressARB((const GLubyte *)(\"aRandomFunction\")); 263 return 0; 264} 265" 266GLX_DECLARES_FUNCTION_glXGetProcAddressARB) 267 268 269# ----------------------------------------------------------------------------- 270# GLX_DECLARES_FUNCTION_glXGetProcAddress 271# ----------------------------------------------------------------------------- 272CHECK_C_SOURCE_COMPILES( 273" 274#define GLX_GLXEXT_LEGACY 275#include <GL/glx.h> 276int main() 277{ 278 glXGetProcAddress((const GLubyte *)(\"aRandomFunction\")); 279 return 0; 280} 281" 282GLX_DECLARES_FUNCTION_glXGetProcAddress) 283 284# ----------------------------------------------------------------------------- 285# GLX_DECLARES_FUNCTION_glXGetProcAddressARB_AS_EMPTY 286# ----------------------------------------------------------------------------- 287CHECK_C_SOURCE_COMPILES( 288" 289#define GLX_GLXEXT_LEGACY 290#include <GL/glx.h> 291int main() 292{ 293 int x; 294 /* fails if prototype is void, pass if prototype is empty. */ 295 glXGetProcAddressARB((const GLubyte *)(\"aRandomFunction\"))(x); 296 return 0; 297} 298" 299GLX_DECLARES_FUNCTION_glXGetProcAddressARB_AS_EMPTY) 300 301# ----------------------------------------------------------------------------- 302# GLX_DECLARES_FUNCTION_glXGetProcAddress_AS_EMPTY 303# ----------------------------------------------------------------------------- 304CHECK_C_SOURCE_COMPILES( 305" 306#define GLX_GLXEXT_LEGACY 307#include <GL/glx.h> 308int main() 309{ 310 int x; 311 /* fails if prototype is void, pass if prototype is empty. */ 312 glXGetProcAddress((const GLubyte *)(\"aRandomFunction\"))(x); 313 return 0; 314} 315" 316GLX_DECLARES_FUNCTION_glXGetProcAddress_AS_EMPTY) 317 318# ----------------------------------------------------------------------------- 319# GLX_DEFINES_TYPE_GLXFBConfig 320# ----------------------------------------------------------------------------- 321 322CHECK_C_SOURCE_COMPILES( 323" 324#define GLX_GLXEXT_LEGACY 325#include <GL/glx.h> 326int main() 327{ 328 GLXFBConfig c; 329 return 0; 330} 331" 332GLX_DEFINES_TYPE_GLXFBConfig) 333 334set(CMAKE_REQUIRED_INCLUDES "${SAVE_CMAKE_REQUIRED_INCLUDES}") 335set(CMAKE_REQUIRED_LIBRARIES "${SAVE_CMAKE_REQUIRED_LIBRARIES}") 336 337 338# ----------------------------------------------------------------------------- 339# cmake macro debugging 340if(${REPORT_STATUS}) 341 message(STATUS "GLX_DEFINES_MACRO_GLX_VERSION_1_1=${GLX_DEFINES_MACRO_GLX_VERSION_1_1}") 342 message(STATUS "GLX_DEFINES_MACRO_GLX_VERSION_1_2=${GLX_DEFINES_MACRO_GLX_VERSION_1_2}") 343 message(STATUS "GLX_DEFINES_MACRO_GLX_VERSION_1_3=${GLX_DEFINES_MACRO_GLX_VERSION_1_3}") 344 message(STATUS "GLX_DEFINES_MACRO_GLX_VERSION_1_4=${GLX_DEFINES_MACRO_GLX_VERSION_1_4}") 345 message(STATUS "GLX_DEFINES_MACRO_GLX_ARB_get_proc_address=${GLX_DEFINES_MACRO_GLX_ARB_get_proc_address}") 346 message(STATUS "GLX_INCLUDES_GLXEXT=${GLX_INCLUDES_GLXEXT}") 347 message(STATUS "GLX_USES_MACRO_GLX_GLXEXT_LEGACY=${GLX_USES_MACRO_GLX_GLXEXT_LEGACY}") 348 message(STATUS "GLX_DEFINES_TYPE_GLXextFuncPtr=${GLX_DEFINES_TYPE_GLXextFuncPtr}") 349 message(STATUS "GLX_DEFINES_TYPE_GLXextFuncPtr_AS_EMPTY=${GLX_DEFINES_TYPE_GLXextFuncPtr_AS_EMPTY}") 350 message(STATUS "GLX_DECLARES_FUNCTION_glXGetProcAddressARB=${GLX_DECLARES_FUNCTION_glXGetProcAddressARB}") 351 message(STATUS "GLX_DECLARES_FUNCTION_glXGetProcAddress=${GLX_DECLARES_FUNCTION_glXGetProcAddress}") 352 message(STATUS "GLX_DECLARES_FUNCTION_glXGetProcAddressARB_AS_EMPTY=${GLX_DECLARES_FUNCTION_glXGetProcAddressARB_AS_EMPTY}") 353 message(STATUS "GLX_DECLARES_FUNCTION_glXGetProcAddress_AS_EMPTY=${GLX_DECLARES_FUNCTION_glXGetProcAddress_AS_EMPTY}") 354 message(STATUS "GLX_DEFINES_TYPE_GLXFBConfig=${GLX_DEFINES_TYPE_GLXFBConfig}") 355endif() 356#message("vtkTestGLX.cmake last line.") 357