2025-10-03 11:49:21 -07:00
# - Find cuVSLAM library (https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_visual_slam)
#
# CUVSLAM_ROOT_DIR environment variable can be set to find the library.
#
# It sets the following variables:
# CUVSLAM_FOUND - Set to false, or undefined, if cuVSLAM isn't found.
2025-12-15 14:21:32 -08:00
# CUVSLAM_VERSION - The version of cuVSLAM found (e.g., "14.0.0").
2025-10-03 11:49:21 -07:00
# CUVSLAM_INCLUDE_DIRS - The cuVSLAM include directory.
# CUVSLAM_LIBRARIES - The cuVSLAM library to link against.
find_package ( CUDA REQUIRED )
find_package ( Eigen3 REQUIRED )
find_path ( CUVSLAM_INCLUDE_DIRS
NAMES cuvslam.h
PATHS
/usr/include
/usr/local/include
/opt/cuvslam/include
/opt/ros/humble/share/isaac_ros_nitros/cuvslam/include
$ENV{ CUVSLAM_ROOT } /include
$ENV{ CUVSLAM_ROOT_DIR } /include
)
find_library ( CUVSLAM_LIBRARY
NAMES cuvslam
PATHS
/usr/lib
/usr/local/lib
/opt/cuvslam/lib
/opt/ros/humble/share/isaac_ros_nitros/cuvslam/lib
$ENV{ CUVSLAM_ROOT } /lib
$ENV{ CUVSLAM_ROOT_DIR } /lib
)
if ( CUVSLAM_INCLUDE_DIRS AND CUVSLAM_LIBRARY )
2025-12-15 14:21:32 -08:00
# Extract version from cuvslam.h header
file ( STRINGS "${CUVSLAM_INCLUDE_DIRS}/cuvslam.h" CUVSLAM_VERSION_MAJOR_LINE
REGEX "^#define CUVSLAM_API_VERSION_MAJOR" )
file ( STRINGS "${CUVSLAM_INCLUDE_DIRS}/cuvslam.h" CUVSLAM_VERSION_MINOR_LINE
REGEX "^#define CUVSLAM_API_VERSION_MINOR" )
if ( CUVSLAM_VERSION_MAJOR_LINE AND CUVSLAM_VERSION_MINOR_LINE )
string ( REGEX MATCH "[0-9]+" CUVSLAM_VERSION_MAJOR "${CUVSLAM_VERSION_MAJOR_LINE}" )
string ( REGEX MATCH "[0-9]+" CUVSLAM_VERSION_MINOR "${CUVSLAM_VERSION_MINOR_LINE}" )
set ( CUVSLAM_VERSION "${CUVSLAM_VERSION_MAJOR}.${CUVSLAM_VERSION_MINOR}.0" )
endif ()
2025-10-03 11:49:21 -07:00
set ( CUVSLAM_LIBRARIES
${ CUVSLAM_LIBRARY }
${ CUDA_LIBRARIES }
# Eigen3 is header-only, so we don't need to link to it
)
set ( CUVSLAM_INCLUDE_DIRS
${ CUVSLAM_INCLUDE_DIRS }
${ CUDA_INCLUDE_DIRS }
${ EIGEN3_INCLUDE_DIR }
)
endif ()
2025-12-15 14:21:32 -08:00
# Version compatibility check - cuVSLAM only guarantees API compatibility within the same major version
set ( CUVSLAM_VERSION_MISMATCH_REASON "" )
if ( CuVSLAM_FIND_VERSION AND CUVSLAM_VERSION )
string ( REGEX MATCH "^[0-9]+" REQUESTED_MAJOR_VERSION "${CuVSLAM_FIND_VERSION}" )
if ( NOT CUVSLAM_VERSION_MAJOR EQUAL REQUESTED_MAJOR_VERSION )
set ( CUVSLAM_VERSION_MISMATCH_REASON "Major version mismatch: found ${CUVSLAM_VERSION_MAJOR}.x but requested ${REQUESTED_MAJOR_VERSION}.x.\ncuVSLAM only guarantees API compatibility within the same major version.\nPlease install cuVSLAM ${REQUESTED_MAJOR_VERSION}.x or update CMakeLists.txt to request version ${CUVSLAM_VERSION_MAJOR}.0.0" )
if ( CuVSLAM_FIND_REQUIRED )
message ( FATAL_ERROR
"cuVSLAM major version mismatch: found version ${CUVSLAM_VERSION} but version ${CuVSLAM_FIND_VERSION} is required.\n"
"cuVSLAM only guarantees API compatibility within the same major version.\n"
"Found major version ${CUVSLAM_VERSION_MAJOR} is not compatible with requested major version ${REQUESTED_MAJOR_VERSION}.\n"
"Please install cuVSLAM ${REQUESTED_MAJOR_VERSION}.x or update CMakeLists.txt to request version ${CUVSLAM_VERSION_MAJOR}.x."
)
else ()
# Clear the found variables to indicate incompatibility
unset ( CUVSLAM_LIBRARIES )
unset ( CUVSLAM_INCLUDE_DIRS )
endif ()
endif ()
endif ()
2025-10-03 11:49:21 -07:00
# Handle the QUIET and REQUIRED arguments
include ( FindPackageHandleStandardArgs )
find_package_handle_standard_args ( CuVSLAM
FOUND_VAR CUVSLAM_FOUND
REQUIRED_VARS CUVSLAM_LIBRARIES CUVSLAM_INCLUDE_DIRS
2025-12-15 14:21:32 -08:00
VERSION_VAR CUVSLAM_VERSION
REASON_FAILURE_MESSAGE "${CUVSLAM_VERSION_MISMATCH_REASON}"
2025-10-03 11:49:21 -07:00
HANDLE_COMPONENTS
)
if ( CUVSLAM_FOUND )
# Create imported target for modern CMake usage
if ( NOT TARGET cuvslam::cuvslam )
add_library ( cuvslam::cuvslam UNKNOWN IMPORTED )
set_target_properties ( cuvslam::cuvslam PROPERTIES
IMPORTED_LOCATION "${CUVSLAM_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${CUVSLAM_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${CUVSLAM_LIBRARIES};Eigen3::Eigen"
)
endif ()
endif ()
mark_as_advanced ( CUVSLAM_INCLUDE_DIRS CUVSLAM_LIBRARY )