1# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2# file Copyright.txt or https://cmake.org/licensing for details.
3
4#[=======================================================================[.rst:
5FindGLEW
6--------
7
8Find the OpenGL Extension Wrangler Library (GLEW)
9
10Input Variables
11^^^^^^^^^^^^^^^
12
13The following variables may be set to influence this module's behavior:
14
15``GLEW_USE_STATIC_LIBS``
16  to find and create :prop_tgt:`IMPORTED` target for static linkage.
17
18``GLEW_VERBOSE``
19  to output a detailed log of this module.
20
21Imported Targets
22^^^^^^^^^^^^^^^^
23
24.. versionadded:: 3.1
25
26This module defines the following :ref:`Imported Targets <Imported Targets>`:
27
28
29``GLEW::glew``
30  The GLEW shared library.
31``GLEW::glew_s``
32  The GLEW static library, if ``GLEW_USE_STATIC_LIBS`` is set to ``TRUE``.
33``GLEW::GLEW``
34  Duplicates either ``GLEW::glew`` or ``GLEW::glew_s`` based on availability.
35
36Result Variables
37^^^^^^^^^^^^^^^^
38
39This module defines the following variables:
40
41``GLEW_INCLUDE_DIRS``
42  include directories for GLEW
43``GLEW_LIBRARIES``
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
49``GLEW_FOUND``
50  true if GLEW has been found and can be used
51``GLEW_VERSION``
52  GLEW version
53``GLEW_VERSION_MAJOR``
54  GLEW major version
55``GLEW_VERSION_MINOR``
56  GLEW minor version
57``GLEW_VERSION_MICRO``
58  GLEW micro version
59
60.. versionadded:: 3.7
61  Debug and Release variants are found separately.
62
63#]=======================================================================]
64
65include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
66
67find_package(GLEW CONFIG QUIET)
68
69if(GLEW_FOUND)
70  find_package_handle_standard_args(GLEW DEFAULT_MSG GLEW_CONFIG)
71  return()
72endif()
73
74if(GLEW_VERBOSE)
75  message(STATUS "FindGLEW: did not find GLEW CMake config file. Searching for libraries.")
76endif()
77
78if(APPLE)
79  find_package(OpenGL QUIET)
80
81  if(OpenGL_FOUND)
82    if(GLEW_VERBOSE)
83      message(STATUS "FindGLEW: Found OpenGL Framework.")
84      message(STATUS "FindGLEW: OPENGL_LIBRARIES: ${OPENGL_LIBRARIES}")
85    endif()
86  else()
87    if(GLEW_VERBOSE)
88      message(STATUS "FindGLEW: could not find GLEW library.")
89    endif()
90    return()
91  endif()
92endif()
93
94
95function(__glew_set_find_library_suffix shared_or_static)
96  if((UNIX AND NOT APPLE) AND "${shared_or_static}" MATCHES "SHARED")
97    set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" PARENT_SCOPE)
98  elseif((UNIX AND NOT APPLE) AND "${shared_or_static}" MATCHES "STATIC")
99    set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" PARENT_SCOPE)
100  elseif(APPLE AND "${shared_or_static}" MATCHES "SHARED")
101    set(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib;.so" PARENT_SCOPE)
102  elseif(APPLE AND "${shared_or_static}" MATCHES "STATIC")
103    set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" PARENT_SCOPE)
104  elseif(WIN32 AND "${shared_or_static}" MATCHES "SHARED")
105    set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib" PARENT_SCOPE)
106  elseif(WIN32 AND "${shared_or_static}" MATCHES "STATIC")
107    set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib;.dll.a" PARENT_SCOPE)
108  endif()
109
110  if(GLEW_VERBOSE)
111    message(STATUS "FindGLEW: CMAKE_FIND_LIBRARY_SUFFIXES for ${shared_or_static}: ${CMAKE_FIND_LIBRARY_SUFFIXES}")
112  endif()
113endfunction()
114
115
116if(GLEW_VERBOSE)
117  if(DEFINED GLEW_USE_STATIC_LIBS)
118    message(STATUS "FindGLEW: GLEW_USE_STATIC_LIBS: ${GLEW_USE_STATIC_LIBS}.")
119  else()
120    message(STATUS "FindGLEW: GLEW_USE_STATIC_LIBS is undefined. Treated as FALSE.")
121  endif()
122endif()
123
124find_path(GLEW_INCLUDE_DIR GL/glew.h)
125mark_as_advanced(GLEW_INCLUDE_DIR)
126
127set(GLEW_INCLUDE_DIRS ${GLEW_INCLUDE_DIR})
128
129if(GLEW_VERBOSE)
130  message(STATUS "FindGLEW: GLEW_INCLUDE_DIR: ${GLEW_INCLUDE_DIR}")
131  message(STATUS "FindGLEW: GLEW_INCLUDE_DIRS: ${GLEW_INCLUDE_DIRS}")
132endif()
133
134if(CMAKE_SIZEOF_VOID_P EQUAL 8)
135  set(_arch "x64")
136else()
137  set(_arch "Win32")
138endif()
139
140set(__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
141
142__glew_set_find_library_suffix(SHARED)
143
144find_library(GLEW_SHARED_LIBRARY_RELEASE
145             NAMES GLEW glew glew32
146             NAMES_PER_DIR
147             PATH_SUFFIXES lib lib64 libx32 lib/Release/${_arch}
148             PATHS ENV GLEW_ROOT)
149
150find_library(GLEW_SHARED_LIBRARY_DEBUG
151             NAMES GLEWd glewd glew32d
152             NAMES_PER_DIR
153             PATH_SUFFIXES lib lib64
154             PATHS ENV GLEW_ROOT)
155
156
157__glew_set_find_library_suffix(STATIC)
158
159find_library(GLEW_STATIC_LIBRARY_RELEASE
160             NAMES GLEW glew glew32s
161             NAMES_PER_DIR
162             PATH_SUFFIXES lib lib64 libx32 lib/Release/${_arch}
163             PATHS ENV GLEW_ROOT)
164
165find_library(GLEW_STATIC_LIBRARY_DEBUG
166             NAMES GLEWds glewds glew32ds
167             NAMES_PER_DIR
168             PATH_SUFFIXES lib lib64
169             PATHS ENV GLEW_ROOT)
170
171set(CMAKE_FIND_LIBRARY_SUFFIXES ${__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES})
172unset(__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES)
173
174include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
175
176select_library_configurations(GLEW_SHARED)
177select_library_configurations(GLEW_STATIC)
178
179if(NOT GLEW_USE_STATIC_LIBS)
180  set(GLEW_LIBRARIES ${GLEW_SHARED_LIBRARY})
181else()
182  set(GLEW_LIBRARIES ${GLEW_STATIC_LIBRARY})
183endif()
184
185
186if(GLEW_VERBOSE)
187  message(STATUS "FindGLEW: GLEW_SHARED_LIBRARY_RELEASE: ${GLEW_SHARED_LIBRARY_RELEASE}")
188  message(STATUS "FindGLEW: GLEW_STATIC_LIBRARY_RELEASE: ${GLEW_STATIC_LIBRARY_RELEASE}")
189  message(STATUS "FindGLEW: GLEW_SHARED_LIBRARY_DEBUG: ${GLEW_SHARED_LIBRARY_DEBUG}")
190  message(STATUS "FindGLEW: GLEW_STATIC_LIBRARY_DEBUG: ${GLEW_STATIC_LIBRARY_DEBUG}")
191  message(STATUS "FindGLEW: GLEW_SHARED_LIBRARY: ${GLEW_SHARED_LIBRARY}")
192  message(STATUS "FindGLEW: GLEW_STATIC_LIBRARY: ${GLEW_STATIC_LIBRARY}")
193  message(STATUS "FindGLEW: GLEW_LIBRARIES: ${GLEW_LIBRARIES}")
194endif()
195
196
197# Read version from GL/glew.h file
198if(EXISTS "${GLEW_INCLUDE_DIR}/GL/glew.h")
199  file(STRINGS "${GLEW_INCLUDE_DIR}/GL/glew.h" _contents REGEX "^VERSION_.+ [0-9]+")
200  if(_contents)
201    string(REGEX REPLACE ".*VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" GLEW_VERSION_MAJOR "${_contents}")
202    string(REGEX REPLACE ".*VERSION_MINOR[ \t]+([0-9]+).*" "\\1" GLEW_VERSION_MINOR "${_contents}")
203    string(REGEX REPLACE ".*VERSION_MICRO[ \t]+([0-9]+).*" "\\1" GLEW_VERSION_MICRO "${_contents}")
204    set(GLEW_VERSION "${GLEW_VERSION_MAJOR}.${GLEW_VERSION_MINOR}.${GLEW_VERSION_MICRO}")
205  endif()
206endif()
207
208if(GLEW_VERBOSE)
209  message(STATUS "FindGLEW: GLEW_VERSION_MAJOR: ${GLEW_VERSION_MAJOR}")
210  message(STATUS "FindGLEW: GLEW_VERSION_MINOR: ${GLEW_VERSION_MINOR}")
211  message(STATUS "FindGLEW: GLEW_VERSION_MICRO: ${GLEW_VERSION_MICRO}")
212  message(STATUS "FindGLEW: GLEW_VERSION: ${GLEW_VERSION}")
213endif()
214
215find_package_handle_standard_args(GLEW
216                                  REQUIRED_VARS GLEW_INCLUDE_DIRS GLEW_LIBRARIES
217                                  VERSION_VAR GLEW_VERSION)
218
219if(NOT GLEW_FOUND)
220  if(GLEW_VERBOSE)
221    message(STATUS "FindGLEW: could not find GLEW library.")
222  endif()
223  return()
224endif()
225
226
227if(NOT TARGET GLEW::glew AND NOT GLEW_USE_STATIC_LIBS)
228  if(GLEW_VERBOSE)
229    message(STATUS "FindGLEW: Creating GLEW::glew imported target.")
230  endif()
231
232  add_library(GLEW::glew UNKNOWN IMPORTED)
233
234  set_target_properties(GLEW::glew
235                        PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
236
237  if(APPLE)
238    set_target_properties(GLEW::glew
239                          PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
240  endif()
241
242  if(GLEW_SHARED_LIBRARY_RELEASE)
243    set_property(TARGET GLEW::glew
244                 APPEND
245                 PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
246
247    set_target_properties(GLEW::glew
248                          PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_SHARED_LIBRARY_RELEASE}")
249  endif()
250
251  if(GLEW_SHARED_LIBRARY_DEBUG)
252    set_property(TARGET GLEW::glew
253                 APPEND
254                 PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
255
256    set_target_properties(GLEW::glew
257                          PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_SHARED_LIBRARY_DEBUG}")
258  endif()
259
260elseif(NOT TARGET GLEW::glew_s AND GLEW_USE_STATIC_LIBS)
261  if(GLEW_VERBOSE)
262    message(STATUS "FindGLEW: Creating GLEW::glew_s imported target.")
263  endif()
264
265  add_library(GLEW::glew_s UNKNOWN IMPORTED)
266
267  set_target_properties(GLEW::glew_s
268                        PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
269
270  if(APPLE)
271    set_target_properties(GLEW::glew_s
272                          PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
273  endif()
274
275  if(GLEW_STATIC_LIBRARY_RELEASE)
276    set_property(TARGET GLEW::glew_s
277                 APPEND
278                 PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
279
280    set_target_properties(GLEW::glew_s
281                          PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_STATIC_LIBRARY_RELEASE}")
282  endif()
283
284  if(GLEW_STATIC_LIBRARY_DEBUG)
285    set_property(TARGET GLEW::glew_s
286                 APPEND
287                 PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
288
289    set_target_properties(GLEW::glew_s
290                          PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_STATIC_LIBRARY_DEBUG}")
291  endif()
292endif()
293
294if(NOT TARGET GLEW::GLEW)
295  if(GLEW_VERBOSE)
296    message(STATUS "FindGLEW: Creating GLEW::GLEW imported target.")
297  endif()
298
299  add_library(GLEW::GLEW UNKNOWN IMPORTED)
300
301  set_target_properties(GLEW::GLEW
302                        PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
303
304  if(APPLE)
305    set_target_properties(GLEW::GLEW
306                          PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
307  endif()
308
309  if(TARGET GLEW::glew)
310    if(GLEW_SHARED_LIBRARY_RELEASE)
311      set_property(TARGET GLEW::GLEW
312                   APPEND
313                   PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
314
315      set_target_properties(GLEW::GLEW
316                            PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_SHARED_LIBRARY_RELEASE}")
317    endif()
318
319    if(GLEW_SHARED_LIBRARY_DEBUG)
320      set_property(TARGET GLEW::GLEW
321                   APPEND
322                   PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
323
324      set_target_properties(GLEW::GLEW
325                            PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_SHARED_LIBRARY_DEBUG}")
326    endif()
327
328  elseif(TARGET GLEW::glew_s)
329    if(GLEW_STATIC_LIBRARY_RELEASE)
330      set_property(TARGET GLEW::GLEW
331                   APPEND
332                   PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
333
334      set_target_properties(GLEW::GLEW
335                            PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_STATIC_LIBRARY_RELEASE}")
336    endif()
337
338    if(GLEW_STATIC_LIBRARY_DEBUG AND GLEW_USE_STATIC_LIBS)
339      set_property(TARGET GLEW::GLEW
340                   APPEND
341                   PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
342
343      set_target_properties(GLEW::GLEW
344                            PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_STATIC_LIBRARY_DEBUG}")
345    endif()
346
347  elseif(GLEW_VERBOSE)
348    message(WARNING "FindGLEW: no `GLEW::glew` or `GLEW::glew_s` target was created. Something went wrong in FindGLEW target creation.")
349  endif()
350endif()
351