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: 5FindGTest 6--------- 7 8Locate the Google C++ Testing Framework. 9 10.. versionadded:: 3.20 11 Upstream ``GTestConfig.cmake`` is used if possible. 12 13Imported targets 14^^^^^^^^^^^^^^^^ 15 16.. versionadded:: 3.20 17 This module defines the following :prop_tgt:`IMPORTED` targets: 18 19``GTest::gtest`` 20 The Google Test ``gtest`` library, if found; adds Thread::Thread 21 automatically 22``GTest::gtest_main`` 23 The Google Test ``gtest_main`` library, if found 24 25.. deprecated:: 3.20 26 For backwards compatibility, this module defines additionally the 27 following deprecated :prop_tgt:`IMPORTED` targets (available since 3.5): 28 29``GTest::GTest`` 30 The Google Test ``gtest`` library, if found; adds Thread::Thread 31 automatically 32``GTest::Main`` 33 The Google Test ``gtest_main`` library, if found 34 35 36Result variables 37^^^^^^^^^^^^^^^^ 38 39This module will set the following variables in your project: 40 41``GTest_FOUND`` 42 Found the Google Testing framework 43``GTEST_INCLUDE_DIRS`` 44 the directory containing the Google Test headers 45 46The library variables below are set as normal variables. These 47contain debug/optimized keywords when a debugging library is found. 48 49``GTEST_LIBRARIES`` 50 The Google Test ``gtest`` library; note it also requires linking 51 with an appropriate thread library 52``GTEST_MAIN_LIBRARIES`` 53 The Google Test ``gtest_main`` library 54``GTEST_BOTH_LIBRARIES`` 55 Both ``gtest`` and ``gtest_main`` 56 57Cache variables 58^^^^^^^^^^^^^^^ 59 60The following cache variables may also be set: 61 62``GTEST_ROOT`` 63 The root directory of the Google Test installation (may also be 64 set as an environment variable) 65``GTEST_MSVC_SEARCH`` 66 If compiling with MSVC, this variable can be set to ``MT`` or 67 ``MD`` (the default) to enable searching a GTest build tree 68 69 70Example usage 71^^^^^^^^^^^^^ 72 73:: 74 75 enable_testing() 76 find_package(GTest REQUIRED) 77 78 add_executable(foo foo.cc) 79 target_link_libraries(foo GTest::gtest GTest::gtest_main) 80 81 add_test(AllTestsInFoo foo) 82 83 84Deeper integration with CTest 85^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 86 87See :module:`GoogleTest` for information on the :command:`gtest_add_tests` 88and :command:`gtest_discover_tests` commands. 89 90.. versionchanged:: 3.9 91 Previous CMake versions defined :command:`gtest_add_tests` macro in this 92 module. 93#]=======================================================================] 94 95include(${CMAKE_CURRENT_LIST_DIR}/GoogleTest.cmake) 96 97function(__gtest_append_debugs _endvar _library) 98 if(${_library} AND ${_library}_DEBUG) 99 set(_output optimized ${${_library}} debug ${${_library}_DEBUG}) 100 else() 101 set(_output ${${_library}}) 102 endif() 103 set(${_endvar} ${_output} PARENT_SCOPE) 104endfunction() 105 106function(__gtest_find_library _name) 107 find_library(${_name} 108 NAMES ${ARGN} 109 HINTS 110 ENV GTEST_ROOT 111 ${GTEST_ROOT} 112 PATH_SUFFIXES ${_gtest_libpath_suffixes} 113 ) 114 mark_as_advanced(${_name}) 115endfunction() 116 117macro(__gtest_determine_windows_library_type _var) 118 if(EXISTS "${${_var}}") 119 file(TO_NATIVE_PATH "${${_var}}" _lib_path) 120 get_filename_component(_name "${${_var}}" NAME_WE) 121 file(STRINGS "${${_var}}" _match REGEX "${_name}\\.dll" LIMIT_COUNT 1) 122 if(NOT _match STREQUAL "") 123 set(${_var}_TYPE SHARED PARENT_SCOPE) 124 else() 125 set(${_var}_TYPE UNKNOWN PARENT_SCOPE) 126 endif() 127 return() 128 endif() 129endmacro() 130 131function(__gtest_determine_library_type _var) 132 if(WIN32) 133 # For now, at least, only Windows really needs to know the library type 134 __gtest_determine_windows_library_type(${_var}) 135 __gtest_determine_windows_library_type(${_var}_RELEASE) 136 __gtest_determine_windows_library_type(${_var}_DEBUG) 137 endif() 138 # If we get here, no determination was made from the above checks 139 set(${_var}_TYPE UNKNOWN PARENT_SCOPE) 140endfunction() 141 142function(__gtest_import_library _target _var _config) 143 if(_config) 144 set(_config_suffix "_${_config}") 145 else() 146 set(_config_suffix "") 147 endif() 148 149 set(_lib "${${_var}${_config_suffix}}") 150 if(EXISTS "${_lib}") 151 if(_config) 152 set_property(TARGET ${_target} APPEND PROPERTY 153 IMPORTED_CONFIGURATIONS ${_config}) 154 endif() 155 set_target_properties(${_target} PROPERTIES 156 IMPORTED_LINK_INTERFACE_LANGUAGES${_config_suffix} "CXX") 157 if(WIN32 AND ${_var}_TYPE STREQUAL SHARED) 158 set_target_properties(${_target} PROPERTIES 159 IMPORTED_IMPLIB${_config_suffix} "${_lib}") 160 else() 161 set_target_properties(${_target} PROPERTIES 162 IMPORTED_LOCATION${_config_suffix} "${_lib}") 163 endif() 164 endif() 165endfunction() 166 167function(__gtest_define_backwards_compatible_library_targets) 168 set(GTEST_BOTH_LIBRARIES ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES} PARENT_SCOPE) 169 170 # Add targets mapping the same library names as defined in 171 # older versions of CMake's FindGTest 172 if(NOT TARGET GTest::GTest) 173 add_library(GTest::GTest INTERFACE IMPORTED) 174 target_link_libraries(GTest::GTest INTERFACE GTest::gtest) 175 endif() 176 if(NOT TARGET GTest::Main) 177 add_library(GTest::Main INTERFACE IMPORTED) 178 target_link_libraries(GTest::Main INTERFACE GTest::gtest_main) 179 endif() 180endfunction() 181 182# 183 184include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) 185 186# first specifically look for the CMake version of GTest 187find_package(GTest QUIET NO_MODULE) 188 189# if we found the GTest cmake package then we are done, and 190# can print what we found and return. 191if(GTest_FOUND) 192 FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTest HANDLE_COMPONENTS CONFIG_MODE) 193 194 set(GTEST_LIBRARIES GTest::gtest) 195 set(GTEST_MAIN_LIBRARIES GTest::gtest_main) 196 197 __gtest_define_backwards_compatible_library_targets() 198 199 return() 200endif() 201 202if(NOT DEFINED GTEST_MSVC_SEARCH) 203 set(GTEST_MSVC_SEARCH MD) 204endif() 205 206set(_gtest_libpath_suffixes lib) 207if(MSVC) 208 if(GTEST_MSVC_SEARCH STREQUAL "MD") 209 list(APPEND _gtest_libpath_suffixes 210 msvc/gtest-md/Debug 211 msvc/gtest-md/Release 212 msvc/x64/Debug 213 msvc/x64/Release 214 msvc/2010/gtest-md/Win32-Debug 215 msvc/2010/gtest-md/Win32-Release 216 msvc/2010/gtest-md/x64-Debug 217 msvc/2010/gtest-md/x64-Release 218 ) 219 elseif(GTEST_MSVC_SEARCH STREQUAL "MT") 220 list(APPEND _gtest_libpath_suffixes 221 msvc/gtest/Debug 222 msvc/gtest/Release 223 msvc/x64/Debug 224 msvc/x64/Release 225 msvc/2010/gtest/Win32-Debug 226 msvc/2010/gtest/Win32-Release 227 msvc/2010/gtest/x64-Debug 228 msvc/2010/gtest/x64-Release 229 ) 230 endif() 231endif() 232 233 234find_path(GTEST_INCLUDE_DIR gtest/gtest.h 235 HINTS 236 $ENV{GTEST_ROOT}/include 237 ${GTEST_ROOT}/include 238) 239mark_as_advanced(GTEST_INCLUDE_DIR) 240 241if(MSVC AND GTEST_MSVC_SEARCH STREQUAL "MD") 242 # The provided /MD project files for Google Test add -md suffixes to the 243 # library names. 244 __gtest_find_library(GTEST_LIBRARY gtest-md gtest) 245 __gtest_find_library(GTEST_LIBRARY_DEBUG gtest-mdd gtestd) 246 __gtest_find_library(GTEST_MAIN_LIBRARY gtest_main-md gtest_main) 247 __gtest_find_library(GTEST_MAIN_LIBRARY_DEBUG gtest_main-mdd gtest_maind) 248else() 249 __gtest_find_library(GTEST_LIBRARY gtest) 250 __gtest_find_library(GTEST_LIBRARY_DEBUG gtestd) 251 __gtest_find_library(GTEST_MAIN_LIBRARY gtest_main) 252 __gtest_find_library(GTEST_MAIN_LIBRARY_DEBUG gtest_maind) 253endif() 254 255FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTest DEFAULT_MSG GTEST_LIBRARY GTEST_INCLUDE_DIR GTEST_MAIN_LIBRARY) 256 257if(GTest_FOUND) 258 set(GTEST_INCLUDE_DIRS ${GTEST_INCLUDE_DIR}) 259 __gtest_append_debugs(GTEST_LIBRARIES GTEST_LIBRARY) 260 __gtest_append_debugs(GTEST_MAIN_LIBRARIES GTEST_MAIN_LIBRARY) 261 262 find_package(Threads QUIET) 263 264 if(NOT TARGET GTest::gtest) 265 __gtest_determine_library_type(GTEST_LIBRARY) 266 add_library(GTest::gtest ${GTEST_LIBRARY_TYPE} IMPORTED) 267 if(TARGET Threads::Threads) 268 set_target_properties(GTest::gtest PROPERTIES 269 INTERFACE_LINK_LIBRARIES Threads::Threads) 270 endif() 271 if(GTEST_LIBRARY_TYPE STREQUAL "SHARED") 272 set_target_properties(GTest::gtest PROPERTIES 273 INTERFACE_COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1") 274 endif() 275 if(GTEST_INCLUDE_DIRS) 276 set_target_properties(GTest::gtest PROPERTIES 277 INTERFACE_INCLUDE_DIRECTORIES "${GTEST_INCLUDE_DIRS}") 278 endif() 279 __gtest_import_library(GTest::gtest GTEST_LIBRARY "") 280 __gtest_import_library(GTest::gtest GTEST_LIBRARY "RELEASE") 281 __gtest_import_library(GTest::gtest GTEST_LIBRARY "DEBUG") 282 endif() 283 if(NOT TARGET GTest::gtest_main) 284 __gtest_determine_library_type(GTEST_MAIN_LIBRARY) 285 add_library(GTest::gtest_main ${GTEST_MAIN_LIBRARY_TYPE} IMPORTED) 286 set_target_properties(GTest::gtest_main PROPERTIES 287 INTERFACE_LINK_LIBRARIES "GTest::gtest") 288 __gtest_import_library(GTest::gtest_main GTEST_MAIN_LIBRARY "") 289 __gtest_import_library(GTest::gtest_main GTEST_MAIN_LIBRARY "RELEASE") 290 __gtest_import_library(GTest::gtest_main GTEST_MAIN_LIBRARY "DEBUG") 291 endif() 292 293 __gtest_define_backwards_compatible_library_targets() 294endif() 295