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
N A M E S c u v s l a m . h
P A T H S
/ u s r / i n c l u d e
/ u s r / l o c a l / i n c l u d e
/ o p t / c u v s l a m / i n c l u d e
/ o p t / r o s / h u m b l e / s h a r e / i s a a c _ r o s _ n i t r o s / c u v s l a m / i n c l u d e
$ E N V { C U V S L A M _ R O O T } / i n c l u d e
$ E N V { C U V S L A M _ R O O T _ D I R } / i n c l u d e
)
find_library ( CUVSLAM_LIBRARY
N A M E S c u v s l a m
P A T H S
/ u s r / l i b
/ u s r / l o c a l / l i b
/ o p t / c u v s l a m / l i b
/ o p t / r o s / h u m b l e / s h a r e / i s a a c _ r o s _ n i t r o s / c u v s l a m / l i b
$ E N V { C U V S L A M _ R O O T } / l i b
$ E N V { C U V S L A M _ R O O T _ D I R } / l i b
)
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
R E G E X " ^ #define CUVSLAM_API_VERSION_MAJOR")
file ( STRINGS "${CUVSLAM_INCLUDE_DIRS}/cuvslam.h" CUVSLAM_VERSION_MINOR_LINE
R E G E X " ^ #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
$ { C U V S L A M _ L I B R A R Y }
$ { C U D A _ L I B R A R I E S }
# Eigen3 is header-only, so we don't need to link to it
)
set ( CUVSLAM_INCLUDE_DIRS
$ { C U V S L A M _ I N C L U D E _ D I R S }
$ { C U D A _ I N C L U D E _ D I R S }
$ { E I G E N 3 _ I N C L U D E _ D I R }
)
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
" c u V S L A M m a j o r v e r s i o n m i s m a t c h : f o u n d v e r s i o n $ { C U V S L A M _ V E R S I O N } b u t v e r s i o n $ { C u V S L A M _ F I N D _ V E R S I O N } i s r e q u i r e d . \ n "
" c u V S L A M o n l y g u a r a n t e e s A P I c o m p a t i b i l i t y w i t h i n t h e s a m e m a j o r v e r s i o n . \ n "
" F o u n d m a j o r v e r s i o n $ { C U V S L A M _ V E R S I O N _ M A J O R } i s n o t c o m p a t i b l e w i t h r e q u e s t e d m a j o r v e r s i o n $ { R E Q U E S T E D _ M A J O R _ V E R S I O N } . \ n "
" P l e a s e i n s t a l l c u V S L A M $ { R E Q U E S T E D _ M A J O R _ V E R S I O N } . x o r u p d a t e C M a k e L i s t s . t x t t o r e q u e s t v e r s i o n $ { C U V S L A M _ V E R S I O N _ M A J O R } . 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
F O U N D _ V A R C U V S L A M _ F O U N D
R E Q U I R E D _ V A R S C U V S L A M _ L I B R A R I E S C U V S L A M _ I N C L U D E _ D I R S
2025-12-15 14:21:32 -08:00
V E R S I O N _ V A R C U V S L A M _ V E R S I O N
R E A S O N _ F A I L U R E _ M E S S A G E " $ { C U V S L A M _ V E R S I O N _ M I S M A T C H _ R E A S O N } "
2025-10-03 11:49:21 -07:00
H A N D L E _ C O M P O N E N T S
)
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
I M P O R T E D _ L O C A T I O N " $ { C U V S L A M _ L I B R A R Y } "
I N T E R F A C E _ I N C L U D E _ D I R E C T O R I E S " $ { C U V S L A M _ I N C L U D E _ D I R S } "
I N T E R F A C E _ L I N K _ L I B R A R I E S " $ { C U V S L A M _ L I B R A R I E S } ; E i g e n 3 : : E i g e n "
)
endif ( )
endif ( )
mark_as_advanced ( CUVSLAM_INCLUDE_DIRS CUVSLAM_LIBRARY )