Merge topic 'cuda_add_12.8_new_sm_support'
[kiteware-cmake.git] / Modules / FindGLEW.cmake
blob59c9b33b5c95064af15a57227c2db5c0ea8f9f5b
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:
5 FindGLEW
6 --------
8 Find the OpenGL Extension Wrangler Library (GLEW)
10 Input Variables
11 ^^^^^^^^^^^^^^^
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.
18 ``GLEW_VERBOSE``
19   to output a detailed log of this module.
21 Imported Targets
22 ^^^^^^^^^^^^^^^^
24 .. versionadded:: 3.1
26 This module defines the following :ref:`Imported Targets <Imported Targets>`:
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.
36 Result Variables
37 ^^^^^^^^^^^^^^^^
39 This module defines the following variables:
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
60 .. versionadded:: 3.7
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)
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()
99 if(GLEW_VERBOSE)
100   message(STATUS "FindGLEW: did not find GLEW CMake config file. Searching for libraries.")
101 endif()
103 if(APPLE)
104   find_package(OpenGL QUIET)
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()
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)
137   endif()
139   if(GLEW_VERBOSE)
140     message(STATUS "FindGLEW: CMAKE_FIND_LIBRARY_SUFFIXES for ${shared_or_static}: ${CMAKE_FIND_LIBRARY_SUFFIXES}")
141   endif()
142 endfunction()
145 if(GLEW_VERBOSE)
146   if(DEFINED GLEW_USE_STATIC_LIBS)
147     message(STATUS "FindGLEW: GLEW_USE_STATIC_LIBS: ${GLEW_USE_STATIC_LIBS}.")
148   else()
149     message(STATUS "FindGLEW: GLEW_USE_STATIC_LIBS is undefined. Treated as FALSE.")
150   endif()
151 endif()
153 find_path(GLEW_INCLUDE_DIR GL/glew.h)
154 mark_as_advanced(GLEW_INCLUDE_DIR)
156 set(GLEW_INCLUDE_DIRS ${GLEW_INCLUDE_DIR})
158 if(GLEW_VERBOSE)
159   message(STATUS "FindGLEW: GLEW_INCLUDE_DIR: ${GLEW_INCLUDE_DIR}")
160   message(STATUS "FindGLEW: GLEW_INCLUDE_DIRS: ${GLEW_INCLUDE_DIRS}")
161 endif()
163 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
164   set(_arch "x64")
165 else()
166   set(_arch "Win32")
167 endif()
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
175              NAMES_PER_DIR
176              PATH_SUFFIXES lib lib64 libx32 lib/Release/${_arch}
177              PATHS ENV GLEW_ROOT)
179 find_library(GLEW_SHARED_LIBRARY_DEBUG
180              NAMES GLEWd glewd glew32d
181              NAMES_PER_DIR
182              PATH_SUFFIXES lib lib64
183              PATHS ENV GLEW_ROOT)
186 __glew_set_find_library_suffix(STATIC)
188 find_library(GLEW_STATIC_LIBRARY_RELEASE
189              NAMES GLEW glew glew32s
190              NAMES_PER_DIR
191              PATH_SUFFIXES lib lib64 libx32 lib/Release/${_arch}
192              PATHS ENV GLEW_ROOT)
194 find_library(GLEW_STATIC_LIBRARY_DEBUG
195              NAMES GLEWds glewds glew32ds
196              NAMES_PER_DIR
197              PATH_SUFFIXES lib lib64
198              PATHS ENV GLEW_ROOT)
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})
208 else()
209   set(GLEW_LIBRARIES ${GLEW_STATIC_LIBRARY})
210 endif()
213 if(GLEW_VERBOSE)
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}")
221 endif()
224 # Read version from GL/glew.h file
225 if(EXISTS "${GLEW_INCLUDE_DIR}/GL/glew.h")
226   cmake_policy(PUSH)
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]+")
229   cmake_policy(POP)
230   if(_contents)
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}")
235   endif()
236 endif()
238 if(GLEW_VERBOSE)
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}")
243 endif()
245 find_package_handle_standard_args(GLEW
246                                   REQUIRED_VARS GLEW_INCLUDE_DIRS GLEW_LIBRARIES
247                                   VERSION_VAR GLEW_VERSION)
249 if(NOT GLEW_FOUND)
250   if(GLEW_VERBOSE)
251     message(STATUS "FindGLEW: could not find GLEW library.")
252   endif()
253   return()
254 endif()
257 if(NOT TARGET GLEW::glew AND NOT GLEW_USE_STATIC_LIBS)
258   if(GLEW_VERBOSE)
259     message(STATUS "FindGLEW: Creating GLEW::glew imported target.")
260   endif()
262   add_library(GLEW::glew UNKNOWN IMPORTED)
264   set_target_properties(GLEW::glew
265                         PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
267   if(APPLE)
268     set_target_properties(GLEW::glew
269                           PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
270   endif()
272   if(GLEW_SHARED_LIBRARY_RELEASE)
273     set_property(TARGET GLEW::glew
274                  APPEND
275                  PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
277     set_target_properties(GLEW::glew
278                           PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_SHARED_LIBRARY_RELEASE}")
279   endif()
281   if(GLEW_SHARED_LIBRARY_DEBUG)
282     set_property(TARGET GLEW::glew
283                  APPEND
284                  PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
286     set_target_properties(GLEW::glew
287                           PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_SHARED_LIBRARY_DEBUG}")
288   endif()
290 elseif(NOT TARGET GLEW::glew_s AND GLEW_USE_STATIC_LIBS)
291   if(GLEW_VERBOSE)
292     message(STATUS "FindGLEW: Creating GLEW::glew_s imported target.")
293   endif()
295   add_library(GLEW::glew_s UNKNOWN IMPORTED)
297   set_target_properties(GLEW::glew_s
298                         PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
300   if(APPLE)
301     set_target_properties(GLEW::glew_s
302                           PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
303   endif()
305   if(GLEW_STATIC_LIBRARY_RELEASE)
306     set_property(TARGET GLEW::glew_s
307                  APPEND
308                  PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
310     set_target_properties(GLEW::glew_s
311                           PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_STATIC_LIBRARY_RELEASE}")
312   endif()
314   if(GLEW_STATIC_LIBRARY_DEBUG)
315     set_property(TARGET GLEW::glew_s
316                  APPEND
317                  PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
319     set_target_properties(GLEW::glew_s
320                           PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_STATIC_LIBRARY_DEBUG}")
321   endif()
322 endif()
324 if(NOT TARGET GLEW::GLEW)
325   if(GLEW_VERBOSE)
326     message(STATUS "FindGLEW: Creating GLEW::GLEW imported target.")
327   endif()
329   add_library(GLEW::GLEW UNKNOWN IMPORTED)
331   set_target_properties(GLEW::GLEW
332                         PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
334   if(APPLE)
335     set_target_properties(GLEW::GLEW
336                           PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
337   endif()
339   if(TARGET GLEW::glew)
340     if(GLEW_SHARED_LIBRARY_RELEASE)
341       set_property(TARGET GLEW::GLEW
342                    APPEND
343                    PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
345       set_target_properties(GLEW::GLEW
346                             PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_SHARED_LIBRARY_RELEASE}")
347     endif()
349     if(GLEW_SHARED_LIBRARY_DEBUG)
350       set_property(TARGET GLEW::GLEW
351                    APPEND
352                    PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
354       set_target_properties(GLEW::GLEW
355                             PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_SHARED_LIBRARY_DEBUG}")
356     endif()
358   elseif(TARGET GLEW::glew_s)
359     if(GLEW_STATIC_LIBRARY_RELEASE)
360       set_property(TARGET GLEW::GLEW
361                    APPEND
362                    PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
364       set_target_properties(GLEW::GLEW
365                             PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_STATIC_LIBRARY_RELEASE}")
366     endif()
368     if(GLEW_STATIC_LIBRARY_DEBUG AND GLEW_USE_STATIC_LIBS)
369       set_property(TARGET GLEW::GLEW
370                    APPEND
371                    PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
373       set_target_properties(GLEW::GLEW
374                             PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_STATIC_LIBRARY_DEBUG}")
375     endif()
377   elseif(GLEW_VERBOSE)
378     message(WARNING "FindGLEW: no `GLEW::glew` or `GLEW::glew_s` target was created. Something went wrong in FindGLEW target creation.")
379   endif()
380 endif()