1 # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 # file Copyright.txt or https://cmake.org/licensing for details.
4 #[=======================================================================[.rst:
8 Find the OpenGL Extension Wrangler Library (GLEW)
13 The following variables may be set to influence this module's behavior:
15 ``GLEW_USE_STATIC_LIBS``
16 to find and create :prop_tgt:`IMPORTED` target for static linkage.
19 to output a detailed log of this module.
26 This module defines the following :ref:`Imported Targets <Imported Targets>`:
30 The GLEW shared library.
32 The GLEW static library, if ``GLEW_USE_STATIC_LIBS`` is set to ``TRUE``.
34 Duplicates either ``GLEW::glew`` or ``GLEW::glew_s`` based on availability.
39 This module defines the following variables:
42 include directories for GLEW
44 libraries to link against GLEW
45 ``GLEW_SHARED_LIBRARIES``
46 libraries to link against shared GLEW
47 ``GLEW_STATIC_LIBRARIES``
48 libraries to link against static GLEW
50 true if GLEW has been found and can be used
53 ``GLEW_VERSION_MAJOR``
55 ``GLEW_VERSION_MINOR``
57 ``GLEW_VERSION_MICRO``
61 Debug and Release variants are found separately.
63 #]=======================================================================]
65 include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
66 include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
68 find_package(GLEW CONFIG QUIET)
71 find_package_handle_standard_args(GLEW DEFAULT_MSG GLEW_CONFIG)
72 get_target_property(GLEW_INCLUDE_DIRS GLEW::GLEW INTERFACE_INCLUDE_DIRECTORIES)
73 set(GLEW_INCLUDE_DIR ${GLEW_INCLUDE_DIRS})
74 get_target_property(_GLEW_DEFS GLEW::GLEW INTERFACE_COMPILE_DEFINITIONS)
75 if("${_GLEW_DEFS}" MATCHES "GLEW_STATIC")
76 get_target_property(GLEW_LIBRARY_DEBUG GLEW::GLEW IMPORTED_LOCATION_DEBUG)
77 get_target_property(GLEW_LIBRARY_RELEASE GLEW::GLEW IMPORTED_LOCATION_RELEASE)
79 get_target_property(GLEW_LIBRARY_DEBUG GLEW::GLEW IMPORTED_IMPLIB_DEBUG)
80 get_target_property(GLEW_LIBRARY_RELEASE GLEW::GLEW IMPORTED_IMPLIB_RELEASE)
82 get_target_property(_GLEW_LINK_INTERFACE GLEW::GLEW IMPORTED_LINK_INTERFACE_LIBRARIES_RELEASE) # same for debug and release
83 list(APPEND GLEW_LIBRARIES ${_GLEW_LINK_INTERFACE})
84 list(APPEND GLEW_LIBRARY ${_GLEW_LINK_INTERFACE})
85 select_library_configurations(GLEW)
86 if("${_GLEW_DEFS}" MATCHES "GLEW_STATIC")
87 set(GLEW_STATIC_LIBRARIES ${GLEW_LIBRARIES})
89 set(GLEW_SHARED_LIBRARIES ${GLEW_LIBRARIES})
92 unset(_GLEW_LINK_INTERFACE)
94 unset(GLEW_LIBRARY_DEBUG)
95 unset(GLEW_LIBRARY_RELEASE)
100 message(STATUS "FindGLEW: did not find GLEW CMake config file. Searching for libraries.")
104 find_package(OpenGL QUIET)
108 message(STATUS "FindGLEW: Found OpenGL Framework.")
109 message(STATUS "FindGLEW: OPENGL_LIBRARIES: ${OPENGL_LIBRARIES}")
113 message(STATUS "FindGLEW: could not find GLEW library.")
120 function(__glew_set_find_library_suffix shared_or_static)
121 if((UNIX AND NOT APPLE) AND "${shared_or_static}" MATCHES "SHARED")
122 set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" PARENT_SCOPE)
123 elseif((UNIX AND NOT APPLE) AND "${shared_or_static}" MATCHES "STATIC")
124 set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" PARENT_SCOPE)
125 elseif(APPLE AND "${shared_or_static}" MATCHES "SHARED")
126 set(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib;.so" PARENT_SCOPE)
127 elseif(APPLE AND "${shared_or_static}" MATCHES "STATIC")
128 set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" PARENT_SCOPE)
129 elseif(WIN32 AND "${shared_or_static}" MATCHES "SHARED")
130 set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib" PARENT_SCOPE)
131 elseif(WIN32 AND "${shared_or_static}" MATCHES "STATIC")
132 set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib;.dll.a" PARENT_SCOPE)
136 message(STATUS "FindGLEW: CMAKE_FIND_LIBRARY_SUFFIXES for ${shared_or_static}: ${CMAKE_FIND_LIBRARY_SUFFIXES}")
142 if(DEFINED GLEW_USE_STATIC_LIBS)
143 message(STATUS "FindGLEW: GLEW_USE_STATIC_LIBS: ${GLEW_USE_STATIC_LIBS}.")
145 message(STATUS "FindGLEW: GLEW_USE_STATIC_LIBS is undefined. Treated as FALSE.")
149 find_path(GLEW_INCLUDE_DIR GL/glew.h)
150 mark_as_advanced(GLEW_INCLUDE_DIR)
152 set(GLEW_INCLUDE_DIRS ${GLEW_INCLUDE_DIR})
155 message(STATUS "FindGLEW: GLEW_INCLUDE_DIR: ${GLEW_INCLUDE_DIR}")
156 message(STATUS "FindGLEW: GLEW_INCLUDE_DIRS: ${GLEW_INCLUDE_DIRS}")
159 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
165 set(__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
167 __glew_set_find_library_suffix(SHARED)
169 find_library(GLEW_SHARED_LIBRARY_RELEASE
170 NAMES GLEW glew glew32
172 PATH_SUFFIXES lib lib64 libx32 lib/Release/${_arch}
175 find_library(GLEW_SHARED_LIBRARY_DEBUG
176 NAMES GLEWd glewd glew32d
178 PATH_SUFFIXES lib lib64
182 __glew_set_find_library_suffix(STATIC)
184 find_library(GLEW_STATIC_LIBRARY_RELEASE
185 NAMES GLEW glew glew32s
187 PATH_SUFFIXES lib lib64 libx32 lib/Release/${_arch}
190 find_library(GLEW_STATIC_LIBRARY_DEBUG
191 NAMES GLEWds glewds glew32ds
193 PATH_SUFFIXES lib lib64
196 set(CMAKE_FIND_LIBRARY_SUFFIXES ${__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES})
197 unset(__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES)
199 select_library_configurations(GLEW_SHARED)
200 select_library_configurations(GLEW_STATIC)
202 if(NOT GLEW_USE_STATIC_LIBS)
203 set(GLEW_LIBRARIES ${GLEW_SHARED_LIBRARY})
205 set(GLEW_LIBRARIES ${GLEW_STATIC_LIBRARY})
210 message(STATUS "FindGLEW: GLEW_SHARED_LIBRARY_RELEASE: ${GLEW_SHARED_LIBRARY_RELEASE}")
211 message(STATUS "FindGLEW: GLEW_STATIC_LIBRARY_RELEASE: ${GLEW_STATIC_LIBRARY_RELEASE}")
212 message(STATUS "FindGLEW: GLEW_SHARED_LIBRARY_DEBUG: ${GLEW_SHARED_LIBRARY_DEBUG}")
213 message(STATUS "FindGLEW: GLEW_STATIC_LIBRARY_DEBUG: ${GLEW_STATIC_LIBRARY_DEBUG}")
214 message(STATUS "FindGLEW: GLEW_SHARED_LIBRARY: ${GLEW_SHARED_LIBRARY}")
215 message(STATUS "FindGLEW: GLEW_STATIC_LIBRARY: ${GLEW_STATIC_LIBRARY}")
216 message(STATUS "FindGLEW: GLEW_LIBRARIES: ${GLEW_LIBRARIES}")
220 # Read version from GL/glew.h file
221 if(EXISTS "${GLEW_INCLUDE_DIR}/GL/glew.h")
222 file(STRINGS "${GLEW_INCLUDE_DIR}/GL/glew.h" _contents REGEX "^VERSION_.+ [0-9]+")
224 string(REGEX REPLACE ".*VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" GLEW_VERSION_MAJOR "${_contents}")
225 string(REGEX REPLACE ".*VERSION_MINOR[ \t]+([0-9]+).*" "\\1" GLEW_VERSION_MINOR "${_contents}")
226 string(REGEX REPLACE ".*VERSION_MICRO[ \t]+([0-9]+).*" "\\1" GLEW_VERSION_MICRO "${_contents}")
227 set(GLEW_VERSION "${GLEW_VERSION_MAJOR}.${GLEW_VERSION_MINOR}.${GLEW_VERSION_MICRO}")
232 message(STATUS "FindGLEW: GLEW_VERSION_MAJOR: ${GLEW_VERSION_MAJOR}")
233 message(STATUS "FindGLEW: GLEW_VERSION_MINOR: ${GLEW_VERSION_MINOR}")
234 message(STATUS "FindGLEW: GLEW_VERSION_MICRO: ${GLEW_VERSION_MICRO}")
235 message(STATUS "FindGLEW: GLEW_VERSION: ${GLEW_VERSION}")
238 find_package_handle_standard_args(GLEW
239 REQUIRED_VARS GLEW_INCLUDE_DIRS GLEW_LIBRARIES
240 VERSION_VAR GLEW_VERSION)
244 message(STATUS "FindGLEW: could not find GLEW library.")
250 if(NOT TARGET GLEW::glew AND NOT GLEW_USE_STATIC_LIBS)
252 message(STATUS "FindGLEW: Creating GLEW::glew imported target.")
255 add_library(GLEW::glew UNKNOWN IMPORTED)
257 set_target_properties(GLEW::glew
258 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
261 set_target_properties(GLEW::glew
262 PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
265 if(GLEW_SHARED_LIBRARY_RELEASE)
266 set_property(TARGET GLEW::glew
268 PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
270 set_target_properties(GLEW::glew
271 PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_SHARED_LIBRARY_RELEASE}")
274 if(GLEW_SHARED_LIBRARY_DEBUG)
275 set_property(TARGET GLEW::glew
277 PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
279 set_target_properties(GLEW::glew
280 PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_SHARED_LIBRARY_DEBUG}")
283 elseif(NOT TARGET GLEW::glew_s AND GLEW_USE_STATIC_LIBS)
285 message(STATUS "FindGLEW: Creating GLEW::glew_s imported target.")
288 add_library(GLEW::glew_s UNKNOWN IMPORTED)
290 set_target_properties(GLEW::glew_s
291 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
294 set_target_properties(GLEW::glew_s
295 PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
298 if(GLEW_STATIC_LIBRARY_RELEASE)
299 set_property(TARGET GLEW::glew_s
301 PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
303 set_target_properties(GLEW::glew_s
304 PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_STATIC_LIBRARY_RELEASE}")
307 if(GLEW_STATIC_LIBRARY_DEBUG)
308 set_property(TARGET GLEW::glew_s
310 PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
312 set_target_properties(GLEW::glew_s
313 PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_STATIC_LIBRARY_DEBUG}")
317 if(NOT TARGET GLEW::GLEW)
319 message(STATUS "FindGLEW: Creating GLEW::GLEW imported target.")
322 add_library(GLEW::GLEW UNKNOWN IMPORTED)
324 set_target_properties(GLEW::GLEW
325 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
328 set_target_properties(GLEW::GLEW
329 PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
332 if(TARGET GLEW::glew)
333 if(GLEW_SHARED_LIBRARY_RELEASE)
334 set_property(TARGET GLEW::GLEW
336 PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
338 set_target_properties(GLEW::GLEW
339 PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_SHARED_LIBRARY_RELEASE}")
342 if(GLEW_SHARED_LIBRARY_DEBUG)
343 set_property(TARGET GLEW::GLEW
345 PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
347 set_target_properties(GLEW::GLEW
348 PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_SHARED_LIBRARY_DEBUG}")
351 elseif(TARGET GLEW::glew_s)
352 if(GLEW_STATIC_LIBRARY_RELEASE)
353 set_property(TARGET GLEW::GLEW
355 PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
357 set_target_properties(GLEW::GLEW
358 PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_STATIC_LIBRARY_RELEASE}")
361 if(GLEW_STATIC_LIBRARY_DEBUG AND GLEW_USE_STATIC_LIBS)
362 set_property(TARGET GLEW::GLEW
364 PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
366 set_target_properties(GLEW::GLEW
367 PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_STATIC_LIBRARY_DEBUG}")
371 message(WARNING "FindGLEW: no `GLEW::glew` or `GLEW::glew_s` target was created. Something went wrong in FindGLEW target creation.")