Merge topic 'cuda_add_12.8_new_sm_support'
[kiteware-cmake.git] / Modules / FindGTest.cmake
blobcd2b3bb41786a79236aa2e69e3acceceecbe30ce
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:
5 FindGTest
6 ---------
8 Locate the Google C++ Testing Framework.
10 .. versionadded:: 3.20
11   Upstream ``GTestConfig.cmake`` is used if possible.
13 Imported Targets
14 ^^^^^^^^^^^^^^^^
16 .. versionadded:: 3.20
17   This module defines the following :prop_tgt:`IMPORTED` targets:
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
25 .. versionadded:: 3.23
27 ``GTest::gmock``
28   The Google Mock ``gmock`` library, if found; adds Thread::Thread
29   automatically
30 ``GTest::gmock_main``
31   The Google Mock ``gmock_main`` library, if found
33 .. deprecated:: 3.20
34   For backwards compatibility, this module defines additionally the
35   following deprecated :prop_tgt:`IMPORTED` targets (available since 3.5):
37 ``GTest::GTest``
38   The Google Test ``gtest`` library, if found; adds Thread::Thread
39   automatically
40 ``GTest::Main``
41   The Google Test ``gtest_main`` library, if found
43 Result variables
44 ^^^^^^^^^^^^^^^^
46 This module will set the following variables in your project:
48 ``GTest_FOUND``
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.
56 ``GTEST_LIBRARIES``
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``
64 Cache variables
65 ^^^^^^^^^^^^^^^
67 The following cache variables may also be set:
69 ``GTEST_ROOT``
70   The root directory of the Google Test installation (may also be
71   set as an environment variable)
72 ``GTEST_MSVC_SEARCH``
73   If compiling with MSVC, this variable can be set to ``MT`` or
74   ``MD`` (the default) to enable searching a GTest build tree
77 Example usage
78 ^^^^^^^^^^^^^
80 .. code-block:: cmake
82     enable_testing()
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
99   module.
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})
107     else()
108         set(_output ${${_library}})
109     endif()
110     set(${_endvar} ${_output} PARENT_SCOPE)
111 endfunction()
113 function(__gtest_find_library _name)
114     find_library(${_name}
115         NAMES ${ARGN}
116         HINTS
117             ENV GTEST_ROOT
118             ${GTEST_ROOT}
119         PATH_SUFFIXES ${_gtest_libpath_suffixes}
120     )
121     mark_as_advanced(${_name})
122 endfunction()
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)
128         cmake_policy(PUSH)
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)
131         cmake_policy(POP)
132         if(NOT _match STREQUAL "")
133             set(${_var}_TYPE SHARED PARENT_SCOPE)
134         else()
135             set(${_var}_TYPE UNKNOWN PARENT_SCOPE)
136         endif()
137         return()
138     endif()
139 endmacro()
141 function(__gtest_determine_library_type _var)
142     if(WIN32)
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)
147     endif()
148     # If we get here, no determination was made from the above checks
149     set(${_var}_TYPE UNKNOWN PARENT_SCOPE)
150 endfunction()
152 function(__gtest_import_library _target _var _config)
153     if(_config)
154         set(_config_suffix "_${_config}")
155     else()
156         set(_config_suffix "")
157     endif()
159     set(_lib "${${_var}${_config_suffix}}")
160     if(EXISTS "${_lib}")
161         if(_config)
162             set_property(TARGET ${_target} APPEND PROPERTY
163                 IMPORTED_CONFIGURATIONS ${_config})
164         endif()
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}")
170         else()
171             set_target_properties(${_target} PROPERTIES
172                 IMPORTED_LOCATION${_config_suffix} "${_lib}")
173         endif()
174     endif()
175 endfunction()
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)
185     endif()
186     if(NOT TARGET GTest::Main)
187         add_library(GTest::Main INTERFACE IMPORTED)
188         target_link_libraries(GTest::Main INTERFACE GTest::gtest_main)
189     endif()
190 endfunction()
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.
201 if(GTest_FOUND)
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()
209     return()
210 endif()
212 if(NOT DEFINED GTEST_MSVC_SEARCH)
213     set(GTEST_MSVC_SEARCH MD)
214 endif()
216 set(_gtest_libpath_suffixes lib)
217 if(MSVC)
218     if(GTEST_MSVC_SEARCH STREQUAL "MD")
219         list(APPEND _gtest_libpath_suffixes
220             msvc/gtest-md/Debug
221             msvc/gtest-md/Release
222             msvc/x64/Debug
223             msvc/x64/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
228             )
229     elseif(GTEST_MSVC_SEARCH STREQUAL "MT")
230         list(APPEND _gtest_libpath_suffixes
231             msvc/gtest/Debug
232             msvc/gtest/Release
233             msvc/x64/Debug
234             msvc/x64/Release
235             msvc/2010/gtest/Win32-Debug
236             msvc/2010/gtest/Win32-Release
237             msvc/2010/gtest/x64-Debug
238             msvc/2010/gtest/x64-Release
239             )
240     endif()
241 endif()
244 find_path(GTEST_INCLUDE_DIR gtest/gtest.h
245     HINTS
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
253     # library names.
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)
262 else()
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)
271 endif()
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)
277 else()
278     set(GMock_FOUND False)
279 endif()
281 if(GTest_FOUND)
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)
294         endif()
295         if(GTEST_LIBRARY_TYPE STREQUAL "SHARED")
296             set_target_properties(GTest::gtest PROPERTIES
297                 INTERFACE_COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1")
298         endif()
299         if(GTEST_INCLUDE_DIRS)
300             set_target_properties(GTest::gtest PROPERTIES
301                 INTERFACE_INCLUDE_DIRECTORIES "${GTEST_INCLUDE_DIRS}")
302         endif()
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")
306     endif()
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")
315     endif()
317     __gtest_define_backwards_compatible_library_targets()
318 endif()
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)
327         endif()
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")
333         endif()
334         if(GTEST_INCLUDE_DIRS)
335             set_target_properties(GTest::gmock PROPERTIES
336                 INTERFACE_INCLUDE_DIRECTORIES "${GTEST_INCLUDE_DIRS}")
337         endif()
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")
341     endif()
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")
350     endif()
351 endif()