FindGTest.cmake 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  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. #
  7. # Locate the Google C++ Testing Framework.
  8. #
  9. # Imported targets
  10. # ^^^^^^^^^^^^^^^^
  11. #
  12. # This module defines the following :prop_tgt:`IMPORTED` targets:
  13. #
  14. # ``GTest::GTest``
  15. # The Google Test ``gtest`` library, if found; adds Thread::Thread
  16. # automatically
  17. # ``GTest::Main``
  18. # The Google Test ``gtest_main`` library, if found
  19. #
  20. #
  21. # Result variables
  22. # ^^^^^^^^^^^^^^^^
  23. #
  24. # This module will set the following variables in your project:
  25. #
  26. # ``GTEST_FOUND``
  27. # Found the Google Testing framework
  28. # ``GTEST_INCLUDE_DIRS``
  29. # the directory containing the Google Test headers
  30. #
  31. # The library variables below are set as normal variables. These
  32. # contain debug/optimized keywords when a debugging library is found.
  33. #
  34. # ``GTEST_LIBRARIES``
  35. # The Google Test ``gtest`` library; note it also requires linking
  36. # with an appropriate thread library
  37. # ``GTEST_MAIN_LIBRARIES``
  38. # The Google Test ``gtest_main`` library
  39. # ``GTEST_BOTH_LIBRARIES``
  40. # Both ``gtest`` and ``gtest_main``
  41. #
  42. # Cache variables
  43. # ^^^^^^^^^^^^^^^
  44. #
  45. # The following cache variables may also be set:
  46. #
  47. # ``GTEST_ROOT``
  48. # The root directory of the Google Test installation (may also be
  49. # set as an environment variable)
  50. # ``GTEST_MSVC_SEARCH``
  51. # If compiling with MSVC, this variable can be set to ``MT`` or
  52. # ``MD`` (the default) to enable searching a GTest build tree
  53. #
  54. #
  55. # Example usage
  56. # ^^^^^^^^^^^^^
  57. #
  58. # ::
  59. #
  60. # enable_testing()
  61. # find_package(GTest REQUIRED)
  62. #
  63. # add_executable(foo foo.cc)
  64. # target_link_libraries(foo GTest::GTest GTest::Main)
  65. #
  66. # add_test(AllTestsInFoo foo)
  67. #
  68. #
  69. # Deeper integration with CTest
  70. # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  71. #
  72. # See :module:`GoogleTest` for information on the :command:`gtest_add_tests`
  73. # and :command:`gtest_discover_tests` commands.
  74. include(${CMAKE_CURRENT_LIST_DIR}/GoogleTest.cmake)
  75. function(_gtest_append_debugs _endvar _library)
  76. if(${_library} AND ${_library}_DEBUG)
  77. set(_output optimized ${${_library}} debug ${${_library}_DEBUG})
  78. else()
  79. set(_output ${${_library}})
  80. endif()
  81. set(${_endvar} ${_output} PARENT_SCOPE)
  82. endfunction()
  83. function(_gtest_find_library _name)
  84. find_library(${_name}
  85. NAMES ${ARGN}
  86. HINTS
  87. ENV GTEST_ROOT
  88. ${GTEST_ROOT}
  89. PATH_SUFFIXES ${_gtest_libpath_suffixes}
  90. )
  91. mark_as_advanced(${_name})
  92. endfunction()
  93. #
  94. if(NOT DEFINED GTEST_MSVC_SEARCH)
  95. set(GTEST_MSVC_SEARCH MD)
  96. endif()
  97. set(_gtest_libpath_suffixes lib)
  98. if(MSVC)
  99. if(GTEST_MSVC_SEARCH STREQUAL "MD")
  100. list(APPEND _gtest_libpath_suffixes
  101. msvc/gtest-md/Debug
  102. msvc/gtest-md/Release
  103. msvc/x64/Debug
  104. msvc/x64/Release
  105. )
  106. elseif(GTEST_MSVC_SEARCH STREQUAL "MT")
  107. list(APPEND _gtest_libpath_suffixes
  108. msvc/gtest/Debug
  109. msvc/gtest/Release
  110. msvc/x64/Debug
  111. msvc/x64/Release
  112. )
  113. endif()
  114. endif()
  115. find_path(GTEST_INCLUDE_DIR gtest/gtest.h
  116. HINTS
  117. $ENV{GTEST_ROOT}/include
  118. ${GTEST_ROOT}/include
  119. )
  120. mark_as_advanced(GTEST_INCLUDE_DIR)
  121. if(MSVC AND GTEST_MSVC_SEARCH STREQUAL "MD")
  122. # The provided /MD project files for Google Test add -md suffixes to the
  123. # library names.
  124. _gtest_find_library(GTEST_LIBRARY gtest-md gtest)
  125. _gtest_find_library(GTEST_LIBRARY_DEBUG gtest-mdd gtestd)
  126. _gtest_find_library(GTEST_MAIN_LIBRARY gtest_main-md gtest_main)
  127. _gtest_find_library(GTEST_MAIN_LIBRARY_DEBUG gtest_main-mdd gtest_maind)
  128. else()
  129. _gtest_find_library(GTEST_LIBRARY gtest)
  130. _gtest_find_library(GTEST_LIBRARY_DEBUG gtestd)
  131. _gtest_find_library(GTEST_MAIN_LIBRARY gtest_main)
  132. _gtest_find_library(GTEST_MAIN_LIBRARY_DEBUG gtest_maind)
  133. endif()
  134. include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
  135. FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTest DEFAULT_MSG GTEST_LIBRARY GTEST_INCLUDE_DIR GTEST_MAIN_LIBRARY)
  136. if(GTEST_FOUND)
  137. set(GTEST_INCLUDE_DIRS ${GTEST_INCLUDE_DIR})
  138. _gtest_append_debugs(GTEST_LIBRARIES GTEST_LIBRARY)
  139. _gtest_append_debugs(GTEST_MAIN_LIBRARIES GTEST_MAIN_LIBRARY)
  140. set(GTEST_BOTH_LIBRARIES ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES})
  141. include(CMakeFindDependencyMacro)
  142. find_dependency(Threads)
  143. if(NOT TARGET GTest::GTest)
  144. add_library(GTest::GTest UNKNOWN IMPORTED)
  145. set_target_properties(GTest::GTest PROPERTIES
  146. INTERFACE_LINK_LIBRARIES "Threads::Threads")
  147. if(GTEST_INCLUDE_DIRS)
  148. set_target_properties(GTest::GTest PROPERTIES
  149. INTERFACE_INCLUDE_DIRECTORIES "${GTEST_INCLUDE_DIRS}")
  150. endif()
  151. if(EXISTS "${GTEST_LIBRARY}")
  152. set_target_properties(GTest::GTest PROPERTIES
  153. IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
  154. IMPORTED_LOCATION "${GTEST_LIBRARY}")
  155. endif()
  156. if(EXISTS "${GTEST_LIBRARY_RELEASE}")
  157. set_property(TARGET GTest::GTest APPEND PROPERTY
  158. IMPORTED_CONFIGURATIONS RELEASE)
  159. set_target_properties(GTest::GTest PROPERTIES
  160. IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX"
  161. IMPORTED_LOCATION_RELEASE "${GTEST_LIBRARY_RELEASE}")
  162. endif()
  163. if(EXISTS "${GTEST_LIBRARY_DEBUG}")
  164. set_property(TARGET GTest::GTest APPEND PROPERTY
  165. IMPORTED_CONFIGURATIONS DEBUG)
  166. set_target_properties(GTest::GTest PROPERTIES
  167. IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "CXX"
  168. IMPORTED_LOCATION_DEBUG "${GTEST_LIBRARY_DEBUG}")
  169. endif()
  170. endif()
  171. if(NOT TARGET GTest::Main)
  172. add_library(GTest::Main UNKNOWN IMPORTED)
  173. set_target_properties(GTest::Main PROPERTIES
  174. INTERFACE_LINK_LIBRARIES "GTest::GTest")
  175. if(EXISTS "${GTEST_MAIN_LIBRARY}")
  176. set_target_properties(GTest::Main PROPERTIES
  177. IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
  178. IMPORTED_LOCATION "${GTEST_MAIN_LIBRARY}")
  179. endif()
  180. if(EXISTS "${GTEST_MAIN_LIBRARY_RELEASE}")
  181. set_property(TARGET GTest::Main APPEND PROPERTY
  182. IMPORTED_CONFIGURATIONS RELEASE)
  183. set_target_properties(GTest::Main PROPERTIES
  184. IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX"
  185. IMPORTED_LOCATION_RELEASE "${GTEST_MAIN_LIBRARY_RELEASE}")
  186. endif()
  187. if(EXISTS "${GTEST_MAIN_LIBRARY_DEBUG}")
  188. set_property(TARGET GTest::Main APPEND PROPERTY
  189. IMPORTED_CONFIGURATIONS DEBUG)
  190. set_target_properties(GTest::Main PROPERTIES
  191. IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "CXX"
  192. IMPORTED_LOCATION_DEBUG "${GTEST_MAIN_LIBRARY_DEBUG}")
  193. endif()
  194. endif()
  195. endif()