FindGTest.cmake 12 KB

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