On Ubuntu Bionic, the Eigen3
CMake package offers exported targets and non-standard CMake variables.
This is a problem for packages using ament_cmake.
Targets using ament_target_dependencies(my_target Eigen3)
will fail to find Eigen3
headers at compile time.
Downstream packages will also fail to find Eigen3
headers at compile time, even if your package uses ament_export_dependencies(Eigen3)
.
This package adds a CMake find module for Eigen3 that sets standard CMake variables.
ROS 2 packages using Eigen3
should use this package to avoid these problems.
In your CMakeLists.txt
, call find_package()
on this package using REQUIRED
.
Afterwards, find Eigen3
with or without REQUIRED
as appropriate for your package.
find_package(eigen3_cmake_module REQUIRED)
find_package(Eigen3)
If your package uses ament_cmake, then use ament_target_dependencies()
to give your library or executable targets access to the Eigen3
headers.
# add_library(my_thing ...)
# # OR
# add_executable(my_thing ...)
# ...
ament_target_dependencies(my_thing Eigen3)
If Eigen3
appears in headers installed by your package, then downstream packages will need the Eigen3
headers too.
Call ament_export_dependencies()
on this package, and afterwards do the same for Eigen3
.
ament_export_dependencies(eigen3_cmake_module)
ament_export_dependencies(Eigen3)
If your package does not use ament_cmake
, then use target_include_directories()
to give your targets access to the Eigen3
headers.
target_include_directories(my_target PUBLIC "${Eigen3_INCLUDE_DIRS}")
If Eigen3
is used in headers installed by your package, then your <project>-config.cmake
must find both this package and Eigen3
.
Afterwards the Eigen3
headers should be added to your package's include variable.
find_package(eigen3_cmake_module)
if (NOT eigen3_cmake_module_FOUND)
set(your_package_name_FOUND 0)
return()
endif()
find_package(Eigen3)
if (NOT Eigen3_FOUND)
set(your_package_name_FOUND 0)
return()
endif()
list(APPEND your_package_name_INCLUDE_DIRS ${Eigen3_INCLUDE_DIRS})
Add a buildtool dependency to this package, and a build dependency to Eigen3
to your package.xml
.
<buildtool_depend>eigen3_cmake_module</buildtool_depend>
<build_depend>eigen</build_depend>
If your package uses Eigen3
in public headers, then also add these tags so downstream packages also depend on this package and Eigen3
.
<buildtool_export_depend>eigen3_cmake_module</buildtool_export_depend>
<build_export_depend>eigen</build_export_depend>
<exec_depend>
is not necessary because Eigen3
is a header only library.