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