From a72cc65ab44864c2deaf6262cef08b990b5952c8 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 19 Oct 2026 13:05:19 +1000 Subject: [PATCH 1/2] 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 --- .../humble/patch/ros2-ament-cmake-gmock.patch | 147 ++++++++++++++++ .../humble/patch/ros2-ament-cmake-gtest.patch | 152 ++++++++++++++++ .../jazzy/patch/ros2-ament-cmake-gmock.patch | 162 ++++++++++++++++++ .../jazzy/patch/ros2-ament-cmake-gtest.patch | 152 ++++++++++++++++ 4 files changed, 613 insertions(+) create mode 100644 distros/humble/patch/ros2-ament-cmake-gmock.patch create mode 100644 distros/humble/patch/ros2-ament-cmake-gtest.patch create mode 100644 distros/jazzy/patch/ros2-ament-cmake-gmock.patch create mode 100644 distros/jazzy/patch/ros2-ament-cmake-gtest.patch diff --git a/distros/humble/patch/ros2-ament-cmake-gmock.patch b/distros/humble/patch/ros2-ament-cmake-gmock.patch new file mode 100644 index 00000000..9a227f41 --- /dev/null +++ b/distros/humble/patch/ros2-ament-cmake-gmock.patch @@ -0,0 +1,147 @@ +diff --git a/ament_cmake_gmock-extras.cmake b/ament_cmake_gmock-extras.cmake +index 631d059..2dc3846 100644 +--- a/ament_cmake_gmock-extras.cmake ++++ b/ament_cmake_gmock-extras.cmake +@@ -20,101 +20,12 @@ macro(_ament_cmake_gmock_find_gmock) + set(_AMENT_CMAKE_GMOCK_FIND_GMOCK TRUE) + + find_package(ament_cmake_test QUIET REQUIRED) +- find_package(gmock_vendor QUIET) +- +- # if gmock sources were not found in a previous run +- if(NOT GMOCK_FROM_SOURCE_FOUND) +- # search path for gmock includes and sources +- set(_search_path_include "") +- set(_search_path_src "") +- +- # option() consider environment variable to find gmock +- if(NOT $ENV{GMOCK_DIR} STREQUAL "") +- list(APPEND _search_path_include "$ENV{GMOCK_DIR}/include/gmock") +- list(APPEND _search_path_src "$ENV{GMOCK_DIR}/src") +- endif() +- +- # check to system installed path (i.e. on Ubuntu) +- set(_search_path_include "/usr/include/gmock") +- set(_search_path_src "/usr/src/gmock/src") +- +- # check gmock_vendor path, prefer this version over a system installed +- if(gmock_vendor_FOUND AND gmock_vendor_BASE_DIR) +- list(INSERT _search_path_include 0 "${gmock_vendor_BASE_DIR}/include/gmock") +- list(INSERT _search_path_src 0 "${gmock_vendor_BASE_DIR}/src") +- endif() +- +- find_file(_gmock_header_file "gmock.h" +- PATHS ${_search_path_include} +- NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH +- ) +- find_file(_gmock_src_file +- "gmock.cc" +- "gmock-all.cc" +- PATHS ${_search_path_src} +- NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH +- ) +- +- if(_gmock_header_file AND _gmock_src_file) +- # set from-source variables +- set(GMOCK_FROM_SOURCE_FOUND TRUE CACHE INTERNAL "") +- +- get_filename_component(_gmock_base_dir "${_gmock_src_file}" PATH) +- get_filename_component(_gmock_base_dir "${_gmock_base_dir}" PATH) +- set(GMOCK_FROM_SOURCE_BASE_DIR "${_gmock_base_dir}" CACHE INTERNAL "") +- +- get_filename_component(_gmock_include_dir "${_gmock_header_file}" PATH) +- get_filename_component(_gmock_include_dir ${_gmock_include_dir} PATH) +- set(GMOCK_FROM_SOURCE_INCLUDE_DIRS "${_gmock_include_dir}" CACHE INTERNAL "") +- +- set(GMOCK_FROM_SOURCE_LIBRARY_DIRS "${CMAKE_BINARY_DIR}/gmock" CACHE INTERNAL "") +- +- set(GMOCK_FROM_SOURCE_LIBRARIES "gmock" CACHE INTERNAL "") +- set(GMOCK_FROM_SOURCE_MAIN_LIBRARIES "gmock_main" CACHE INTERNAL "") +- endif() +- endif() +- +- if(GMOCK_FROM_SOURCE_FOUND) +- message(STATUS "Found gmock sources under '${GMOCK_FROM_SOURCE_BASE_DIR}': " +- "C++ tests using 'Google Mock' will be built") +- +- # if gmock is already a target, do not add again +- # this can happen when ament_add_gmock() is called from a subdirectory +- if(NOT TARGET gmock) +- # add CMakeLists.txt from gmock dir +- add_subdirectory("${GMOCK_FROM_SOURCE_BASE_DIR}" "${CMAKE_BINARY_DIR}/gmock") +- +- # mark gmock targets with EXCLUDE_FROM_ALL to only build +- # when tests are built which depend on them +- set_target_properties(gmock gmock_main PROPERTIES EXCLUDE_FROM_ALL 1) +- endif() +- +- # set the same variables as find_package() would set +- # but do NOT set GMOCK_FOUND in the cache when using gmock from source +- # since the subdirectory must always be added to add the gmock targets +- set(GMOCK_FOUND ${GMOCK_FROM_SOURCE_FOUND}) +- set(GMOCK_INCLUDE_DIRS ${GMOCK_FROM_SOURCE_INCLUDE_DIRS}) +- set(GMOCK_LIBRARY_DIRS ${GMOCK_FROM_SOURCE_LIBRARY_DIRS}) +- set(GMOCK_LIBRARIES ${GMOCK_FROM_SOURCE_LIBRARIES}) +- set(GMOCK_MAIN_LIBRARIES ${GMOCK_FROM_SOURCE_MAIN_LIBRARIES}) +- +- if(GMOCK_FROM_SOURCE_BASE_DIR STREQUAL gmock_vendor_BASE_DIR) +- # the GMock headers require the GTest headers +- find_package(ament_cmake_gtest REQUIRED) +- ament_find_gtest() +- list(APPEND GMOCK_INCLUDE_DIRS ${GTEST_INCLUDE_DIRS}) +- endif() +- endif() +- +- if(NOT GMOCK_FOUND) +- message(WARNING +- "'gmock' not found, C++ tests using 'Google Mock' can not be built. " +- "Please install the 'Google Mock' headers globally in your system to " +- "enable these tests (e.g. on Ubuntu/Debian install the package " +- "'google-mock') or get the ament package 'gmock_vendor'") +- endif() ++ # Not a typo. GTest provides GMock ++ find_package(GTest REQUIRED) ++ ament_find_gmock() + endif() + endmacro() + ++ + include("${ament_cmake_gmock_DIR}/ament_add_gmock.cmake") + include("${ament_cmake_gmock_DIR}/ament_find_gmock.cmake") +diff --git a/cmake/ament_find_gmock.cmake b/cmake/ament_find_gmock.cmake +index 58802b7..5e4d1fe 100644 +--- a/cmake/ament_find_gmock.cmake ++++ b/cmake/ament_find_gmock.cmake +@@ -22,6 +22,7 @@ + # ``GMOCK_LIBRARIES`` or ``GMOCK_MAIN_LIBRARIES`` + # + # @public ++# @deprecated + # + macro(ament_find_gmock) + set(_ARGN "${ARGN}") +@@ -29,5 +30,9 @@ macro(ament_find_gmock) + message(FATAL_ERROR + "ament_find_gmock() called with unused arguments: ${_ARGN}") + endif() +- _ament_cmake_gmock_find_gmock() ++ # Not a typo. GMock is provided by GTest package ++ find_package(GTest REQUIRED) ++ set(GMOCK_FOUND ${GTest_FOUND}) ++ set(GMOCK_LIBRARIES GTest::gmock GTest::gtest) ++ set(GMOCK_MAIN_LIBRARIES GTest::gmock_main) + endmacro() +diff --git a/package.xml b/package.xml +index 3e6ddee..dc0128e 100644 +--- a/package.xml ++++ b/package.xml +@@ -16,8 +16,7 @@ + + ament_cmake_gtest + ament_cmake_test +- gmock_vendor +- google-mock ++ libgmock-dev + + + ament_cmake diff --git a/distros/humble/patch/ros2-ament-cmake-gtest.patch b/distros/humble/patch/ros2-ament-cmake-gtest.patch new file mode 100644 index 00000000..05f5dedb --- /dev/null +++ b/distros/humble/patch/ros2-ament-cmake-gtest.patch @@ -0,0 +1,152 @@ +diff --git a/ament_cmake_gtest-extras.cmake b/ament_cmake_gtest-extras.cmake +index c60c1f1..316b8b3 100644 +--- a/ament_cmake_gtest-extras.cmake ++++ b/ament_cmake_gtest-extras.cmake +@@ -20,98 +20,8 @@ macro(_ament_cmake_gtest_find_gtest) + set(_AMENT_CMAKE_GTEST_FIND_GTEST TRUE) + + find_package(ament_cmake_test QUIET REQUIRED) +- +- # if gtest sources were not found in a previous run +- if(NOT GTEST_FROM_SOURCE_FOUND) +- # search path for gtest includes and sources +- set(_search_path_include "") +- set(_search_path_src "") +- +- # option() consider environment variable to find gtest +- if(NOT $ENV{GTEST_DIR} STREQUAL "") +- list(APPEND _search_path_include "$ENV{GTEST_DIR}/include/gtest") +- list(APPEND _search_path_src "$ENV{GTEST_DIR}/src") +- endif() +- +- # check to system installed path (i.e. on Ubuntu) +- set(_search_path_include "/usr/include/gtest") +- set(_search_path_src "/usr/src/gtest/src") +- +- # check gtest_vendor path, prefer this version over a system installed +- find_package(gtest_vendor QUIET) +- if(gtest_vendor_FOUND AND gtest_vendor_BASE_DIR) +- list(INSERT _search_path_include 0 "${gtest_vendor_BASE_DIR}/include/gtest") +- list(INSERT _search_path_src 0 "${gtest_vendor_BASE_DIR}/src") +- endif() +- +- find_file(_gtest_header_file "gtest.h" +- PATHS ${_search_path_include} +- NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH +- ) +- find_file(_gtest_src_file +- "gtest.cc" +- "gtest-all.cc" +- PATHS ${_search_path_src} +- NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH +- ) +- +- if(_gtest_header_file AND _gtest_src_file) +- # set from-source variables +- set(GTEST_FROM_SOURCE_FOUND TRUE CACHE INTERNAL "") +- +- get_filename_component(_gtest_base_dir "${_gtest_src_file}" PATH) +- get_filename_component(_gtest_base_dir "${_gtest_base_dir}" PATH) +- set(GTEST_FROM_SOURCE_BASE_DIR "${_gtest_base_dir}" CACHE INTERNAL "") +- +- get_filename_component(_gtest_include_dir "${_gtest_header_file}" PATH) +- get_filename_component(_gtest_include_dir ${_gtest_include_dir} PATH) +- set(GTEST_FROM_SOURCE_INCLUDE_DIRS "${_gtest_include_dir}" CACHE INTERNAL "") +- +- set(GTEST_FROM_SOURCE_LIBRARY_DIRS "${CMAKE_BINARY_DIR}/gtest" CACHE INTERNAL "") +- +- set(GTEST_FROM_SOURCE_LIBRARIES "gtest" CACHE INTERNAL "") +- set(GTEST_FROM_SOURCE_MAIN_LIBRARIES "gtest_main" CACHE INTERNAL "") +- endif() +- endif() +- +- if(GTEST_FROM_SOURCE_FOUND) +- message(STATUS "Found gtest sources under '${GTEST_FROM_SOURCE_BASE_DIR}': " +- "C++ tests using 'Google Test' will be built") +- +- # if the gtest sources are from a subfolder of gmock (not the case for gmock_vendor) +- # the subdirectory was already added by gmock +- if(NOT TARGET gtest) +- # add CMakeLists.txt from gtest dir +- add_subdirectory("${GTEST_FROM_SOURCE_BASE_DIR}" "${CMAKE_BINARY_DIR}/gtest") +- +- # mark gtest targets with EXCLUDE_FROM_ALL to only build +- # when tests are built which depend on them +- set_target_properties(gtest gtest_main PROPERTIES EXCLUDE_FROM_ALL 1) +- if(NOT WIN32) +- target_compile_options(gtest PRIVATE -Wno-null-dereference) +- endif() +- target_include_directories(gtest SYSTEM BEFORE PUBLIC "${GTEST_FROM_SOURCE_INCLUDE_DIRS}") +- target_include_directories(gtest_main SYSTEM BEFORE PUBLIC "${GTEST_FROM_SOURCE_INCLUDE_DIRS}") +- endif() +- +- # set the same variables as find_package() +- # but do NOT set GTEST_FOUND in the cache when using gtest from source +- # since the subdirectory must always be added to add the gtest targets +- set(GTEST_FOUND ${GTEST_FROM_SOURCE_FOUND}) +- set(GTEST_INCLUDE_DIRS ${GTEST_FROM_SOURCE_INCLUDE_DIRS}) +- set(GTEST_LIBRARY_DIRS ${GTEST_FROM_SOURCE_LIBRARY_DIRS}) +- set(GTEST_LIBRARIES ${GTEST_FROM_SOURCE_LIBRARIES}) +- set(GTEST_MAIN_LIBRARIES ${GTEST_FROM_SOURCE_MAIN_LIBRARIES}) +- set(GTEST_BOTH_LIBRARIES ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES}) +- endif() +- +- if(NOT GTEST_FOUND) +- message(WARNING +- "'gtest' not found, C++ tests using 'Google Test' can not be built. " +- "Please install the 'Google Test' headers globally in your system " +- "to enable these tests (e.g. on Ubuntu/Debian install the package " +- "'libgtest-dev') or get the ament package 'gtest_vendor'") +- endif() ++ find_package(GTest REQUIRED) ++ ament_find_gtest() + endif() + endmacro() + +diff --git a/cmake/ament_add_gtest_executable.cmake b/cmake/ament_add_gtest_executable.cmake +index e287b89..e12674c 100644 +--- a/cmake/ament_add_gtest_executable.cmake ++++ b/cmake/ament_add_gtest_executable.cmake +@@ -33,7 +33,7 @@ + # + macro(ament_add_gtest_executable target) + _ament_cmake_gtest_find_gtest() +- if(GTEST_FOUND) ++ if(GTest_FOUND) + _ament_add_gtest_executable("${target}" ${ARGN}) + endif() + endmacro() +diff --git a/cmake/ament_find_gtest.cmake b/cmake/ament_find_gtest.cmake +index 9158be1..72a30f9 100644 +--- a/cmake/ament_find_gtest.cmake ++++ b/cmake/ament_find_gtest.cmake +@@ -23,6 +23,7 @@ + # additionally against ``GTEST_MAIN_LIBRARIES``. + # + # @public ++# @deprecated + # + macro(ament_find_gtest) + set(_ARGN "${ARGN}") +@@ -30,5 +31,6 @@ macro(ament_find_gtest) + message(FATAL_ERROR + "ament_find_gtest() called with unused arguments: ${_ARGN}") + endif() +- _ament_cmake_gtest_find_gtest() ++ find_package(GTest REQUIRED) ++ set(GTEST_FOUND ${GTest_FOUND}) + endmacro() +diff --git a/package.xml b/package.xml +index 7b2b9a9..0e9322a 100644 +--- a/package.xml ++++ b/package.xml +@@ -15,8 +15,7 @@ + ament_cmake_core + + ament_cmake_test +- gtest +- gtest_vendor ++ libgtest-dev + + + ament_cmake diff --git a/distros/jazzy/patch/ros2-ament-cmake-gmock.patch b/distros/jazzy/patch/ros2-ament-cmake-gmock.patch new file mode 100644 index 00000000..347a9e88 --- /dev/null +++ b/distros/jazzy/patch/ros2-ament-cmake-gmock.patch @@ -0,0 +1,162 @@ +diff --git a/ament_cmake_gmock-extras.cmake b/ament_cmake_gmock-extras.cmake +index d6125540..ff98620e 100644 +--- a/ament_cmake_gmock-extras.cmake ++++ b/ament_cmake_gmock-extras.cmake +@@ -20,102 +20,13 @@ macro(_ament_cmake_gmock_find_gmock) + set(_AMENT_CMAKE_GMOCK_FIND_GMOCK TRUE) + + find_package(ament_cmake_test QUIET REQUIRED) +- find_package(gmock_vendor QUIET) +- +- # if gmock sources were not found in a previous run +- if(NOT GMOCK_FROM_SOURCE_FOUND) +- # search path for gmock includes and sources +- set(_search_path_include "") +- set(_search_path_src "") +- +- # option() consider environment variable to find gmock +- if(NOT $ENV{GMOCK_DIR} STREQUAL "") +- list(APPEND _search_path_include "$ENV{GMOCK_DIR}/include/gmock") +- list(APPEND _search_path_src "$ENV{GMOCK_DIR}/src") +- endif() +- +- # check to system installed path (i.e. on Ubuntu) +- set(_search_path_include "/usr/include/gmock") +- set(_search_path_src "/usr/src/gmock/src") +- +- # check gmock_vendor path, prefer this version over a system installed +- if(gmock_vendor_FOUND AND gmock_vendor_BASE_DIR) +- list(INSERT _search_path_include 0 "${gmock_vendor_BASE_DIR}/include/gmock") +- list(INSERT _search_path_src 0 "${gmock_vendor_BASE_DIR}/src") +- endif() +- +- find_file(_gmock_header_file "gmock.h" +- PATHS ${_search_path_include} +- NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH +- ) +- find_file(_gmock_src_file +- "gmock.cc" +- "gmock-all.cc" +- PATHS ${_search_path_src} +- NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH +- ) +- +- if(_gmock_header_file AND _gmock_src_file) +- # set from-source variables +- set(GMOCK_FROM_SOURCE_FOUND TRUE CACHE INTERNAL "") +- +- get_filename_component(_gmock_base_dir "${_gmock_src_file}" PATH) +- get_filename_component(_gmock_base_dir "${_gmock_base_dir}" PATH) +- set(GMOCK_FROM_SOURCE_BASE_DIR "${_gmock_base_dir}" CACHE INTERNAL "") +- +- get_filename_component(_gmock_include_dir "${_gmock_header_file}" PATH) +- get_filename_component(_gmock_include_dir ${_gmock_include_dir} PATH) +- set(GMOCK_FROM_SOURCE_INCLUDE_DIRS "${_gmock_include_dir}" CACHE INTERNAL "") +- +- set(GMOCK_FROM_SOURCE_LIBRARY_DIRS "${CMAKE_BINARY_DIR}/gmock" CACHE INTERNAL "") +- +- set(GMOCK_FROM_SOURCE_LIBRARIES "gmock" CACHE INTERNAL "") +- set(GMOCK_FROM_SOURCE_MAIN_LIBRARIES "gmock_main" CACHE INTERNAL "") +- endif() +- endif() +- +- if(GMOCK_FROM_SOURCE_FOUND) +- message(STATUS "Found gmock sources under '${GMOCK_FROM_SOURCE_BASE_DIR}': " +- "C++ tests using 'Google Mock' will be built") +- +- # if gmock is already a target, do not add again +- # this can happen when ament_add_gmock() is called from a subdirectory +- if(NOT TARGET gmock) +- # add CMakeLists.txt from gmock dir +- add_subdirectory("${GMOCK_FROM_SOURCE_BASE_DIR}" "${CMAKE_BINARY_DIR}/gmock") +- +- # mark gmock targets with EXCLUDE_FROM_ALL to only build +- # when tests are built which depend on them +- set_target_properties(gmock gmock_main PROPERTIES EXCLUDE_FROM_ALL 1) +- endif() +- +- # set the same variables as find_package() would set +- # but do NOT set GMOCK_FOUND in the cache when using gmock from source +- # since the subdirectory must always be added to add the gmock targets +- set(GMOCK_FOUND ${GMOCK_FROM_SOURCE_FOUND}) +- set(GMOCK_INCLUDE_DIRS ${GMOCK_FROM_SOURCE_INCLUDE_DIRS}) +- set(GMOCK_LIBRARY_DIRS ${GMOCK_FROM_SOURCE_LIBRARY_DIRS}) +- set(GMOCK_LIBRARIES ${GMOCK_FROM_SOURCE_LIBRARIES}) +- set(GMOCK_MAIN_LIBRARIES ${GMOCK_FROM_SOURCE_MAIN_LIBRARIES}) +- +- if(GMOCK_FROM_SOURCE_BASE_DIR STREQUAL gmock_vendor_BASE_DIR) +- # the GMock headers require the GTest headers +- find_package(ament_cmake_gtest REQUIRED) +- ament_find_gtest() +- list(APPEND GMOCK_INCLUDE_DIRS ${GTEST_INCLUDE_DIRS}) +- endif() +- endif() +- +- if(NOT GMOCK_FOUND) +- message(WARNING +- "'gmock' not found, C++ tests using 'Google Mock' can not be built. " +- "Please install the 'Google Mock' headers globally in your system to " +- "enable these tests (e.g. on Ubuntu/Debian install the package " +- "'google-mock') or get the ament package 'gmock_vendor'") +- endif() ++ # Not a typo. GTest provides GMock ++ find_package(GTest REQUIRED) ++ ament_find_gmock() + endif() + endmacro() + ++ + include("${ament_cmake_gmock_DIR}/ament_add_gmock.cmake") + include("${ament_cmake_gmock_DIR}/ament_add_gmock_executable.cmake") + include("${ament_cmake_gmock_DIR}/ament_add_gmock_test.cmake") +diff --git a/cmake/ament_add_gmock_executable.cmake b/cmake/ament_add_gmock_executable.cmake +index a1fcaea4..5716654e 100644 +--- a/cmake/ament_add_gmock_executable.cmake ++++ b/cmake/ament_add_gmock_executable.cmake +@@ -33,7 +33,8 @@ + # + macro(ament_add_gmock_executable target) + _ament_cmake_gmock_find_gmock() +- if(GMOCK_FOUND) ++ # Not a typo. GTest provides GMock ++ if(GTest_FOUND) + _ament_add_gmock_executable("${target}" ${ARGN}) + endif() + endmacro() +diff --git a/cmake/ament_find_gmock.cmake b/cmake/ament_find_gmock.cmake +index 58802b74..5e4d1fe9 100644 +--- a/cmake/ament_find_gmock.cmake ++++ b/cmake/ament_find_gmock.cmake +@@ -22,6 +22,7 @@ + # ``GMOCK_LIBRARIES`` or ``GMOCK_MAIN_LIBRARIES`` + # + # @public ++# @deprecated + # + macro(ament_find_gmock) + set(_ARGN "${ARGN}") +@@ -29,5 +30,9 @@ macro(ament_find_gmock) + message(FATAL_ERROR + "ament_find_gmock() called with unused arguments: ${_ARGN}") + endif() +- _ament_cmake_gmock_find_gmock() ++ # Not a typo. GMock is provided by GTest package ++ find_package(GTest REQUIRED) ++ set(GMOCK_FOUND ${GTest_FOUND}) ++ set(GMOCK_LIBRARIES GTest::gmock GTest::gtest) ++ set(GMOCK_MAIN_LIBRARIES GTest::gmock_main) + endmacro() +diff --git a/package.xml b/package.xml +index 089f7641..ce9ecbd0 100644 +--- a/package.xml ++++ b/package.xml +@@ -16,8 +16,7 @@ + + ament_cmake_gtest + ament_cmake_test +- gmock_vendor +- google-mock ++ libgmock-dev + + + ament_cmake diff --git a/distros/jazzy/patch/ros2-ament-cmake-gtest.patch b/distros/jazzy/patch/ros2-ament-cmake-gtest.patch new file mode 100644 index 00000000..dcd21de7 --- /dev/null +++ b/distros/jazzy/patch/ros2-ament-cmake-gtest.patch @@ -0,0 +1,152 @@ +diff --git a/ament_cmake_gtest-extras.cmake b/ament_cmake_gtest-extras.cmake +index c60c1f1..316b8b3 100644 +--- a/ament_cmake_gtest-extras.cmake ++++ b/ament_cmake_gtest-extras.cmake +@@ -20,98 +20,8 @@ macro(_ament_cmake_gtest_find_gtest) + set(_AMENT_CMAKE_GTEST_FIND_GTEST TRUE) + + find_package(ament_cmake_test QUIET REQUIRED) +- +- # if gtest sources were not found in a previous run +- if(NOT GTEST_FROM_SOURCE_FOUND) +- # search path for gtest includes and sources +- set(_search_path_include "") +- set(_search_path_src "") +- +- # option() consider environment variable to find gtest +- if(NOT $ENV{GTEST_DIR} STREQUAL "") +- list(APPEND _search_path_include "$ENV{GTEST_DIR}/include/gtest") +- list(APPEND _search_path_src "$ENV{GTEST_DIR}/src") +- endif() +- +- # check to system installed path (i.e. on Ubuntu) +- set(_search_path_include "/usr/include/gtest") +- set(_search_path_src "/usr/src/gtest/src") +- +- # check gtest_vendor path, prefer this version over a system installed +- find_package(gtest_vendor QUIET) +- if(gtest_vendor_FOUND AND gtest_vendor_BASE_DIR) +- list(INSERT _search_path_include 0 "${gtest_vendor_BASE_DIR}/include/gtest") +- list(INSERT _search_path_src 0 "${gtest_vendor_BASE_DIR}/src") +- endif() +- +- find_file(_gtest_header_file "gtest.h" +- PATHS ${_search_path_include} +- NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH +- ) +- find_file(_gtest_src_file +- "gtest.cc" +- "gtest-all.cc" +- PATHS ${_search_path_src} +- NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH +- ) +- +- if(_gtest_header_file AND _gtest_src_file) +- # set from-source variables +- set(GTEST_FROM_SOURCE_FOUND TRUE CACHE INTERNAL "") +- +- get_filename_component(_gtest_base_dir "${_gtest_src_file}" PATH) +- get_filename_component(_gtest_base_dir "${_gtest_base_dir}" PATH) +- set(GTEST_FROM_SOURCE_BASE_DIR "${_gtest_base_dir}" CACHE INTERNAL "") +- +- get_filename_component(_gtest_include_dir "${_gtest_header_file}" PATH) +- get_filename_component(_gtest_include_dir ${_gtest_include_dir} PATH) +- set(GTEST_FROM_SOURCE_INCLUDE_DIRS "${_gtest_include_dir}" CACHE INTERNAL "") +- +- set(GTEST_FROM_SOURCE_LIBRARY_DIRS "${CMAKE_BINARY_DIR}/gtest" CACHE INTERNAL "") +- +- set(GTEST_FROM_SOURCE_LIBRARIES "gtest" CACHE INTERNAL "") +- set(GTEST_FROM_SOURCE_MAIN_LIBRARIES "gtest_main" CACHE INTERNAL "") +- endif() +- endif() +- +- if(GTEST_FROM_SOURCE_FOUND) +- message(STATUS "Found gtest sources under '${GTEST_FROM_SOURCE_BASE_DIR}': " +- "C++ tests using 'Google Test' will be built") +- +- # if the gtest sources are from a subfolder of gmock (not the case for gmock_vendor) +- # the subdirectory was already added by gmock +- if(NOT TARGET gtest) +- # add CMakeLists.txt from gtest dir +- add_subdirectory("${GTEST_FROM_SOURCE_BASE_DIR}" "${CMAKE_BINARY_DIR}/gtest") +- +- # mark gtest targets with EXCLUDE_FROM_ALL to only build +- # when tests are built which depend on them +- set_target_properties(gtest gtest_main PROPERTIES EXCLUDE_FROM_ALL 1) +- if(NOT WIN32) +- target_compile_options(gtest PRIVATE -Wno-null-dereference) +- endif() +- target_include_directories(gtest SYSTEM BEFORE PUBLIC "${GTEST_FROM_SOURCE_INCLUDE_DIRS}") +- target_include_directories(gtest_main SYSTEM BEFORE PUBLIC "${GTEST_FROM_SOURCE_INCLUDE_DIRS}") +- endif() +- +- # set the same variables as find_package() +- # but do NOT set GTEST_FOUND in the cache when using gtest from source +- # since the subdirectory must always be added to add the gtest targets +- set(GTEST_FOUND ${GTEST_FROM_SOURCE_FOUND}) +- set(GTEST_INCLUDE_DIRS ${GTEST_FROM_SOURCE_INCLUDE_DIRS}) +- set(GTEST_LIBRARY_DIRS ${GTEST_FROM_SOURCE_LIBRARY_DIRS}) +- set(GTEST_LIBRARIES ${GTEST_FROM_SOURCE_LIBRARIES}) +- set(GTEST_MAIN_LIBRARIES ${GTEST_FROM_SOURCE_MAIN_LIBRARIES}) +- set(GTEST_BOTH_LIBRARIES ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES}) +- endif() +- +- if(NOT GTEST_FOUND) +- message(WARNING +- "'gtest' not found, C++ tests using 'Google Test' can not be built. " +- "Please install the 'Google Test' headers globally in your system " +- "to enable these tests (e.g. on Ubuntu/Debian install the package " +- "'libgtest-dev') or get the ament package 'gtest_vendor'") +- endif() ++ find_package(GTest REQUIRED) ++ ament_find_gtest() + endif() + endmacro() + +diff --git a/cmake/ament_add_gtest_executable.cmake b/cmake/ament_add_gtest_executable.cmake +index 644a23b..66a32e1 100644 +--- a/cmake/ament_add_gtest_executable.cmake ++++ b/cmake/ament_add_gtest_executable.cmake +@@ -33,7 +33,7 @@ + # + macro(ament_add_gtest_executable target) + _ament_cmake_gtest_find_gtest() +- if(GTEST_FOUND) ++ if(GTest_FOUND) + _ament_add_gtest_executable("${target}" ${ARGN}) + endif() + endmacro() +diff --git a/cmake/ament_find_gtest.cmake b/cmake/ament_find_gtest.cmake +index 9158be1..72a30f9 100644 +--- a/cmake/ament_find_gtest.cmake ++++ b/cmake/ament_find_gtest.cmake +@@ -23,6 +23,7 @@ + # additionally against ``GTEST_MAIN_LIBRARIES``. + # + # @public ++# @deprecated + # + macro(ament_find_gtest) + set(_ARGN "${ARGN}") +@@ -30,5 +31,6 @@ macro(ament_find_gtest) + message(FATAL_ERROR + "ament_find_gtest() called with unused arguments: ${_ARGN}") + endif() +- _ament_cmake_gtest_find_gtest() ++ find_package(GTest REQUIRED) ++ set(GTEST_FOUND ${GTest_FOUND}) + endmacro() +diff --git a/package.xml b/package.xml +index b83ee35..d32baa0 100644 +--- a/package.xml ++++ b/package.xml +@@ -15,8 +15,7 @@ + ament_cmake_core + + ament_cmake_test +- gtest +- gtest_vendor ++ libgtest-dev + + + ament_cmake From e9738f002e954414fc08792d933fe8382195fa6d Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 19 Oct 2026 18:33:31 +1000 Subject: [PATCH 2/2] 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 --- shared/tests/ros2-ament-cmake-gmock.yaml | 25 +++++++++++++++++++ .../gt_demo/CMakeLists.txt | 10 ++++++++ .../gt_demo/package.xml | 5 ++++ .../gt_demo/test/test_demo.cpp | 2 ++ .../gt_demo/test/test_mock.cpp | 4 +++ 5 files changed, 46 insertions(+) create mode 100644 shared/tests/ros2-ament-cmake-gmock.yaml create mode 100644 shared/tests/ros2-ament-cmake-gmock/gt_demo/CMakeLists.txt create mode 100644 shared/tests/ros2-ament-cmake-gmock/gt_demo/package.xml create mode 100644 shared/tests/ros2-ament-cmake-gmock/gt_demo/test/test_demo.cpp create mode 100644 shared/tests/ros2-ament-cmake-gmock/gt_demo/test/test_mock.cpp diff --git a/shared/tests/ros2-ament-cmake-gmock.yaml b/shared/tests/ros2-ament-cmake-gmock.yaml new file mode 100644 index 00000000..d37e940e --- /dev/null +++ b/shared/tests/ros2-ament-cmake-gmock.yaml @@ -0,0 +1,25 @@ +tests: + # Regression test (https://github.com/RoboStack/ros-kilted/issues/59): a package with an + # ament_add_gtest and an ament_add_gmock test must build and its tests run. When + # ament_cmake_gtest/gmock compiled gtest_vendor's sources against conda-forge's gtest headers + # (a different version), this failed to build or crashed. + - if: unix + then: + script: + - >- + cmake -S gt_demo -B build -G Ninja -DCMAKE_PREFIX_PATH="$PREFIX" -DBUILD_TESTING=ON + -DPYTHON_EXECUTABLE="$PREFIX/bin/python" -DPython_EXECUTABLE="$PREFIX/bin/python" + -DPython3_EXECUTABLE="$PREFIX/bin/python" -DPython3_FIND_STRATEGY=LOCATION + - cmake --build build + - ./build/test_demo + - ./build/test_mock + requirements: + build: + - cxx-compiler + - cmake + - ninja + run: + - ros2-ament-cmake # the demo package's buildtool; not a run dependency of ament_cmake_gmock + files: + recipe: + - gt_demo/ diff --git a/shared/tests/ros2-ament-cmake-gmock/gt_demo/CMakeLists.txt b/shared/tests/ros2-ament-cmake-gmock/gt_demo/CMakeLists.txt new file mode 100644 index 00000000..6fcbb68b --- /dev/null +++ b/shared/tests/ros2-ament-cmake-gmock/gt_demo/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.16) +project(gt_demo CXX) +find_package(ament_cmake REQUIRED) +if(BUILD_TESTING) + find_package(ament_cmake_gtest REQUIRED) + find_package(ament_cmake_gmock REQUIRED) + ament_add_gtest(test_demo test/test_demo.cpp) + ament_add_gmock(test_mock test/test_mock.cpp) +endif() +ament_package() diff --git a/shared/tests/ros2-ament-cmake-gmock/gt_demo/package.xml b/shared/tests/ros2-ament-cmake-gmock/gt_demo/package.xml new file mode 100644 index 00000000..ec1ea950 --- /dev/null +++ b/shared/tests/ros2-ament-cmake-gmock/gt_demo/package.xml @@ -0,0 +1,5 @@ + +gt_demo0.0.0d +aMIT +ament_cmakeament_cmake_gtestament_cmake_gmock +ament_cmake diff --git a/shared/tests/ros2-ament-cmake-gmock/gt_demo/test/test_demo.cpp b/shared/tests/ros2-ament-cmake-gmock/gt_demo/test/test_demo.cpp new file mode 100644 index 00000000..712a0b14 --- /dev/null +++ b/shared/tests/ros2-ament-cmake-gmock/gt_demo/test/test_demo.cpp @@ -0,0 +1,2 @@ +#include +TEST(Demo, Works) { EXPECT_EQ(1 + 1, 2); } diff --git a/shared/tests/ros2-ament-cmake-gmock/gt_demo/test/test_mock.cpp b/shared/tests/ros2-ament-cmake-gmock/gt_demo/test/test_mock.cpp new file mode 100644 index 00000000..ab508474 --- /dev/null +++ b/shared/tests/ros2-ament-cmake-gmock/gt_demo/test/test_mock.cpp @@ -0,0 +1,4 @@ +#include +struct Foo { virtual ~Foo() = default; virtual int get() = 0; }; +struct MockFoo : Foo { MOCK_METHOD(int, get, (), (override)); }; +TEST(Mock, Works) { MockFoo m; EXPECT_CALL(m, get()).WillOnce(::testing::Return(3)); EXPECT_EQ(m.get(), 3); }