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(FindPackageHandleStandardArgs)
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 MINGW AND "${shared_or_static}" MATCHES "SHARED")
130 set(CMAKE_FIND_LIBRARY_SUFFIXES ".dll.a" PARENT_SCOPE)
131 elseif(WIN32 AND MINGW AND "${shared_or_static}" MATCHES "STATIC")
132 set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" PARENT_SCOPE)
133 elseif(WIN32 AND "${shared_or_static}" MATCHES "SHARED")
134 set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib" PARENT_SCOPE)
135 elseif(WIN32 AND "${shared_or_static}" MATCHES "STATIC")
136 set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib;.dll.a" PARENT_SCOPE)
140 message(STATUS "FindGLEW: CMAKE_FIND_LIBRARY_SUFFIXES for ${shared_or_static}: ${CMAKE_FIND_LIBRARY_SUFFIXES}")
146 if(DEFINED GLEW_USE_STATIC_LIBS)
147 message(STATUS "FindGLEW: GLEW_USE_STATIC_LIBS: ${GLEW_USE_STATIC_LIBS}.")
149 message(STATUS "FindGLEW: GLEW_USE_STATIC_LIBS is undefined. Treated as FALSE.")
153 find_path(GLEW_INCLUDE_DIR GL/glew.h)
154 mark_as_advanced(GLEW_INCLUDE_DIR)
156 set(GLEW_INCLUDE_DIRS ${GLEW_INCLUDE_DIR})
159 message(STATUS "FindGLEW: GLEW_INCLUDE_DIR: ${GLEW_INCLUDE_DIR}")
160 message(STATUS "FindGLEW: GLEW_INCLUDE_DIRS: ${GLEW_INCLUDE_DIRS}")
163 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
169 set(__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
171 __glew_set_find_library_suffix(SHARED)
173 find_library(GLEW_SHARED_LIBRARY_RELEASE
174 NAMES GLEW glew glew32
176 PATH_SUFFIXES lib lib64 libx32 lib/Release/${_arch}
179 find_library(GLEW_SHARED_LIBRARY_DEBUG
180 NAMES GLEWd glewd glew32d
182 PATH_SUFFIXES lib lib64
186 __glew_set_find_library_suffix(STATIC)
188 find_library(GLEW_STATIC_LIBRARY_RELEASE
189 NAMES GLEW glew glew32s
191 PATH_SUFFIXES lib lib64 libx32 lib/Release/${_arch}
194 find_library(GLEW_STATIC_LIBRARY_DEBUG
195 NAMES GLEWds glewds glew32ds
197 PATH_SUFFIXES lib lib64
200 set(CMAKE_FIND_LIBRARY_SUFFIXES ${__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES})
201 unset(__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES)
203 select_library_configurations(GLEW_SHARED)
204 select_library_configurations(GLEW_STATIC)
206 if(NOT GLEW_USE_STATIC_LIBS)
207 set(GLEW_LIBRARIES ${GLEW_SHARED_LIBRARY})
209 set(GLEW_LIBRARIES ${GLEW_STATIC_LIBRARY})
214 message(STATUS "FindGLEW: GLEW_SHARED_LIBRARY_RELEASE: ${GLEW_SHARED_LIBRARY_RELEASE}")
215 message(STATUS "FindGLEW: GLEW_STATIC_LIBRARY_RELEASE: ${GLEW_STATIC_LIBRARY_RELEASE}")
216 message(STATUS "FindGLEW: GLEW_SHARED_LIBRARY_DEBUG: ${GLEW_SHARED_LIBRARY_DEBUG}")
217 message(STATUS "FindGLEW: GLEW_STATIC_LIBRARY_DEBUG: ${GLEW_STATIC_LIBRARY_DEBUG}")
218 message(STATUS "FindGLEW: GLEW_SHARED_LIBRARY: ${GLEW_SHARED_LIBRARY}")
219 message(STATUS "FindGLEW: GLEW_STATIC_LIBRARY: ${GLEW_STATIC_LIBRARY}")
220 message(STATUS "FindGLEW: GLEW_LIBRARIES: ${GLEW_LIBRARIES}")
224 # Read version from GL/glew.h file
225 if(EXISTS "${GLEW_INCLUDE_DIR}/GL/glew.h")
227 cmake_policy(SET CMP0159 NEW) # file(STRINGS) with REGEX updates CMAKE_MATCH_<n>
228 file(STRINGS "${GLEW_INCLUDE_DIR}/GL/glew.h" _contents REGEX "^VERSION_.+ [0-9]+")
231 string(REGEX REPLACE ".*VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" GLEW_VERSION_MAJOR "${_contents}")
232 string(REGEX REPLACE ".*VERSION_MINOR[ \t]+([0-9]+).*" "\\1" GLEW_VERSION_MINOR "${_contents}")
233 string(REGEX REPLACE ".*VERSION_MICRO[ \t]+([0-9]+).*" "\\1" GLEW_VERSION_MICRO "${_contents}")
234 set(GLEW_VERSION "${GLEW_VERSION_MAJOR}.${GLEW_VERSION_MINOR}.${GLEW_VERSION_MICRO}")
239 message(STATUS "FindGLEW: GLEW_VERSION_MAJOR: ${GLEW_VERSION_MAJOR}")
240 message(STATUS "FindGLEW: GLEW_VERSION_MINOR: ${GLEW_VERSION_MINOR}")
241 message(STATUS "FindGLEW: GLEW_VERSION_MICRO: ${GLEW_VERSION_MICRO}")
242 message(STATUS "FindGLEW: GLEW_VERSION: ${GLEW_VERSION}")
245 find_package_handle_standard_args(GLEW
246 REQUIRED_VARS GLEW_INCLUDE_DIRS GLEW_LIBRARIES
247 VERSION_VAR GLEW_VERSION)
251 message(STATUS "FindGLEW: could not find GLEW library.")
257 if(NOT TARGET GLEW::glew AND NOT GLEW_USE_STATIC_LIBS)
259 message(STATUS "FindGLEW: Creating GLEW::glew imported target.")
262 add_library(GLEW::glew UNKNOWN IMPORTED)
264 set_target_properties(GLEW::glew
265 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
268 set_target_properties(GLEW::glew
269 PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
272 if(GLEW_SHARED_LIBRARY_RELEASE)
273 set_property(TARGET GLEW::glew
275 PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
277 set_target_properties(GLEW::glew
278 PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_SHARED_LIBRARY_RELEASE}")
281 if(GLEW_SHARED_LIBRARY_DEBUG)
282 set_property(TARGET GLEW::glew
284 PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
286 set_target_properties(GLEW::glew
287 PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_SHARED_LIBRARY_DEBUG}")
290 elseif(NOT TARGET GLEW::glew_s AND GLEW_USE_STATIC_LIBS)
292 message(STATUS "FindGLEW: Creating GLEW::glew_s imported target.")
295 add_library(GLEW::glew_s UNKNOWN IMPORTED)
297 set_target_properties(GLEW::glew_s
298 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
301 set_target_properties(GLEW::glew_s
302 PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
305 if(GLEW_STATIC_LIBRARY_RELEASE)
306 set_property(TARGET GLEW::glew_s
308 PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
310 set_target_properties(GLEW::glew_s
311 PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_STATIC_LIBRARY_RELEASE}")
314 if(GLEW_STATIC_LIBRARY_DEBUG)
315 set_property(TARGET GLEW::glew_s
317 PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
319 set_target_properties(GLEW::glew_s
320 PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_STATIC_LIBRARY_DEBUG}")
324 if(NOT TARGET GLEW::GLEW)
326 message(STATUS "FindGLEW: Creating GLEW::GLEW imported target.")
329 add_library(GLEW::GLEW UNKNOWN IMPORTED)
331 set_target_properties(GLEW::GLEW
332 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
335 set_target_properties(GLEW::GLEW
336 PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
339 if(TARGET GLEW::glew)
340 if(GLEW_SHARED_LIBRARY_RELEASE)
341 set_property(TARGET GLEW::GLEW
343 PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
345 set_target_properties(GLEW::GLEW
346 PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_SHARED_LIBRARY_RELEASE}")
349 if(GLEW_SHARED_LIBRARY_DEBUG)
350 set_property(TARGET GLEW::GLEW
352 PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
354 set_target_properties(GLEW::GLEW
355 PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_SHARED_LIBRARY_DEBUG}")
358 elseif(TARGET GLEW::glew_s)
359 if(GLEW_STATIC_LIBRARY_RELEASE)
360 set_property(TARGET GLEW::GLEW
362 PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
364 set_target_properties(GLEW::GLEW
365 PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_STATIC_LIBRARY_RELEASE}")
368 if(GLEW_STATIC_LIBRARY_DEBUG AND GLEW_USE_STATIC_LIBS)
369 set_property(TARGET GLEW::GLEW
371 PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
373 set_target_properties(GLEW::GLEW
374 PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_STATIC_LIBRARY_DEBUG}")
378 message(WARNING "FindGLEW: no `GLEW::glew` or `GLEW::glew_s` target was created. Something went wrong in FindGLEW target creation.")