Haibo Huang | 82cd051 | 2020-03-20 14:28:55 -0700 | [diff] [blame] | 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 | This 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 | |
| 34 | Result Variables |
| 35 | ^^^^^^^^^^^^^^^^ |
| 36 | |
| 37 | This 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 | |
| 60 | include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) |
| 61 | |
| 62 | find_package(GLEW CONFIG QUIET) |
| 63 | |
| 64 | if(GLEW_FOUND) |
| 65 | find_package_handle_standard_args(GLEW DEFAULT_MSG GLEW_CONFIG) |
| 66 | return() |
| 67 | endif() |
| 68 | |
| 69 | if(GLEW_VERBOSE) |
| 70 | message(STATUS "FindGLEW: did not find GLEW CMake config file. Searching for libraries.") |
| 71 | endif() |
| 72 | |
| 73 | if(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() |
| 87 | endif() |
| 88 | |
| 89 | |
| 90 | function(__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() |
| 108 | endfunction() |
| 109 | |
| 110 | |
| 111 | if(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() |
| 117 | endif() |
| 118 | |
| 119 | find_path(GLEW_INCLUDE_DIR GL/glew.h) |
| 120 | mark_as_advanced(GLEW_INCLUDE_DIR) |
| 121 | |
| 122 | set(GLEW_INCLUDE_DIRS ${GLEW_INCLUDE_DIR}) |
| 123 | |
| 124 | if(GLEW_VERBOSE) |
| 125 | message(STATUS "FindGLEW: GLEW_INCLUDE_DIR: ${GLEW_INCLUDE_DIR}") |
| 126 | message(STATUS "FindGLEW: GLEW_INCLUDE_DIRS: ${GLEW_INCLUDE_DIRS}") |
| 127 | endif() |
| 128 | |
| 129 | if("${CMAKE_GENERATOR_PLATFORM}" MATCHES "x64" OR "${CMAKE_GENERATOR}" MATCHES "Win64") |
| 130 | set(_arch "x64") |
| 131 | else() |
| 132 | set(_arch "Win32") |
| 133 | endif() |
| 134 | |
| 135 | |
| 136 | set(__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) |
| 137 | |
| 138 | __glew_set_find_library_suffix(SHARED) |
| 139 | |
| 140 | find_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 | |
| 145 | find_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 | |
| 153 | find_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 | |
| 158 | find_library(GLEW_STATIC_LIBRARY_DEBUG |
| 159 | NAMES GLEWds glewds glew32ds |
| 160 | PATH_SUFFIXES lib lib64 |
| 161 | PATHS ENV GLEW_ROOT) |
| 162 | |
| 163 | set(CMAKE_FIND_LIBRARY_SUFFIXES ${__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES}) |
| 164 | unset(__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES) |
| 165 | |
| 166 | include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake) |
| 167 | |
| 168 | select_library_configurations(GLEW_SHARED) |
| 169 | select_library_configurations(GLEW_STATIC) |
| 170 | |
| 171 | if(NOT GLEW_USE_STATIC_LIBS) |
| 172 | set(GLEW_LIBRARIES ${GLEW_SHARED_LIBRARY}) |
| 173 | else() |
| 174 | set(GLEW_LIBRARIES ${GLEW_STATIC_LIBRARY}) |
| 175 | endif() |
| 176 | |
| 177 | |
| 178 | if(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}") |
| 186 | endif() |
| 187 | |
| 188 | |
| 189 | # Read version from GL/glew.h file |
| 190 | if(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() |
| 198 | endif() |
| 199 | |
| 200 | if(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}") |
| 205 | endif() |
| 206 | |
| 207 | find_package_handle_standard_args(GLEW |
| 208 | REQUIRED_VARS GLEW_INCLUDE_DIRS GLEW_LIBRARIES |
| 209 | VERSION_VAR GLEW_VERSION) |
| 210 | |
| 211 | if(NOT GLEW_FOUND) |
| 212 | if(GLEW_VERBOSE) |
| 213 | message(STATUS "FindGLEW: could not find GLEW library.") |
| 214 | endif() |
| 215 | return() |
| 216 | endif() |
| 217 | |
| 218 | |
| 219 | if(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 | |
| 252 | elseif(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() |
| 284 | endif() |
| 285 | |
| 286 | if(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() |
| 342 | endif() |