Imported Upstream version 3.25.0
[platform/upstream/cmake.git] / Modules / FindGLEW.cmake
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:
5 FindGLEW
6 --------
7
8 Find the OpenGL Extension Wrangler Library (GLEW)
9
10 Input Variables
11 ^^^^^^^^^^^^^^^
12
13 The 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
21 Imported Targets
22 ^^^^^^^^^^^^^^^^
23
24 .. versionadded:: 3.1
25
26 This 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
36 Result Variables
37 ^^^^^^^^^^^^^^^^
38
39 This 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
65 include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
66 include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
67
68 find_package(GLEW CONFIG QUIET)
69
70 if(GLEW_FOUND)
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)
78   else()
79     get_target_property(GLEW_LIBRARY_DEBUG GLEW::GLEW IMPORTED_IMPLIB_DEBUG)
80     get_target_property(GLEW_LIBRARY_RELEASE GLEW::GLEW IMPORTED_IMPLIB_RELEASE)
81   endif()
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})
88   else()
89     set(GLEW_SHARED_LIBRARIES ${GLEW_LIBRARIES})
90   endif()
91   unset(_GLEW_DEFS)
92   unset(_GLEW_LINK_INTERFACE)
93   unset(GLEW_LIBRARY)
94   unset(GLEW_LIBRARY_DEBUG)
95   unset(GLEW_LIBRARY_RELEASE)
96   return()
97 endif()
98
99 if(GLEW_VERBOSE)
100   message(STATUS "FindGLEW: did not find GLEW CMake config file. Searching for libraries.")
101 endif()
102
103 if(APPLE)
104   find_package(OpenGL QUIET)
105
106   if(OpenGL_FOUND)
107     if(GLEW_VERBOSE)
108       message(STATUS "FindGLEW: Found OpenGL Framework.")
109       message(STATUS "FindGLEW: OPENGL_LIBRARIES: ${OPENGL_LIBRARIES}")
110     endif()
111   else()
112     if(GLEW_VERBOSE)
113       message(STATUS "FindGLEW: could not find GLEW library.")
114     endif()
115     return()
116   endif()
117 endif()
118
119
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)
133   endif()
134
135   if(GLEW_VERBOSE)
136     message(STATUS "FindGLEW: CMAKE_FIND_LIBRARY_SUFFIXES for ${shared_or_static}: ${CMAKE_FIND_LIBRARY_SUFFIXES}")
137   endif()
138 endfunction()
139
140
141 if(GLEW_VERBOSE)
142   if(DEFINED GLEW_USE_STATIC_LIBS)
143     message(STATUS "FindGLEW: GLEW_USE_STATIC_LIBS: ${GLEW_USE_STATIC_LIBS}.")
144   else()
145     message(STATUS "FindGLEW: GLEW_USE_STATIC_LIBS is undefined. Treated as FALSE.")
146   endif()
147 endif()
148
149 find_path(GLEW_INCLUDE_DIR GL/glew.h)
150 mark_as_advanced(GLEW_INCLUDE_DIR)
151
152 set(GLEW_INCLUDE_DIRS ${GLEW_INCLUDE_DIR})
153
154 if(GLEW_VERBOSE)
155   message(STATUS "FindGLEW: GLEW_INCLUDE_DIR: ${GLEW_INCLUDE_DIR}")
156   message(STATUS "FindGLEW: GLEW_INCLUDE_DIRS: ${GLEW_INCLUDE_DIRS}")
157 endif()
158
159 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
160   set(_arch "x64")
161 else()
162   set(_arch "Win32")
163 endif()
164
165 set(__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
166
167 __glew_set_find_library_suffix(SHARED)
168
169 find_library(GLEW_SHARED_LIBRARY_RELEASE
170              NAMES GLEW glew glew32
171              NAMES_PER_DIR
172              PATH_SUFFIXES lib lib64 libx32 lib/Release/${_arch}
173              PATHS ENV GLEW_ROOT)
174
175 find_library(GLEW_SHARED_LIBRARY_DEBUG
176              NAMES GLEWd glewd glew32d
177              NAMES_PER_DIR
178              PATH_SUFFIXES lib lib64
179              PATHS ENV GLEW_ROOT)
180
181
182 __glew_set_find_library_suffix(STATIC)
183
184 find_library(GLEW_STATIC_LIBRARY_RELEASE
185              NAMES GLEW glew glew32s
186              NAMES_PER_DIR
187              PATH_SUFFIXES lib lib64 libx32 lib/Release/${_arch}
188              PATHS ENV GLEW_ROOT)
189
190 find_library(GLEW_STATIC_LIBRARY_DEBUG
191              NAMES GLEWds glewds glew32ds
192              NAMES_PER_DIR
193              PATH_SUFFIXES lib lib64
194              PATHS ENV GLEW_ROOT)
195
196 set(CMAKE_FIND_LIBRARY_SUFFIXES ${__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES})
197 unset(__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES)
198
199 select_library_configurations(GLEW_SHARED)
200 select_library_configurations(GLEW_STATIC)
201
202 if(NOT GLEW_USE_STATIC_LIBS)
203   set(GLEW_LIBRARIES ${GLEW_SHARED_LIBRARY})
204 else()
205   set(GLEW_LIBRARIES ${GLEW_STATIC_LIBRARY})
206 endif()
207
208
209 if(GLEW_VERBOSE)
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}")
217 endif()
218
219
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]+")
223   if(_contents)
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}")
228   endif()
229 endif()
230
231 if(GLEW_VERBOSE)
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}")
236 endif()
237
238 find_package_handle_standard_args(GLEW
239                                   REQUIRED_VARS GLEW_INCLUDE_DIRS GLEW_LIBRARIES
240                                   VERSION_VAR GLEW_VERSION)
241
242 if(NOT GLEW_FOUND)
243   if(GLEW_VERBOSE)
244     message(STATUS "FindGLEW: could not find GLEW library.")
245   endif()
246   return()
247 endif()
248
249
250 if(NOT TARGET GLEW::glew AND NOT GLEW_USE_STATIC_LIBS)
251   if(GLEW_VERBOSE)
252     message(STATUS "FindGLEW: Creating GLEW::glew imported target.")
253   endif()
254
255   add_library(GLEW::glew UNKNOWN IMPORTED)
256
257   set_target_properties(GLEW::glew
258                         PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
259
260   if(APPLE)
261     set_target_properties(GLEW::glew
262                           PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
263   endif()
264
265   if(GLEW_SHARED_LIBRARY_RELEASE)
266     set_property(TARGET GLEW::glew
267                  APPEND
268                  PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
269
270     set_target_properties(GLEW::glew
271                           PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_SHARED_LIBRARY_RELEASE}")
272   endif()
273
274   if(GLEW_SHARED_LIBRARY_DEBUG)
275     set_property(TARGET GLEW::glew
276                  APPEND
277                  PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
278
279     set_target_properties(GLEW::glew
280                           PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_SHARED_LIBRARY_DEBUG}")
281   endif()
282
283 elseif(NOT TARGET GLEW::glew_s AND GLEW_USE_STATIC_LIBS)
284   if(GLEW_VERBOSE)
285     message(STATUS "FindGLEW: Creating GLEW::glew_s imported target.")
286   endif()
287
288   add_library(GLEW::glew_s UNKNOWN IMPORTED)
289
290   set_target_properties(GLEW::glew_s
291                         PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
292
293   if(APPLE)
294     set_target_properties(GLEW::glew_s
295                           PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
296   endif()
297
298   if(GLEW_STATIC_LIBRARY_RELEASE)
299     set_property(TARGET GLEW::glew_s
300                  APPEND
301                  PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
302
303     set_target_properties(GLEW::glew_s
304                           PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_STATIC_LIBRARY_RELEASE}")
305   endif()
306
307   if(GLEW_STATIC_LIBRARY_DEBUG)
308     set_property(TARGET GLEW::glew_s
309                  APPEND
310                  PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
311
312     set_target_properties(GLEW::glew_s
313                           PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_STATIC_LIBRARY_DEBUG}")
314   endif()
315 endif()
316
317 if(NOT TARGET GLEW::GLEW)
318   if(GLEW_VERBOSE)
319     message(STATUS "FindGLEW: Creating GLEW::GLEW imported target.")
320   endif()
321
322   add_library(GLEW::GLEW UNKNOWN IMPORTED)
323
324   set_target_properties(GLEW::GLEW
325                         PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
326
327   if(APPLE)
328     set_target_properties(GLEW::GLEW
329                           PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
330   endif()
331
332   if(TARGET GLEW::glew)
333     if(GLEW_SHARED_LIBRARY_RELEASE)
334       set_property(TARGET GLEW::GLEW
335                    APPEND
336                    PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
337
338       set_target_properties(GLEW::GLEW
339                             PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_SHARED_LIBRARY_RELEASE}")
340     endif()
341
342     if(GLEW_SHARED_LIBRARY_DEBUG)
343       set_property(TARGET GLEW::GLEW
344                    APPEND
345                    PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
346
347       set_target_properties(GLEW::GLEW
348                             PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_SHARED_LIBRARY_DEBUG}")
349     endif()
350
351   elseif(TARGET GLEW::glew_s)
352     if(GLEW_STATIC_LIBRARY_RELEASE)
353       set_property(TARGET GLEW::GLEW
354                    APPEND
355                    PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
356
357       set_target_properties(GLEW::GLEW
358                             PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_STATIC_LIBRARY_RELEASE}")
359     endif()
360
361     if(GLEW_STATIC_LIBRARY_DEBUG AND GLEW_USE_STATIC_LIBS)
362       set_property(TARGET GLEW::GLEW
363                    APPEND
364                    PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
365
366       set_target_properties(GLEW::GLEW
367                             PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_STATIC_LIBRARY_DEBUG}")
368     endif()
369
370   elseif(GLEW_VERBOSE)
371     message(WARNING "FindGLEW: no `GLEW::glew` or `GLEW::glew_s` target was created. Something went wrong in FindGLEW target creation.")
372   endif()
373 endif()