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