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