summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/cmake/cmake/0006-cmake-FindGTest-Add-target-for-gmock-library.patch
blob: 267f586a7113bb790eafb3f85b87d88ec4f71e4d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
From 39eae0d6c1b398f18761abac7f55944f0290f8a1 Mon Sep 17 00:00:00 2001
From: Eero Aaltonen <eero.aaltonen@iki.fi>
Date: Sun, 17 Oct 2021 17:13:07 +0300
Subject: [PATCH] FindGTest: Add target for gmock library

`googlemock` has been absorbed into the
[googletest](https://github.com/google/googletest) project and is built
and installed from the same source tree.

As GTest may be built with or without GMock, skip GMock if it is not
present.

Do not provide result variables for GMock.  They are not provided by
upstream GTest's CMake Package Configuration File.

Also update the test case to cover linking to `GTest::gmock`.

The patch was imported from the Kitware git server
(git@gitlab.kitware.com:cmake/cmake.git) as of commit id
50bf457a0dd857cf976b22c5be7d333493233d1e

Patch was modified to support upper case variable `GTEST_FOUND`.

Upstream-Status: Accepted [https://gitlab.kitware.com/cmake/cmake/-/merge_requests/6632]
Milestone: 3.23.0

Signed-off-by: Eero Aaltonen <eero.aaltonen@vaisala.com>
---
 .../dev/FindGTest-target-for-gmock.rst        |   4 +
 Modules/FindGTest.cmake                       | 133 +++++++++++++++---
 Tests/FindGTest/Test/CMakeLists.txt           |   4 +
 3 files changed, 121 insertions(+), 20 deletions(-)
 create mode 100644 Help/release/dev/FindGTest-target-for-gmock.rst

diff --git a/Help/release/dev/FindGTest-target-for-gmock.rst b/Help/release/dev/FindGTest-target-for-gmock.rst
new file mode 100644
index 0000000000..f78242c80e
--- /dev/null
+++ b/Help/release/dev/FindGTest-target-for-gmock.rst
@@ -0,0 +1,4 @@
+FindGTest-target-for-gmock
+--------------------------
+
+* The :module:`FindGTest` module now provides a target for GMock, if found.
diff --git a/Modules/FindGTest.cmake b/Modules/FindGTest.cmake
index e015a9840f..0331049594 100644
--- a/Modules/FindGTest.cmake
+++ b/Modules/FindGTest.cmake
@@ -7,10 +7,23 @@ FindGTest
 
 Locate the Google C++ Testing Framework.
 
+.. versionadded:: 3.20
+  Upstream ``GTestConfig.cmake`` is used if possible.
+
 Imported targets
 ^^^^^^^^^^^^^^^^
 
-This module defines the following :prop_tgt:`IMPORTED` targets:
+  This module defines the following :prop_tgt:`IMPORTED` targets:
+
+``GTest::gtest``
+  The Google Test ``gtest`` library, if found; adds Thread::Thread
+  automatically
+``GTest::gtest_main``
+  The Google Test ``gtest_main`` library, if found
+
+.. deprecated:: 3.20
+  For backwards compatibility, this module defines additionally the
+  following deprecated :prop_tgt:`IMPORTED` targets (available since 3.5):
 
 ``GTest::GTest``
   The Google Test ``gtest`` library, if found; adds Thread::Thread
@@ -18,7 +31,6 @@ This module defines the following :prop_tgt:`IMPORTED` targets:
 ``GTest::Main``
   The Google Test ``gtest_main`` library, if found
 
-
 Result variables
 ^^^^^^^^^^^^^^^^
 
@@ -146,8 +158,42 @@ function(__gtest_import_library _target _var _config)
     endif()
 endfunction()
 
+function(__gtest_define_backwards_compatible_library_targets)
+    set(GTEST_BOTH_LIBRARIES ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES} PARENT_SCOPE)
+
+    # Add targets mapping the same library names as defined in
+    # older versions of CMake's FindGTest
+    if(NOT TARGET GTest::GTest)
+        add_library(GTest::GTest INTERFACE IMPORTED)
+        target_link_libraries(GTest::GTest INTERFACE GTest::gtest)
+    endif()
+    if(NOT TARGET GTest::Main)
+        add_library(GTest::Main INTERFACE IMPORTED)
+        target_link_libraries(GTest::Main INTERFACE GTest::gtest_main)
+    endif()
+endfunction()
+
 #
 
+include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
+
+# first specifically look for the CMake version of GTest
+find_package(GTest QUIET NO_MODULE)
+
+# if we found the GTest cmake package then we are done, and
+# can print what we found and return.
+if(GTest_FOUND)
+    set(GTEST_FOUND ${GTest_FOUND})
+    FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTest HANDLE_COMPONENTS CONFIG_MODE)
+
+    set(GTEST_LIBRARIES      GTest::gtest)
+    set(GTEST_MAIN_LIBRARIES GTest::gtest_main)
+
+    __gtest_define_backwards_compatible_library_targets()
+
+    return()
+endif()
+
 if(NOT DEFINED GTEST_MSVC_SEARCH)
     set(GTEST_MSVC_SEARCH MD)
 endif()
@@ -194,50 +240,97 @@ if(MSVC AND GTEST_MSVC_SEARCH STREQUAL "MD")
     __gtest_find_library(GTEST_LIBRARY_DEBUG      gtest-mdd gtestd)
     __gtest_find_library(GTEST_MAIN_LIBRARY       gtest_main-md  gtest_main)
     __gtest_find_library(GTEST_MAIN_LIBRARY_DEBUG gtest_main-mdd gtest_maind)
+    __gtest_find_library(GMOCK_LIBRARY            gmock-md  gmock)
+    __gtest_find_library(GMOCK_LIBRARY_DEBUG      gmock-mdd gmockd)
+    __gtest_find_library(GMOCK_MAIN_LIBRARY       gmock_main-md  gmock_main)
+    __gtest_find_library(GMOCK_MAIN_LIBRARY_DEBUG gmock_main-mdd gmock_maind)
 else()
     __gtest_find_library(GTEST_LIBRARY            gtest)
     __gtest_find_library(GTEST_LIBRARY_DEBUG      gtestd)
     __gtest_find_library(GTEST_MAIN_LIBRARY       gtest_main)
     __gtest_find_library(GTEST_MAIN_LIBRARY_DEBUG gtest_maind)
+    __gtest_find_library(GMOCK_LIBRARY            gmock)
+    __gtest_find_library(GMOCK_LIBRARY_DEBUG      gmockd)
+    __gtest_find_library(GMOCK_MAIN_LIBRARY       gmock_main)
+    __gtest_find_library(GMOCK_MAIN_LIBRARY_DEBUG gmock_maind)
 endif()
 
-include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
 FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTest DEFAULT_MSG GTEST_LIBRARY GTEST_INCLUDE_DIR GTEST_MAIN_LIBRARY)
 
-if(GTEST_FOUND)
+if(GMOCK_LIBRARY AND GMOCK_MAIN_LIBRARY)
+    set(GMock_FOUND True)
+else()
+    set(GMock_FOUND False)
+endif()
+
+if(GTest_FOUND)
     set(GTEST_INCLUDE_DIRS ${GTEST_INCLUDE_DIR})
     __gtest_append_debugs(GTEST_LIBRARIES      GTEST_LIBRARY)
     __gtest_append_debugs(GTEST_MAIN_LIBRARIES GTEST_MAIN_LIBRARY)
-    set(GTEST_BOTH_LIBRARIES ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES})
 
     find_package(Threads QUIET)
 
-    if(NOT TARGET GTest::GTest)
+    if(NOT TARGET GTest::gtest)
         __gtest_determine_library_type(GTEST_LIBRARY)
-        add_library(GTest::GTest ${GTEST_LIBRARY_TYPE} IMPORTED)
+        add_library(GTest::gtest ${GTEST_LIBRARY_TYPE} IMPORTED)
         if(TARGET Threads::Threads)
-            set_target_properties(GTest::GTest PROPERTIES
+            set_target_properties(GTest::gtest PROPERTIES
                 INTERFACE_LINK_LIBRARIES Threads::Threads)
         endif()
         if(GTEST_LIBRARY_TYPE STREQUAL "SHARED")
-            set_target_properties(GTest::GTest PROPERTIES
+            set_target_properties(GTest::gtest PROPERTIES
                 INTERFACE_COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1")
         endif()
         if(GTEST_INCLUDE_DIRS)
-            set_target_properties(GTest::GTest PROPERTIES
+            set_target_properties(GTest::gtest PROPERTIES
                 INTERFACE_INCLUDE_DIRECTORIES "${GTEST_INCLUDE_DIRS}")
         endif()
-        __gtest_import_library(GTest::GTest GTEST_LIBRARY "")
-        __gtest_import_library(GTest::GTest GTEST_LIBRARY "RELEASE")
-        __gtest_import_library(GTest::GTest GTEST_LIBRARY "DEBUG")
+        __gtest_import_library(GTest::gtest GTEST_LIBRARY "")
+        __gtest_import_library(GTest::gtest GTEST_LIBRARY "RELEASE")
+        __gtest_import_library(GTest::gtest GTEST_LIBRARY "DEBUG")
     endif()
-    if(NOT TARGET GTest::Main)
+    if(NOT TARGET GTest::gtest_main)
         __gtest_determine_library_type(GTEST_MAIN_LIBRARY)
-        add_library(GTest::Main ${GTEST_MAIN_LIBRARY_TYPE} IMPORTED)
-        set_target_properties(GTest::Main PROPERTIES
-            INTERFACE_LINK_LIBRARIES "GTest::GTest")
-        __gtest_import_library(GTest::Main GTEST_MAIN_LIBRARY "")
-        __gtest_import_library(GTest::Main GTEST_MAIN_LIBRARY "RELEASE")
-        __gtest_import_library(GTest::Main GTEST_MAIN_LIBRARY "DEBUG")
+        add_library(GTest::gtest_main ${GTEST_MAIN_LIBRARY_TYPE} IMPORTED)
+        set_target_properties(GTest::gtest_main PROPERTIES
+            INTERFACE_LINK_LIBRARIES "GTest::gtest")
+        __gtest_import_library(GTest::gtest_main GTEST_MAIN_LIBRARY "")
+        __gtest_import_library(GTest::gtest_main GTEST_MAIN_LIBRARY "RELEASE")
+        __gtest_import_library(GTest::gtest_main GTEST_MAIN_LIBRARY "DEBUG")
+    endif()
+
+    __gtest_define_backwards_compatible_library_targets()
+endif()
+
+if(GMock_FOUND)
+    if(NOT TARGET GTest::gmock)
+        __gtest_determine_library_type(GMOCK_LIBRARY)
+        add_library(GTest::gmock ${GMOCK_LIBRARY_TYPE} IMPORTED)
+        set(_gmock_link_libraries "GTest::gtest")
+        if(TARGET Threads::Threads)
+            list(APPEND _gmock_link_libraries Threads::Threads)
+        endif()
+        set_target_properties(GTest::gmock PROPERTIES
+            INTERFACE_LINK_LIBRARIES "${_gmock_link_libraries}")
+        if(GMOCK_LIBRARY_TYPE STREQUAL "SHARED")
+            set_target_properties(GTest::gmock PROPERTIES
+                INTERFACE_COMPILE_DEFINITIONS "GMOCK_LINKED_AS_SHARED_LIBRARY=1")
+        endif()
+        if(GTEST_INCLUDE_DIRS)
+            set_target_properties(GTest::gmock PROPERTIES
+                INTERFACE_INCLUDE_DIRECTORIES "${GTEST_INCLUDE_DIRS}")
+        endif()
+        __gtest_import_library(GTest::gmock GMOCK_LIBRARY "")
+        __gtest_import_library(GTest::gmock GMOCK_LIBRARY "RELEASE")
+        __gtest_import_library(GTest::gmock GMOCK_LIBRARY "DEBUG")
+    endif()
+    if(NOT TARGET GTest::gmock_main)
+        __gtest_determine_library_type(GMOCK_MAIN_LIBRARY)
+        add_library(GTest::gmock_main ${GMOCK_MAIN_LIBRARY_TYPE} IMPORTED)
+        set_target_properties(GTest::gmock_main PROPERTIES
+            INTERFACE_LINK_LIBRARIES "GTest::gmock")
+        __gtest_import_library(GTest::gmock_main GMOCK_MAIN_LIBRARY "")
+        __gtest_import_library(GTest::gmock_main GMOCK_MAIN_LIBRARY "RELEASE")
+        __gtest_import_library(GTest::gmock_main GMOCK_MAIN_LIBRARY "DEBUG")
     endif()
 endif()
diff --git a/Tests/FindGTest/Test/CMakeLists.txt b/Tests/FindGTest/Test/CMakeLists.txt
index b65b9d28f6..7d3a378a65 100644
--- a/Tests/FindGTest/Test/CMakeLists.txt
+++ b/Tests/FindGTest/Test/CMakeLists.txt
@@ -12,3 +12,7 @@ add_executable(test_gtest_var main.cxx)
 target_include_directories(test_gtest_var PRIVATE ${GTEST_INCLUDE_DIRS})
 target_link_libraries(test_gtest_var PRIVATE ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
 add_test(NAME test_gtest_var COMMAND test_gtest_var)
+
+add_executable(test_gmock_tgt main.cxx)
+target_link_libraries(test_gmock_tgt GTest::gmock_main)
+add_test(NAME test_gmock_tgt COMMAND test_gmock_tgt)
-- 
2.17.1