FindGTest.cmake 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  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. ::
  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. file(STRINGS "${${_var}}" _match REGEX "${_name}\\.dll" LIMIT_COUNT 1)
  97. if(NOT _match STREQUAL "")
  98. set(${_var}_TYPE SHARED PARENT_SCOPE)
  99. else()
  100. set(${_var}_TYPE UNKNOWN PARENT_SCOPE)
  101. endif()
  102. return()
  103. endif()
  104. endmacro()
  105. function(__gtest_determine_library_type _var)
  106. if(WIN32)
  107. # For now, at least, only Windows really needs to know the library type
  108. __gtest_determine_windows_library_type(${_var})
  109. __gtest_determine_windows_library_type(${_var}_RELEASE)
  110. __gtest_determine_windows_library_type(${_var}_DEBUG)
  111. endif()
  112. # If we get here, no determination was made from the above checks
  113. set(${_var}_TYPE UNKNOWN PARENT_SCOPE)
  114. endfunction()
  115. function(__gtest_import_library _target _var _config)
  116. if(_config)
  117. set(_config_suffix "_${_config}")
  118. else()
  119. set(_config_suffix "")
  120. endif()
  121. set(_lib "${${_var}${_config_suffix}}")
  122. if(EXISTS "${_lib}")
  123. if(_config)
  124. set_property(TARGET ${_target} APPEND PROPERTY
  125. IMPORTED_CONFIGURATIONS ${_config})
  126. endif()
  127. set_target_properties(${_target} PROPERTIES
  128. IMPORTED_LINK_INTERFACE_LANGUAGES${_config_suffix} "CXX")
  129. if(WIN32 AND ${_var}_TYPE STREQUAL SHARED)
  130. set_target_properties(${_target} PROPERTIES
  131. IMPORTED_IMPLIB${_config_suffix} "${_lib}")
  132. else()
  133. set_target_properties(${_target} PROPERTIES
  134. IMPORTED_LOCATION${_config_suffix} "${_lib}")
  135. endif()
  136. endif()
  137. endfunction()
  138. function(__gtest_define_backwards_compatible_library_targets)
  139. set(GTEST_BOTH_LIBRARIES ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES} PARENT_SCOPE)
  140. # Add targets mapping the same library names as defined in
  141. # older versions of CMake's FindGTest
  142. if(NOT TARGET GTest::GTest)
  143. add_library(GTest::GTest INTERFACE IMPORTED)
  144. target_link_libraries(GTest::GTest INTERFACE GTest::gtest)
  145. endif()
  146. if(NOT TARGET GTest::Main)
  147. add_library(GTest::Main INTERFACE IMPORTED)
  148. target_link_libraries(GTest::Main INTERFACE GTest::gtest_main)
  149. endif()
  150. endfunction()
  151. #
  152. include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
  153. # first specifically look for the CMake version of GTest
  154. find_package(GTest QUIET NO_MODULE)
  155. # if we found the GTest cmake package then we are done, and
  156. # can print what we found and return.
  157. if(GTest_FOUND)
  158. FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTest HANDLE_COMPONENTS CONFIG_MODE)
  159. set(GTEST_LIBRARIES GTest::gtest)
  160. set(GTEST_MAIN_LIBRARIES GTest::gtest_main)
  161. __gtest_define_backwards_compatible_library_targets()
  162. return()
  163. endif()
  164. if(NOT DEFINED GTEST_MSVC_SEARCH)
  165. set(GTEST_MSVC_SEARCH MD)
  166. endif()
  167. set(_gtest_libpath_suffixes lib)
  168. if(MSVC)
  169. if(GTEST_MSVC_SEARCH STREQUAL "MD")
  170. list(APPEND _gtest_libpath_suffixes
  171. msvc/gtest-md/Debug
  172. msvc/gtest-md/Release
  173. msvc/x64/Debug
  174. msvc/x64/Release
  175. msvc/2010/gtest-md/Win32-Debug
  176. msvc/2010/gtest-md/Win32-Release
  177. msvc/2010/gtest-md/x64-Debug
  178. msvc/2010/gtest-md/x64-Release
  179. )
  180. elseif(GTEST_MSVC_SEARCH STREQUAL "MT")
  181. list(APPEND _gtest_libpath_suffixes
  182. msvc/gtest/Debug
  183. msvc/gtest/Release
  184. msvc/x64/Debug
  185. msvc/x64/Release
  186. msvc/2010/gtest/Win32-Debug
  187. msvc/2010/gtest/Win32-Release
  188. msvc/2010/gtest/x64-Debug
  189. msvc/2010/gtest/x64-Release
  190. )
  191. endif()
  192. endif()
  193. find_path(GTEST_INCLUDE_DIR gtest/gtest.h
  194. HINTS
  195. $ENV{GTEST_ROOT}/include
  196. ${GTEST_ROOT}/include
  197. )
  198. mark_as_advanced(GTEST_INCLUDE_DIR)
  199. if(MSVC AND GTEST_MSVC_SEARCH STREQUAL "MD")
  200. # The provided /MD project files for Google Test add -md suffixes to the
  201. # library names.
  202. __gtest_find_library(GTEST_LIBRARY gtest-md gtest)
  203. __gtest_find_library(GTEST_LIBRARY_DEBUG gtest-mdd gtestd)
  204. __gtest_find_library(GTEST_MAIN_LIBRARY gtest_main-md gtest_main)
  205. __gtest_find_library(GTEST_MAIN_LIBRARY_DEBUG gtest_main-mdd gtest_maind)
  206. __gtest_find_library(GMOCK_LIBRARY gmock-md gmock)
  207. __gtest_find_library(GMOCK_LIBRARY_DEBUG gmock-mdd gmockd)
  208. __gtest_find_library(GMOCK_MAIN_LIBRARY gmock_main-md gmock_main)
  209. __gtest_find_library(GMOCK_MAIN_LIBRARY_DEBUG gmock_main-mdd gmock_maind)
  210. else()
  211. __gtest_find_library(GTEST_LIBRARY gtest)
  212. __gtest_find_library(GTEST_LIBRARY_DEBUG gtestd)
  213. __gtest_find_library(GTEST_MAIN_LIBRARY gtest_main)
  214. __gtest_find_library(GTEST_MAIN_LIBRARY_DEBUG gtest_maind)
  215. __gtest_find_library(GMOCK_LIBRARY gmock)
  216. __gtest_find_library(GMOCK_LIBRARY_DEBUG gmockd)
  217. __gtest_find_library(GMOCK_MAIN_LIBRARY gmock_main)
  218. __gtest_find_library(GMOCK_MAIN_LIBRARY_DEBUG gmock_maind)
  219. endif()
  220. FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTest DEFAULT_MSG GTEST_LIBRARY GTEST_INCLUDE_DIR GTEST_MAIN_LIBRARY)
  221. if(GMOCK_LIBRARY AND GMOCK_MAIN_LIBRARY)
  222. set(GMock_FOUND True)
  223. else()
  224. set(GMock_FOUND False)
  225. endif()
  226. if(GTest_FOUND)
  227. set(GTEST_INCLUDE_DIRS ${GTEST_INCLUDE_DIR})
  228. __gtest_append_debugs(GTEST_LIBRARIES GTEST_LIBRARY)
  229. __gtest_append_debugs(GTEST_MAIN_LIBRARIES GTEST_MAIN_LIBRARY)
  230. find_package(Threads QUIET)
  231. if(NOT TARGET GTest::gtest)
  232. __gtest_determine_library_type(GTEST_LIBRARY)
  233. add_library(GTest::gtest ${GTEST_LIBRARY_TYPE} IMPORTED)
  234. if(TARGET Threads::Threads)
  235. set_target_properties(GTest::gtest PROPERTIES
  236. INTERFACE_LINK_LIBRARIES Threads::Threads)
  237. endif()
  238. if(GTEST_LIBRARY_TYPE STREQUAL "SHARED")
  239. set_target_properties(GTest::gtest PROPERTIES
  240. INTERFACE_COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1")
  241. endif()
  242. if(GTEST_INCLUDE_DIRS)
  243. set_target_properties(GTest::gtest PROPERTIES
  244. INTERFACE_INCLUDE_DIRECTORIES "${GTEST_INCLUDE_DIRS}")
  245. endif()
  246. __gtest_import_library(GTest::gtest GTEST_LIBRARY "")
  247. __gtest_import_library(GTest::gtest GTEST_LIBRARY "RELEASE")
  248. __gtest_import_library(GTest::gtest GTEST_LIBRARY "DEBUG")
  249. endif()
  250. if(NOT TARGET GTest::gtest_main)
  251. __gtest_determine_library_type(GTEST_MAIN_LIBRARY)
  252. add_library(GTest::gtest_main ${GTEST_MAIN_LIBRARY_TYPE} IMPORTED)
  253. set_target_properties(GTest::gtest_main PROPERTIES
  254. INTERFACE_LINK_LIBRARIES "GTest::gtest")
  255. __gtest_import_library(GTest::gtest_main GTEST_MAIN_LIBRARY "")
  256. __gtest_import_library(GTest::gtest_main GTEST_MAIN_LIBRARY "RELEASE")
  257. __gtest_import_library(GTest::gtest_main GTEST_MAIN_LIBRARY "DEBUG")
  258. endif()
  259. __gtest_define_backwards_compatible_library_targets()
  260. endif()
  261. if(GMock_FOUND AND GTest_FOUND)
  262. if(NOT TARGET GTest::gmock)
  263. __gtest_determine_library_type(GMOCK_LIBRARY)
  264. add_library(GTest::gmock ${GMOCK_LIBRARY_TYPE} IMPORTED)
  265. set(_gmock_link_libraries "GTest::gtest")
  266. if(TARGET Threads::Threads)
  267. list(APPEND _gmock_link_libraries Threads::Threads)
  268. endif()
  269. set_target_properties(GTest::gmock PROPERTIES
  270. INTERFACE_LINK_LIBRARIES "${_gmock_link_libraries}")
  271. if(GMOCK_LIBRARY_TYPE STREQUAL "SHARED")
  272. set_target_properties(GTest::gmock PROPERTIES
  273. INTERFACE_COMPILE_DEFINITIONS "GMOCK_LINKED_AS_SHARED_LIBRARY=1")
  274. endif()
  275. if(GTEST_INCLUDE_DIRS)
  276. set_target_properties(GTest::gmock PROPERTIES
  277. INTERFACE_INCLUDE_DIRECTORIES "${GTEST_INCLUDE_DIRS}")
  278. endif()
  279. __gtest_import_library(GTest::gmock GMOCK_LIBRARY "")
  280. __gtest_import_library(GTest::gmock GMOCK_LIBRARY "RELEASE")
  281. __gtest_import_library(GTest::gmock GMOCK_LIBRARY "DEBUG")
  282. endif()
  283. if(NOT TARGET GTest::gmock_main)
  284. __gtest_determine_library_type(GMOCK_MAIN_LIBRARY)
  285. add_library(GTest::gmock_main ${GMOCK_MAIN_LIBRARY_TYPE} IMPORTED)
  286. set_target_properties(GTest::gmock_main PROPERTIES
  287. INTERFACE_LINK_LIBRARIES "GTest::gmock")
  288. __gtest_import_library(GTest::gmock_main GMOCK_MAIN_LIBRARY "")
  289. __gtest_import_library(GTest::gmock_main GMOCK_MAIN_LIBRARY "RELEASE")
  290. __gtest_import_library(GTest::gmock_main GMOCK_MAIN_LIBRARY "DEBUG")
  291. endif()
  292. endif()