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
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); }