1 # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 # file Copyright.txt or https://cmake.org/licensing for details.
4 #[=======================================================================[.rst:
8 Locate the Google C++ Testing Framework.
10 .. versionadded:: 3.20
11 Upstream ``GTestConfig.cmake`` is used if possible.
16 .. versionadded:: 3.20
17 This module defines the following :prop_tgt:`IMPORTED` targets:
20 The Google Test ``gtest`` library, if found; adds Thread::Thread
23 The Google Test ``gtest_main`` library, if found
25 .. versionadded:: 3.23
28 The Google Mock ``gmock`` library, if found; adds Thread::Thread
31 The Google Mock ``gmock_main`` library, if found
34 For backwards compatibility, this module defines additionally the
35 following deprecated :prop_tgt:`IMPORTED` targets (available since 3.5):
38 The Google Test ``gtest`` library, if found; adds Thread::Thread
41 The Google Test ``gtest_main`` library, if found
46 This module will set the following variables in your project:
49 Found the Google Testing framework
50 ``GTEST_INCLUDE_DIRS``
51 the directory containing the Google Test headers
53 The library variables below are set as normal variables. These
54 contain debug/optimized keywords when a debugging library is found.
57 The Google Test ``gtest`` library; note it also requires linking
58 with an appropriate thread library
59 ``GTEST_MAIN_LIBRARIES``
60 The Google Test ``gtest_main`` library
61 ``GTEST_BOTH_LIBRARIES``
62 Both ``gtest`` and ``gtest_main``
67 The following cache variables may also be set:
70 The root directory of the Google Test installation (may also be
71 set as an environment variable)
73 If compiling with MSVC, this variable can be set to ``MT`` or
74 ``MD`` (the default) to enable searching a GTest build tree
83 find_package(GTest REQUIRED)
85 add_executable(foo foo.cc)
86 target_link_libraries(foo GTest::gtest GTest::gtest_main)
88 add_test(AllTestsInFoo foo)
91 Deeper integration with CTest
92 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
94 See :module:`GoogleTest` for information on the :command:`gtest_add_tests`
95 and :command:`gtest_discover_tests` commands.
97 .. versionchanged:: 3.9
98 Previous CMake versions defined :command:`gtest_add_tests` macro in this
100 #]=======================================================================]
102 include(${CMAKE_CURRENT_LIST_DIR}/GoogleTest.cmake)
104 function(__gtest_append_debugs _endvar _library)
105 if(${_library} AND ${_library}_DEBUG)
106 set(_output optimized ${${_library}} debug ${${_library}_DEBUG})
108 set(_output ${${_library}})
110 set(${_endvar} ${_output} PARENT_SCOPE)
113 function(__gtest_find_library _name)
114 find_library(${_name}
119 PATH_SUFFIXES ${_gtest_libpath_suffixes}
121 mark_as_advanced(${_name})
124 macro(__gtest_determine_windows_library_type _var)
125 if(EXISTS "${${_var}}")
126 file(TO_NATIVE_PATH "${${_var}}" _lib_path)
127 get_filename_component(_name "${${_var}}" NAME_WE)
129 cmake_policy(SET CMP0159 NEW) # file(STRINGS) with REGEX updates CMAKE_MATCH_<n>
130 file(STRINGS "${${_var}}" _match REGEX "${_name}\\.dll" LIMIT_COUNT 1)
132 if(NOT _match STREQUAL "")
133 set(${_var}_TYPE SHARED PARENT_SCOPE)
135 set(${_var}_TYPE UNKNOWN PARENT_SCOPE)
141 function(__gtest_determine_library_type _var)
143 # For now, at least, only Windows really needs to know the library type
144 __gtest_determine_windows_library_type(${_var})
145 __gtest_determine_windows_library_type(${_var}_RELEASE)
146 __gtest_determine_windows_library_type(${_var}_DEBUG)
148 # If we get here, no determination was made from the above checks
149 set(${_var}_TYPE UNKNOWN PARENT_SCOPE)
152 function(__gtest_import_library _target _var _config)
154 set(_config_suffix "_${_config}")
156 set(_config_suffix "")
159 set(_lib "${${_var}${_config_suffix}}")
162 set_property(TARGET ${_target} APPEND PROPERTY
163 IMPORTED_CONFIGURATIONS ${_config})
165 set_target_properties(${_target} PROPERTIES
166 IMPORTED_LINK_INTERFACE_LANGUAGES${_config_suffix} "CXX")
167 if(WIN32 AND ${_var}_TYPE STREQUAL SHARED)
168 set_target_properties(${_target} PROPERTIES
169 IMPORTED_IMPLIB${_config_suffix} "${_lib}")
171 set_target_properties(${_target} PROPERTIES
172 IMPORTED_LOCATION${_config_suffix} "${_lib}")
177 function(__gtest_define_backwards_compatible_library_targets)
178 set(GTEST_BOTH_LIBRARIES ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES} PARENT_SCOPE)
180 # Add targets mapping the same library names as defined in
181 # older versions of CMake's FindGTest
182 if(NOT TARGET GTest::GTest)
183 add_library(GTest::GTest INTERFACE IMPORTED)
184 target_link_libraries(GTest::GTest INTERFACE GTest::gtest)
186 if(NOT TARGET GTest::Main)
187 add_library(GTest::Main INTERFACE IMPORTED)
188 target_link_libraries(GTest::Main INTERFACE GTest::gtest_main)
194 include(FindPackageHandleStandardArgs)
196 # first specifically look for the CMake version of GTest
197 find_package(GTest QUIET NO_MODULE)
199 # if we found the GTest cmake package then we are done, and
200 # can print what we found and return.
202 find_package_handle_standard_args(GTest HANDLE_COMPONENTS CONFIG_MODE)
204 set(GTEST_LIBRARIES GTest::gtest)
205 set(GTEST_MAIN_LIBRARIES GTest::gtest_main)
207 __gtest_define_backwards_compatible_library_targets()
212 if(NOT DEFINED GTEST_MSVC_SEARCH)
213 set(GTEST_MSVC_SEARCH MD)
216 set(_gtest_libpath_suffixes lib)
218 if(GTEST_MSVC_SEARCH STREQUAL "MD")
219 list(APPEND _gtest_libpath_suffixes
221 msvc/gtest-md/Release
224 msvc/2010/gtest-md/Win32-Debug
225 msvc/2010/gtest-md/Win32-Release
226 msvc/2010/gtest-md/x64-Debug
227 msvc/2010/gtest-md/x64-Release
229 elseif(GTEST_MSVC_SEARCH STREQUAL "MT")
230 list(APPEND _gtest_libpath_suffixes
235 msvc/2010/gtest/Win32-Debug
236 msvc/2010/gtest/Win32-Release
237 msvc/2010/gtest/x64-Debug
238 msvc/2010/gtest/x64-Release
244 find_path(GTEST_INCLUDE_DIR gtest/gtest.h
246 $ENV{GTEST_ROOT}/include
247 ${GTEST_ROOT}/include
249 mark_as_advanced(GTEST_INCLUDE_DIR)
251 if(MSVC AND GTEST_MSVC_SEARCH STREQUAL "MD")
252 # The provided /MD project files for Google Test add -md suffixes to the
254 __gtest_find_library(GTEST_LIBRARY gtest-md gtest)
255 __gtest_find_library(GTEST_LIBRARY_DEBUG gtest-mdd gtestd)
256 __gtest_find_library(GTEST_MAIN_LIBRARY gtest_main-md gtest_main)
257 __gtest_find_library(GTEST_MAIN_LIBRARY_DEBUG gtest_main-mdd gtest_maind)
258 __gtest_find_library(GMOCK_LIBRARY gmock-md gmock)
259 __gtest_find_library(GMOCK_LIBRARY_DEBUG gmock-mdd gmockd)
260 __gtest_find_library(GMOCK_MAIN_LIBRARY gmock_main-md gmock_main)
261 __gtest_find_library(GMOCK_MAIN_LIBRARY_DEBUG gmock_main-mdd gmock_maind)
263 __gtest_find_library(GTEST_LIBRARY gtest)
264 __gtest_find_library(GTEST_LIBRARY_DEBUG gtestd)
265 __gtest_find_library(GTEST_MAIN_LIBRARY gtest_main)
266 __gtest_find_library(GTEST_MAIN_LIBRARY_DEBUG gtest_maind)
267 __gtest_find_library(GMOCK_LIBRARY gmock)
268 __gtest_find_library(GMOCK_LIBRARY_DEBUG gmockd)
269 __gtest_find_library(GMOCK_MAIN_LIBRARY gmock_main)
270 __gtest_find_library(GMOCK_MAIN_LIBRARY_DEBUG gmock_maind)
273 find_package_handle_standard_args(GTest DEFAULT_MSG GTEST_LIBRARY GTEST_INCLUDE_DIR GTEST_MAIN_LIBRARY)
275 if(GMOCK_LIBRARY AND GMOCK_MAIN_LIBRARY)
276 set(GMock_FOUND True)
278 set(GMock_FOUND False)
282 set(GTEST_INCLUDE_DIRS ${GTEST_INCLUDE_DIR})
283 __gtest_append_debugs(GTEST_LIBRARIES GTEST_LIBRARY)
284 __gtest_append_debugs(GTEST_MAIN_LIBRARIES GTEST_MAIN_LIBRARY)
286 find_package(Threads QUIET)
288 if(NOT TARGET GTest::gtest)
289 __gtest_determine_library_type(GTEST_LIBRARY)
290 add_library(GTest::gtest ${GTEST_LIBRARY_TYPE} IMPORTED)
291 if(TARGET Threads::Threads)
292 set_target_properties(GTest::gtest PROPERTIES
293 INTERFACE_LINK_LIBRARIES Threads::Threads)
295 if(GTEST_LIBRARY_TYPE STREQUAL "SHARED")
296 set_target_properties(GTest::gtest PROPERTIES
297 INTERFACE_COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1")
299 if(GTEST_INCLUDE_DIRS)
300 set_target_properties(GTest::gtest PROPERTIES
301 INTERFACE_INCLUDE_DIRECTORIES "${GTEST_INCLUDE_DIRS}")
303 __gtest_import_library(GTest::gtest GTEST_LIBRARY "")
304 __gtest_import_library(GTest::gtest GTEST_LIBRARY "RELEASE")
305 __gtest_import_library(GTest::gtest GTEST_LIBRARY "DEBUG")
307 if(NOT TARGET GTest::gtest_main)
308 __gtest_determine_library_type(GTEST_MAIN_LIBRARY)
309 add_library(GTest::gtest_main ${GTEST_MAIN_LIBRARY_TYPE} IMPORTED)
310 set_target_properties(GTest::gtest_main PROPERTIES
311 INTERFACE_LINK_LIBRARIES "GTest::gtest")
312 __gtest_import_library(GTest::gtest_main GTEST_MAIN_LIBRARY "")
313 __gtest_import_library(GTest::gtest_main GTEST_MAIN_LIBRARY "RELEASE")
314 __gtest_import_library(GTest::gtest_main GTEST_MAIN_LIBRARY "DEBUG")
317 __gtest_define_backwards_compatible_library_targets()
320 if(GMock_FOUND AND GTest_FOUND)
321 if(NOT TARGET GTest::gmock)
322 __gtest_determine_library_type(GMOCK_LIBRARY)
323 add_library(GTest::gmock ${GMOCK_LIBRARY_TYPE} IMPORTED)
324 set(_gmock_link_libraries "GTest::gtest")
325 if(TARGET Threads::Threads)
326 list(APPEND _gmock_link_libraries Threads::Threads)
328 set_target_properties(GTest::gmock PROPERTIES
329 INTERFACE_LINK_LIBRARIES "${_gmock_link_libraries}")
330 if(GMOCK_LIBRARY_TYPE STREQUAL "SHARED")
331 set_target_properties(GTest::gmock PROPERTIES
332 INTERFACE_COMPILE_DEFINITIONS "GMOCK_LINKED_AS_SHARED_LIBRARY=1")
334 if(GTEST_INCLUDE_DIRS)
335 set_target_properties(GTest::gmock PROPERTIES
336 INTERFACE_INCLUDE_DIRECTORIES "${GTEST_INCLUDE_DIRS}")
338 __gtest_import_library(GTest::gmock GMOCK_LIBRARY "")
339 __gtest_import_library(GTest::gmock GMOCK_LIBRARY "RELEASE")
340 __gtest_import_library(GTest::gmock GMOCK_LIBRARY "DEBUG")
342 if(NOT TARGET GTest::gmock_main)
343 __gtest_determine_library_type(GMOCK_MAIN_LIBRARY)
344 add_library(GTest::gmock_main ${GMOCK_MAIN_LIBRARY_TYPE} IMPORTED)
345 set_target_properties(GTest::gmock_main PROPERTIES
346 INTERFACE_LINK_LIBRARIES "GTest::gmock")
347 __gtest_import_library(GTest::gmock_main GMOCK_MAIN_LIBRARY "")
348 __gtest_import_library(GTest::gmock_main GMOCK_MAIN_LIBRARY "RELEASE")
349 __gtest_import_library(GTest::gmock_main GMOCK_MAIN_LIBRARY "DEBUG")