Skip to content

Commit 3b7e373

Browse files
humble, jazzy: ament_cmake_gtest/gmock use conda-forge's gtest (#118)
* humble, jazzy: ament_cmake_gtest/gmock use conda-forge's gtest [skip ci] humble's and jazzy's ament_cmake_gtest compile gtest_vendor's sources (1.10 / 1.14) in every package's test build, against the headers of conda-forge's gtest (1.18), which ament_cmake_gtest also depends on: any ament_add_gtest test fails to build ("no declaration matches testing::TestInfo::TestInfo(...)", RoboStack/ros-kilted#59). lyrical and rolling are fine: upstream ament_cmake 2.8+ dropped the vendored sources. Backport that change (as RoboStack/ros-kilted#100 does for kilted): _ament_cmake_gtest_find_gtest / _ament_cmake_gmock_find_gmock just find_package(GTest) and use its targets. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * ament_cmake_gmock: recipe test building and running a gtest and a gmock test [skip ci] Turns the local checks of this PR into a recipe test, so later rebuilds keep them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * ament_cmake_gtest, ament_cmake_gmock (humble, jazzy): build_number bump They're published, so CI (and main) only rebuild them with a higher build number. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * pkg_additional_info.yaml: sorted Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
1 parent ac111bf commit 3b7e373

11 files changed

Lines changed: 667 additions & 0 deletions
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
diff --git a/ament_cmake_gmock-extras.cmake b/ament_cmake_gmock-extras.cmake
2+
index 631d059..2dc3846 100644
3+
--- a/ament_cmake_gmock-extras.cmake
4+
+++ b/ament_cmake_gmock-extras.cmake
5+
@@ -20,101 +20,12 @@ macro(_ament_cmake_gmock_find_gmock)
6+
set(_AMENT_CMAKE_GMOCK_FIND_GMOCK TRUE)
7+
8+
find_package(ament_cmake_test QUIET REQUIRED)
9+
- find_package(gmock_vendor QUIET)
10+
-
11+
- # if gmock sources were not found in a previous run
12+
- if(NOT GMOCK_FROM_SOURCE_FOUND)
13+
- # search path for gmock includes and sources
14+
- set(_search_path_include "")
15+
- set(_search_path_src "")
16+
-
17+
- # option() consider environment variable to find gmock
18+
- if(NOT $ENV{GMOCK_DIR} STREQUAL "")
19+
- list(APPEND _search_path_include "$ENV{GMOCK_DIR}/include/gmock")
20+
- list(APPEND _search_path_src "$ENV{GMOCK_DIR}/src")
21+
- endif()
22+
-
23+
- # check to system installed path (i.e. on Ubuntu)
24+
- set(_search_path_include "/usr/include/gmock")
25+
- set(_search_path_src "/usr/src/gmock/src")
26+
-
27+
- # check gmock_vendor path, prefer this version over a system installed
28+
- if(gmock_vendor_FOUND AND gmock_vendor_BASE_DIR)
29+
- list(INSERT _search_path_include 0 "${gmock_vendor_BASE_DIR}/include/gmock")
30+
- list(INSERT _search_path_src 0 "${gmock_vendor_BASE_DIR}/src")
31+
- endif()
32+
-
33+
- find_file(_gmock_header_file "gmock.h"
34+
- PATHS ${_search_path_include}
35+
- NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH
36+
- )
37+
- find_file(_gmock_src_file
38+
- "gmock.cc"
39+
- "gmock-all.cc"
40+
- PATHS ${_search_path_src}
41+
- NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH
42+
- )
43+
-
44+
- if(_gmock_header_file AND _gmock_src_file)
45+
- # set from-source variables
46+
- set(GMOCK_FROM_SOURCE_FOUND TRUE CACHE INTERNAL "")
47+
-
48+
- get_filename_component(_gmock_base_dir "${_gmock_src_file}" PATH)
49+
- get_filename_component(_gmock_base_dir "${_gmock_base_dir}" PATH)
50+
- set(GMOCK_FROM_SOURCE_BASE_DIR "${_gmock_base_dir}" CACHE INTERNAL "")
51+
-
52+
- get_filename_component(_gmock_include_dir "${_gmock_header_file}" PATH)
53+
- get_filename_component(_gmock_include_dir ${_gmock_include_dir} PATH)
54+
- set(GMOCK_FROM_SOURCE_INCLUDE_DIRS "${_gmock_include_dir}" CACHE INTERNAL "")
55+
-
56+
- set(GMOCK_FROM_SOURCE_LIBRARY_DIRS "${CMAKE_BINARY_DIR}/gmock" CACHE INTERNAL "")
57+
-
58+
- set(GMOCK_FROM_SOURCE_LIBRARIES "gmock" CACHE INTERNAL "")
59+
- set(GMOCK_FROM_SOURCE_MAIN_LIBRARIES "gmock_main" CACHE INTERNAL "")
60+
- endif()
61+
- endif()
62+
-
63+
- if(GMOCK_FROM_SOURCE_FOUND)
64+
- message(STATUS "Found gmock sources under '${GMOCK_FROM_SOURCE_BASE_DIR}': "
65+
- "C++ tests using 'Google Mock' will be built")
66+
-
67+
- # if gmock is already a target, do not add again
68+
- # this can happen when ament_add_gmock() is called from a subdirectory
69+
- if(NOT TARGET gmock)
70+
- # add CMakeLists.txt from gmock dir
71+
- add_subdirectory("${GMOCK_FROM_SOURCE_BASE_DIR}" "${CMAKE_BINARY_DIR}/gmock")
72+
-
73+
- # mark gmock targets with EXCLUDE_FROM_ALL to only build
74+
- # when tests are built which depend on them
75+
- set_target_properties(gmock gmock_main PROPERTIES EXCLUDE_FROM_ALL 1)
76+
- endif()
77+
-
78+
- # set the same variables as find_package() would set
79+
- # but do NOT set GMOCK_FOUND in the cache when using gmock from source
80+
- # since the subdirectory must always be added to add the gmock targets
81+
- set(GMOCK_FOUND ${GMOCK_FROM_SOURCE_FOUND})
82+
- set(GMOCK_INCLUDE_DIRS ${GMOCK_FROM_SOURCE_INCLUDE_DIRS})
83+
- set(GMOCK_LIBRARY_DIRS ${GMOCK_FROM_SOURCE_LIBRARY_DIRS})
84+
- set(GMOCK_LIBRARIES ${GMOCK_FROM_SOURCE_LIBRARIES})
85+
- set(GMOCK_MAIN_LIBRARIES ${GMOCK_FROM_SOURCE_MAIN_LIBRARIES})
86+
-
87+
- if(GMOCK_FROM_SOURCE_BASE_DIR STREQUAL gmock_vendor_BASE_DIR)
88+
- # the GMock headers require the GTest headers
89+
- find_package(ament_cmake_gtest REQUIRED)
90+
- ament_find_gtest()
91+
- list(APPEND GMOCK_INCLUDE_DIRS ${GTEST_INCLUDE_DIRS})
92+
- endif()
93+
- endif()
94+
-
95+
- if(NOT GMOCK_FOUND)
96+
- message(WARNING
97+
- "'gmock' not found, C++ tests using 'Google Mock' can not be built. "
98+
- "Please install the 'Google Mock' headers globally in your system to "
99+
- "enable these tests (e.g. on Ubuntu/Debian install the package "
100+
- "'google-mock') or get the ament package 'gmock_vendor'")
101+
- endif()
102+
+ # Not a typo. GTest provides GMock
103+
+ find_package(GTest REQUIRED)
104+
+ ament_find_gmock()
105+
endif()
106+
endmacro()
107+
108+
+
109+
include("${ament_cmake_gmock_DIR}/ament_add_gmock.cmake")
110+
include("${ament_cmake_gmock_DIR}/ament_find_gmock.cmake")
111+
diff --git a/cmake/ament_find_gmock.cmake b/cmake/ament_find_gmock.cmake
112+
index 58802b7..5e4d1fe 100644
113+
--- a/cmake/ament_find_gmock.cmake
114+
+++ b/cmake/ament_find_gmock.cmake
115+
@@ -22,6 +22,7 @@
116+
# ``GMOCK_LIBRARIES`` or ``GMOCK_MAIN_LIBRARIES``
117+
#
118+
# @public
119+
+# @deprecated
120+
#
121+
macro(ament_find_gmock)
122+
set(_ARGN "${ARGN}")
123+
@@ -29,5 +30,9 @@ macro(ament_find_gmock)
124+
message(FATAL_ERROR
125+
"ament_find_gmock() called with unused arguments: ${_ARGN}")
126+
endif()
127+
- _ament_cmake_gmock_find_gmock()
128+
+ # Not a typo. GMock is provided by GTest package
129+
+ find_package(GTest REQUIRED)
130+
+ set(GMOCK_FOUND ${GTest_FOUND})
131+
+ set(GMOCK_LIBRARIES GTest::gmock GTest::gtest)
132+
+ set(GMOCK_MAIN_LIBRARIES GTest::gmock_main)
133+
endmacro()
134+
diff --git a/package.xml b/package.xml
135+
index 3e6ddee..dc0128e 100644
136+
--- a/package.xml
137+
+++ b/package.xml
138+
@@ -16,8 +16,7 @@
139+
140+
<buildtool_export_depend>ament_cmake_gtest</buildtool_export_depend>
141+
<buildtool_export_depend>ament_cmake_test</buildtool_export_depend>
142+
- <buildtool_export_depend>gmock_vendor</buildtool_export_depend>
143+
- <buildtool_export_depend>google-mock</buildtool_export_depend>
144+
+ <buildtool_export_depend>libgmock-dev</buildtool_export_depend>
145+
146+
<export>
147+
<build_type>ament_cmake</build_type>
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
diff --git a/ament_cmake_gtest-extras.cmake b/ament_cmake_gtest-extras.cmake
2+
index c60c1f1..316b8b3 100644
3+
--- a/ament_cmake_gtest-extras.cmake
4+
+++ b/ament_cmake_gtest-extras.cmake
5+
@@ -20,98 +20,8 @@ macro(_ament_cmake_gtest_find_gtest)
6+
set(_AMENT_CMAKE_GTEST_FIND_GTEST TRUE)
7+
8+
find_package(ament_cmake_test QUIET REQUIRED)
9+
-
10+
- # if gtest sources were not found in a previous run
11+
- if(NOT GTEST_FROM_SOURCE_FOUND)
12+
- # search path for gtest includes and sources
13+
- set(_search_path_include "")
14+
- set(_search_path_src "")
15+
-
16+
- # option() consider environment variable to find gtest
17+
- if(NOT $ENV{GTEST_DIR} STREQUAL "")
18+
- list(APPEND _search_path_include "$ENV{GTEST_DIR}/include/gtest")
19+
- list(APPEND _search_path_src "$ENV{GTEST_DIR}/src")
20+
- endif()
21+
-
22+
- # check to system installed path (i.e. on Ubuntu)
23+
- set(_search_path_include "/usr/include/gtest")
24+
- set(_search_path_src "/usr/src/gtest/src")
25+
-
26+
- # check gtest_vendor path, prefer this version over a system installed
27+
- find_package(gtest_vendor QUIET)
28+
- if(gtest_vendor_FOUND AND gtest_vendor_BASE_DIR)
29+
- list(INSERT _search_path_include 0 "${gtest_vendor_BASE_DIR}/include/gtest")
30+
- list(INSERT _search_path_src 0 "${gtest_vendor_BASE_DIR}/src")
31+
- endif()
32+
-
33+
- find_file(_gtest_header_file "gtest.h"
34+
- PATHS ${_search_path_include}
35+
- NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH
36+
- )
37+
- find_file(_gtest_src_file
38+
- "gtest.cc"
39+
- "gtest-all.cc"
40+
- PATHS ${_search_path_src}
41+
- NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH
42+
- )
43+
-
44+
- if(_gtest_header_file AND _gtest_src_file)
45+
- # set from-source variables
46+
- set(GTEST_FROM_SOURCE_FOUND TRUE CACHE INTERNAL "")
47+
-
48+
- get_filename_component(_gtest_base_dir "${_gtest_src_file}" PATH)
49+
- get_filename_component(_gtest_base_dir "${_gtest_base_dir}" PATH)
50+
- set(GTEST_FROM_SOURCE_BASE_DIR "${_gtest_base_dir}" CACHE INTERNAL "")
51+
-
52+
- get_filename_component(_gtest_include_dir "${_gtest_header_file}" PATH)
53+
- get_filename_component(_gtest_include_dir ${_gtest_include_dir} PATH)
54+
- set(GTEST_FROM_SOURCE_INCLUDE_DIRS "${_gtest_include_dir}" CACHE INTERNAL "")
55+
-
56+
- set(GTEST_FROM_SOURCE_LIBRARY_DIRS "${CMAKE_BINARY_DIR}/gtest" CACHE INTERNAL "")
57+
-
58+
- set(GTEST_FROM_SOURCE_LIBRARIES "gtest" CACHE INTERNAL "")
59+
- set(GTEST_FROM_SOURCE_MAIN_LIBRARIES "gtest_main" CACHE INTERNAL "")
60+
- endif()
61+
- endif()
62+
-
63+
- if(GTEST_FROM_SOURCE_FOUND)
64+
- message(STATUS "Found gtest sources under '${GTEST_FROM_SOURCE_BASE_DIR}': "
65+
- "C++ tests using 'Google Test' will be built")
66+
-
67+
- # if the gtest sources are from a subfolder of gmock (not the case for gmock_vendor)
68+
- # the subdirectory was already added by gmock
69+
- if(NOT TARGET gtest)
70+
- # add CMakeLists.txt from gtest dir
71+
- add_subdirectory("${GTEST_FROM_SOURCE_BASE_DIR}" "${CMAKE_BINARY_DIR}/gtest")
72+
-
73+
- # mark gtest targets with EXCLUDE_FROM_ALL to only build
74+
- # when tests are built which depend on them
75+
- set_target_properties(gtest gtest_main PROPERTIES EXCLUDE_FROM_ALL 1)
76+
- if(NOT WIN32)
77+
- target_compile_options(gtest PRIVATE -Wno-null-dereference)
78+
- endif()
79+
- target_include_directories(gtest SYSTEM BEFORE PUBLIC "${GTEST_FROM_SOURCE_INCLUDE_DIRS}")
80+
- target_include_directories(gtest_main SYSTEM BEFORE PUBLIC "${GTEST_FROM_SOURCE_INCLUDE_DIRS}")
81+
- endif()
82+
-
83+
- # set the same variables as find_package()
84+
- # but do NOT set GTEST_FOUND in the cache when using gtest from source
85+
- # since the subdirectory must always be added to add the gtest targets
86+
- set(GTEST_FOUND ${GTEST_FROM_SOURCE_FOUND})
87+
- set(GTEST_INCLUDE_DIRS ${GTEST_FROM_SOURCE_INCLUDE_DIRS})
88+
- set(GTEST_LIBRARY_DIRS ${GTEST_FROM_SOURCE_LIBRARY_DIRS})
89+
- set(GTEST_LIBRARIES ${GTEST_FROM_SOURCE_LIBRARIES})
90+
- set(GTEST_MAIN_LIBRARIES ${GTEST_FROM_SOURCE_MAIN_LIBRARIES})
91+
- set(GTEST_BOTH_LIBRARIES ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES})
92+
- endif()
93+
-
94+
- if(NOT GTEST_FOUND)
95+
- message(WARNING
96+
- "'gtest' not found, C++ tests using 'Google Test' can not be built. "
97+
- "Please install the 'Google Test' headers globally in your system "
98+
- "to enable these tests (e.g. on Ubuntu/Debian install the package "
99+
- "'libgtest-dev') or get the ament package 'gtest_vendor'")
100+
- endif()
101+
+ find_package(GTest REQUIRED)
102+
+ ament_find_gtest()
103+
endif()
104+
endmacro()
105+
106+
diff --git a/cmake/ament_add_gtest_executable.cmake b/cmake/ament_add_gtest_executable.cmake
107+
index e287b89..e12674c 100644
108+
--- a/cmake/ament_add_gtest_executable.cmake
109+
+++ b/cmake/ament_add_gtest_executable.cmake
110+
@@ -33,7 +33,7 @@
111+
#
112+
macro(ament_add_gtest_executable target)
113+
_ament_cmake_gtest_find_gtest()
114+
- if(GTEST_FOUND)
115+
+ if(GTest_FOUND)
116+
_ament_add_gtest_executable("${target}" ${ARGN})
117+
endif()
118+
endmacro()
119+
diff --git a/cmake/ament_find_gtest.cmake b/cmake/ament_find_gtest.cmake
120+
index 9158be1..72a30f9 100644
121+
--- a/cmake/ament_find_gtest.cmake
122+
+++ b/cmake/ament_find_gtest.cmake
123+
@@ -23,6 +23,7 @@
124+
# additionally against ``GTEST_MAIN_LIBRARIES``.
125+
#
126+
# @public
127+
+# @deprecated
128+
#
129+
macro(ament_find_gtest)
130+
set(_ARGN "${ARGN}")
131+
@@ -30,5 +31,6 @@ macro(ament_find_gtest)
132+
message(FATAL_ERROR
133+
"ament_find_gtest() called with unused arguments: ${_ARGN}")
134+
endif()
135+
- _ament_cmake_gtest_find_gtest()
136+
+ find_package(GTest REQUIRED)
137+
+ set(GTEST_FOUND ${GTest_FOUND})
138+
endmacro()
139+
diff --git a/package.xml b/package.xml
140+
index 7b2b9a9..0e9322a 100644
141+
--- a/package.xml
142+
+++ b/package.xml
143+
@@ -15,8 +15,7 @@
144+
<buildtool_depend>ament_cmake_core</buildtool_depend>
145+
146+
<buildtool_export_depend>ament_cmake_test</buildtool_export_depend>
147+
- <buildtool_export_depend>gtest</buildtool_export_depend>
148+
- <buildtool_export_depend>gtest_vendor</buildtool_export_depend>
149+
+ <buildtool_export_depend>libgtest-dev</buildtool_export_depend>
150+
151+
<export>
152+
<build_type>ament_cmake</build_type>

‎distros/humble/pkg_additional_info.yaml‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,7 @@ urdfdom_headers:
105105
# Remove build_number fields below on new full rebuild
106106
zenoh_cpp_vendor:
107107
additional_cmake_args: "-DAMENT_VENDOR_POLICY=NEVER_VENDOR_IGNORE_SATISFIED_CHECK -DUSE_SYSTEM_ZENOH=ON"
108+
ament_cmake_gmock: # as ament_cmake_gtest
109+
build_number: 23
110+
ament_cmake_gtest: # uses conda-forge's gtest instead of gtest_vendor's sources
111+
build_number: 23

0 commit comments

Comments
 (0)