@@ -63,7 +63,7 @@ option(CUDA_ENABLE_LINEINFO
6363)
6464option (CUDA_STATIC_RUNTIME "Statically link the CUDA runtime" OFF )
6565option (CUDA_STATIC_MATH_LIBRARIES "Statically link the CUDA math libraries" OFF )
66- option (CUVS_USE_RAFT_STATIC "Build and statically link the RAFT libraries" OFF )
66+ option (CUVS_STATIC_RAPIDS_LIBRARIES "Build and statically link RAPIDS libraries" OFF )
6767option (CUDA_LOG_COMPILE_TIME "Write a log of compilation times to nvcc_compile_log.csv" OFF )
6868option (DETECT_CONDA_ENV "Enable detection of conda environment for dependencies" ON )
6969option (DISABLE_DEPRECATION_WARNINGS "Disable deprecaction warnings " ON )
@@ -83,6 +83,23 @@ elseif(NOT BUILD_SHARED_LIBS)
8383 set (BUILD_CAGRA_HNSWLIB OFF )
8484endif ()
8585
86+ if (NOT BUILD_SHARED_LIBS AND CUVS_COMPILE_DYNAMIC_ONLY)
87+ message (
88+ VERBOSE
89+ "cuVS: Ignoring `BUILD_SHARED_LIBS` and forcing shared library due to `CUVS_COMPILE_DYNAMIC_ONLY`"
90+ )
91+ endif ()
92+
93+ set (cuvs_compile_mode "both" )
94+ set (_cuvs_lib_targets cuvs cuvs_static)
95+ if (CUVS_COMPILE_DYNAMIC_ONLY)
96+ set (cuvs_compile_mode "shared_only" )
97+ set (_cuvs_lib_targets cuvs)
98+ elseif (NOT BUILD_SHARED_LIBS )
99+ set (cuvs_compile_mode "static_only" )
100+ set (_cuvs_lib_targets cuvs_static)
101+ endif ()
102+
86103# Needed because GoogleBenchmark changes the state of FindThreads.cmake, causing subsequent runs to
87104# have different values for the `Threads::Threads` target. Setting this flag ensures
88105# `Threads::Threads` is the same value across all builds so that cache hits occur
@@ -104,7 +121,7 @@ message(VERBOSE "cuVS: Enable lineinfo in nvcc: ${CUDA_ENABLE_LINEINFO}")
104121message (VERBOSE "cuVS: Enable nvtx markers: ${CUVS_NVTX} " )
105122message (VERBOSE "cuVS: Statically link the CUDA runtime: ${CUDA_STATIC_RUNTIME} " )
106123message (VERBOSE "cuVS: Statically link the CUDA math libraries: ${CUDA_STATIC_MATH_LIBRARIES} " )
107- message (VERBOSE "cuVS: Build and statically link RAFT libraries: ${CUVS_USE_RAFT_STATIC } " )
124+ message (VERBOSE "cuVS: Build and statically link RAPIDS libraries: ${CUVS_STATIC_RAPIDS_LIBRARIES } " )
108125
109126# Set RMM logging level
110127set (RMM_LOGGING_LEVEL
@@ -200,7 +217,7 @@ endif()
200217
201218# ##################################################################################################
202219# * cuvs ---------------------------------------------------------------------
203- if (BUILD_SHARED_LIBS )
220+ if (NOT BUILD_CPU_ONLY )
204221 add_library (
205222 cuvs-cagra-search STATIC
206223 src/neighbors/cagra_search_float.cu
@@ -519,25 +536,116 @@ if(BUILD_SHARED_LIBS)
519536 cuvs_objs PRIVATE "$<$<COMPILE_LANGUAGE :CXX >:${CUVS_CXX_FLAGS} >"
520537 "$<$<COMPILE_LANGUAGE :CUDA >:${CUVS_CUDA_FLAGS} >"
521538 )
539+
540+ target_compile_definitions (
541+ cuvs_objs PRIVATE $<$<BOOL :${BUILD_CAGRA_HNSWLIB} >:CUVS_BUILD_CAGRA_HNSWLIB >
542+ $<$<BOOL :${CUVS_NVTX} >:NVTX_ENABLED >
543+ )
544+
522545 target_link_libraries (
523- cuvs_objs PUBLIC raft::raft rmm::rmm ${CUVS_CTK_MATH_DEPENDENCIES}
524- $<TARGET_NAME_IF_EXISTS :OpenMP ::OpenMP_CXX >
546+ cuvs_objs
547+ PRIVATE raft::raft rmm::rmm ${CUVS_CTK_MATH_DEPENDENCIES}
548+ $<TARGET_NAME_IF_EXISTS :OpenMP ::OpenMP_CXX > $<TARGET_NAME_IF_EXISTS :hnswlib ::hnswlib >
525549 )
526550
527- add_library (cuvs SHARED $<TARGET_OBJECTS :cuvs_objs >)
551+ target_include_directories (
552+ cuvs_objs
553+ PUBLIC "$<BUILD_INTERFACE :${DLPACK_INCLUDE_DIR} >"
554+ "$<BUILD_INTERFACE :${CMAKE_CURRENT_SOURCE_DIR} /include >"
555+ INTERFACE "$<INSTALL_INTERFACE :include >"
556+ )
528557
529- if (NOT CUVS_COMPILE_DYNAMIC_ONLY)
530- add_library (cuvs_static STATIC $<TARGET_OBJECTS :cuvs_objs >)
558+ # Endian detection
559+ include (TestBigEndian )
560+ test_big_endian (BIG_ENDIAN )
561+ if (BIG_ENDIAN)
562+ target_compile_definitions (cuvs_objs PRIVATE CUVS_SYSTEM_LITTLE_ENDIAN=0 )
563+ else ()
564+ target_compile_definitions (cuvs_objs PRIVATE CUVS_SYSTEM_LITTLE_ENDIAN=1 )
531565 endif ()
532566
533- target_compile_options (
534- cuvs INTERFACE $<$<COMPILE_LANG_AND_ID :CUDA ,NVIDIA >:--expt -extended -lambda
535- --expt -relaxed -constexpr >
567+ if (BUILD_MG_ALGOS)
568+ rapids_find_generate_module (
569+ NCCL
570+ HEADER_NAMES nccl.h
571+ LIBRARY_NAMES nccl
572+ )
573+ find_package (NCCL REQUIRED )
574+ target_link_libraries (cuvs_objs PUBLIC $<BUILD_LOCAL_INTERFACE :NCCL ::NCCL >)
575+
576+ target_compile_definitions (cuvs_objs PUBLIC CUVS_BUILD_MG_ALGOS )
577+ target_compile_definitions (cuvs-cagra-search PUBLIC CUVS_BUILD_MG_ALGOS )
578+ endif ()
579+
580+ set (CUVS_CUSOLVER_DEPENDENCY CUDA::cusolver${_ctk_static_suffix} )
581+ set (CUVS_CUBLAS_DEPENDENCY CUDA::cublas${_ctk_static_suffix} )
582+ set (CUVS_CURAND_DEPENDENCY CUDA::curand${_ctk_static_suffix} )
583+ set (CUVS_CUSPARSE_DEPENDENCY CUDA::cusparse${_ctk_static_suffix} )
584+
585+ set (CUVS_CTK_MATH_DEPENDENCIES ${CUVS_CUBLAS_DEPENDENCY} ${CUVS_CUSOLVER_DEPENDENCY}
586+ ${CUVS_CUSPARSE_DEPENDENCY} ${CUVS_CURAND_DEPENDENCY}
536587 )
537588
538- add_library (cuvs::cuvs ALIAS cuvs )
589+ if (NOT cuvs_compile_mode STREQUAL "static_only" )
590+ add_library (cuvs SHARED $<TARGET_OBJECTS :cuvs_objs >)
591+ add_library (cuvs::cuvs ALIAS cuvs )
592+ set_target_properties (
593+ cuvs
594+ PROPERTIES BUILD_RPATH "\$ ORIGIN"
595+ INSTALL_RPATH "\$ ORIGIN"
596+ CXX_STANDARD 17
597+ CXX_STANDARD_REQUIRED ON
598+ CUDA_STANDARD 17
599+ CUDA_STANDARD_REQUIRED ON
600+ INTERFACE_POSITION_INDEPENDENT_CODE ON
601+ POSITION_INDEPENDENT_CODE ON
602+ )
603+ target_compile_options (
604+ cuvs
605+ INTERFACE $<$<COMPILE_LANG_AND_ID :CUDA ,NVIDIA >:--expt -extended -lambda
606+ --expt -relaxed -constexpr >
607+ PRIVATE "$<$<COMPILE_LANGUAGE :CXX >:${CUVS_CXX_FLAGS} >"
608+ "$<$<COMPILE_LANGUAGE :CUDA >:${CUVS_CUDA_FLAGS} >"
609+ )
610+ target_compile_definitions (
611+ cuvs PUBLIC $<$<BOOL :${BUILD_CAGRA_HNSWLIB} >:CUVS_BUILD_CAGRA_HNSWLIB >
612+ $<$<BOOL :${CUVS_NVTX} >:NVTX_ENABLED >
613+ )
614+
615+ target_include_directories (
616+ cuvs PUBLIC "$<BUILD_INTERFACE :${CMAKE_CURRENT_SOURCE_DIR} /include >"
617+ "$<INSTALL_INTERFACE :include >"
618+ )
539619
540- if (NOT CUVS_COMPILE_DYNAMIC_ONLY)
620+ target_link_libraries (
621+ cuvs
622+ PUBLIC rmm::rmm
623+ raft::raft
624+ ${CUVS_CTK_MATH_DEPENDENCIES}
625+ $<BUILD_LOCAL_INTERFACE :$<TARGET_NAME_IF_EXISTS :NCCL ::NCCL >>
626+ $<BUILD_LOCAL_INTERFACE :$<TARGET_NAME_IF_EXISTS :hnswlib ::hnswlib >>
627+ $<$<BOOL :${CUVS_NVTX} >:CUDA ::nvtx3 >
628+ PRIVATE nvidia::cutlass::cutlass $<TARGET_NAME_IF_EXISTS :OpenMP ::OpenMP_CXX >
629+ cuvs-cagra-search
630+ )
631+
632+ # ensure CUDA symbols aren't relocated to the middle of the debug build binaries
633+ file (
634+ WRITE "${CMAKE_CURRENT_BINARY_DIR} /fatbin.ld"
635+ [=[
636+ SECTIONS
637+ {
638+ .nvFatBinSegment : { *(.nvFatBinSegment) }
639+ .nv_fatbin : { *(.nv_fatbin) }
640+ }
641+ ]=]
642+ )
643+ target_link_options (cuvs PRIVATE $<HOST_LINK :${CMAKE_CURRENT_BINARY_DIR} /fatbin .ld >)
644+
645+ endif ()
646+
647+ if (NOT cuvs_compile_mode STREQUAL "shared_only" )
648+ add_library (cuvs_static STATIC $<TARGET_OBJECTS :cuvs_objs >)
541649 add_library (cuvs::cuvs_static ALIAS cuvs_static )
542650
543651 set_target_properties (
@@ -552,16 +660,11 @@ if(BUILD_SHARED_LIBS)
552660 )
553661
554662 target_compile_options (cuvs_static PRIVATE "$<$<COMPILE_LANGUAGE :CXX >:${CUVS_CXX_FLAGS} >" )
555- endif ()
556-
557- target_include_directories (
558- cuvs_objs
559- PUBLIC "$<BUILD_INTERFACE :${DLPACK_INCLUDE_DIR} >"
560- "$<BUILD_INTERFACE :${CMAKE_CURRENT_SOURCE_DIR} /include >"
561- INTERFACE "$<INSTALL_INTERFACE :include >"
562- )
663+ target_compile_definitions (
664+ cuvs_static PUBLIC $<$<BOOL :${BUILD_CAGRA_HNSWLIB} >:CUVS_BUILD_CAGRA_HNSWLIB >
665+ $<$<BOOL :${CUVS_NVTX} >:NVTX_ENABLED >
666+ )
563667
564- if (NOT CUVS_COMPILE_DYNAMIC_ONLY)
565668 target_include_directories (
566669 cuvs_static
567670 PUBLIC "$<BUILD_INTERFACE :${DLPACK_INCLUDE_DIR} >"
@@ -575,102 +678,21 @@ if(BUILD_SHARED_LIBS)
575678 cuvs_static PUBLIC "$<BUILD_INTERFACE :${CMAKE_CURRENT_SOURCE_DIR} /include >"
576679 "$<INSTALL_INTERFACE :include >"
577680 )
578- endif ()
579-
580- target_include_directories (
581- cuvs PUBLIC "$<BUILD_INTERFACE :${CMAKE_CURRENT_SOURCE_DIR} /include >"
582- "$<INSTALL_INTERFACE :include >"
583- )
584-
585- rapids_find_package (
586- OpenMP REQUIRED
587- BUILD_EXPORT_SET cuvs-exports
588- INSTALL_EXPORT_SET cuvs-exports
589- )
590-
591- if (NOT BUILD_CPU_ONLY)
592-
593- set (CUVS_CUSOLVER_DEPENDENCY CUDA::cusolver${_ctk_static_suffix} )
594- set (CUVS_CUBLAS_DEPENDENCY CUDA::cublas${_ctk_static_suffix} )
595- set (CUVS_CURAND_DEPENDENCY CUDA::curand${_ctk_static_suffix} )
596- set (CUVS_CUSPARSE_DEPENDENCY CUDA::cusparse${_ctk_static_suffix} )
597-
598- set (CUVS_CTK_MATH_DEPENDENCIES ${CUVS_CUBLAS_DEPENDENCY} ${CUVS_CUSOLVER_DEPENDENCY}
599- ${CUVS_CUSPARSE_DEPENDENCY} ${CUVS_CURAND_DEPENDENCY}
600- )
601-
602- if (BUILD_MG_ALGOS)
603- rapids_find_generate_module (
604- NCCL
605- HEADER_NAMES nccl.h
606- LIBRARY_NAMES nccl
607- )
608- find_package (NCCL REQUIRED )
609- target_link_libraries (cuvs_objs PRIVATE NCCL::NCCL )
610- target_link_libraries (cuvs PRIVATE NCCL::NCCL )
611- endif ()
612-
613- # Keep cuVS as lightweight as possible. Only CUDA libs and rmm should be used in global target.
614681 target_link_libraries (
615- cuvs
616- PUBLIC rmm::rmm raft::raft ${CUVS_CTK_MATH_DEPENDENCIES}
682+ cuvs_static
683+ PUBLIC rmm::rmm
684+ raft::raft
685+ ${CUVS_CTK_MATH_DEPENDENCIES}
686+ $<BUILD_LOCAL_INTERFACE :$<TARGET_NAME_IF_EXISTS :NCCL ::NCCL >>
687+ $<BUILD_LOCAL_INTERFACE :$<TARGET_NAME_IF_EXISTS :hnswlib ::hnswlib >>
688+ $<$<BOOL :${CUVS_NVTX} >:CUDA ::nvtx3 >
617689 PRIVATE nvidia::cutlass::cutlass $<TARGET_NAME_IF_EXISTS :OpenMP ::OpenMP_CXX >
618- cuvs-cagra-search
619690 )
620-
621- if (NOT CUVS_COMPILE_DYNAMIC_ONLY)
622- target_link_libraries (
623- cuvs_static
624- PUBLIC rmm::rmm raft::raft ${CUVS_CTK_MATH_DEPENDENCIES}
625- PRIVATE nvidia::cutlass::cutlass $<TARGET_NAME_IF_EXISTS :OpenMP ::OpenMP_CXX >
626- )
627- endif ()
628- endif ()
629-
630- if (BUILD_MG_ALGOS)
631- target_compile_definitions (cuvs PUBLIC CUVS_BUILD_MG_ALGOS )
632- target_compile_definitions (cuvs_objs PUBLIC CUVS_BUILD_MG_ALGOS )
633- target_compile_definitions (cuvs-cagra-search PUBLIC CUVS_BUILD_MG_ALGOS )
634- endif ()
635-
636- if (BUILD_CAGRA_HNSWLIB)
637- target_link_libraries (cuvs_objs PRIVATE hnswlib::hnswlib )
638- target_compile_definitions (cuvs PUBLIC CUVS_BUILD_CAGRA_HNSWLIB )
639- target_compile_definitions (cuvs_objs PUBLIC CUVS_BUILD_CAGRA_HNSWLIB )
640- endif ()
641-
642- # Endian detection
643- include (TestBigEndian )
644- test_big_endian (BIG_ENDIAN )
645- if (BIG_ENDIAN)
646- target_compile_definitions (cuvs PRIVATE CUVS_SYSTEM_LITTLE_ENDIAN=0 )
647- else ()
648- target_compile_definitions (cuvs PRIVATE CUVS_SYSTEM_LITTLE_ENDIAN=1 )
649691 endif ()
650692
651- file (
652- WRITE "${CMAKE_CURRENT_BINARY_DIR} /fatbin.ld"
653- [=[
654- SECTIONS
655- {
656- .nvFatBinSegment : { *(.nvFatBinSegment) }
657- .nv_fatbin : { *(.nv_fatbin) }
658- }
659- ]=]
660- )
661-
662693 # ################################################################################################
663694 # * NVTX support in cuvs -----------------------------------------------------
664-
665- if (CUVS_NVTX)
666- # This enables NVTX within the project with no option to disable it downstream.
667- target_link_libraries (cuvs PUBLIC CUDA::nvtx3 )
668- target_compile_definitions (cuvs_objs PUBLIC NVTX_ENABLED )
669- target_compile_definitions (cuvs PUBLIC NVTX_ENABLED )
670-
671- target_link_libraries (cuvs-cagra-search PUBLIC CUDA::nvtx3 )
672- target_compile_definitions (cuvs-cagra-search PUBLIC NVTX_ENABLED )
673- else ()
695+ if (NOT CUVS_NVTX)
674696 # Allow enable NVTX downstream if not set here. This creates a new option at build/install time,
675697 # which is set by default to OFF, but can be enabled in the dependent project.
676698 get_property (
@@ -693,25 +715,6 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$<BOOL:${CUVS_NVTX}>:NVTX_ENAB
693715 )
694716 endif ()
695717
696- set_target_properties (
697- cuvs
698- PROPERTIES BUILD_RPATH "\$ ORIGIN"
699- INSTALL_RPATH "\$ ORIGIN"
700- CXX_STANDARD 17
701- CXX_STANDARD_REQUIRED ON
702- CUDA_STANDARD 17
703- CUDA_STANDARD_REQUIRED ON
704- INTERFACE_POSITION_INDEPENDENT_CODE ON
705- POSITION_INDEPENDENT_CODE ON
706- )
707-
708- target_compile_options (
709- cuvs PRIVATE "$<$<COMPILE_LANGUAGE :CXX >:${CUVS_CXX_FLAGS} >"
710- "$<$<COMPILE_LANGUAGE :CUDA >:${CUVS_CUDA_FLAGS} >"
711- )
712- # ensure CUDA symbols aren't relocated to the middle of the debug build binaries
713- target_link_options (cuvs PRIVATE $<HOST_LINK :${CMAKE_CURRENT_BINARY_DIR} /fatbin .ld >)
714-
715718 # ################################################################################################
716719 # * cuvs_c -------------------------------------------------------------------------------
717720
@@ -740,14 +743,7 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$<BOOL:${CUVS_NVTX}>:NVTX_ENAB
740743 src/distance/pairwise_distance_c.cpp
741744 ${CUVS_C_MG_ALGOS}
742745 )
743-
744- if (BUILD_CAGRA_HNSWLIB)
745- target_link_libraries (cuvs_c PRIVATE hnswlib::hnswlib )
746- target_compile_definitions (cuvs_c PUBLIC CUVS_BUILD_CAGRA_HNSWLIB )
747- endif ()
748-
749746 add_library (cuvs::c_api ALIAS cuvs_c )
750-
751747 set_target_properties (
752748 cuvs_c
753749 PROPERTIES BUILD_RPATH "\$ ORIGIN"
@@ -759,6 +755,10 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$<BOOL:${CUVS_NVTX}>:NVTX_ENAB
759755 EXPORT_NAME c_api
760756 )
761757
758+ target_compile_definitions (
759+ cuvs_c PUBLIC $<$<BOOL :${BUILD_CAGRA_HNSWLIB} >:CUVS_BUILD_CAGRA_HNSWLIB >
760+ )
761+
762762 target_compile_options (cuvs_c PRIVATE "$<$<COMPILE_LANGUAGE :CXX >:${CUVS_CXX_FLAGS} >" )
763763
764764 target_include_directories (
@@ -771,7 +771,7 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$<BOOL:${CUVS_NVTX}>:NVTX_ENAB
771771 target_link_libraries (
772772 cuvs_c
773773 PUBLIC cuvs::cuvs ${CUVS_CTK_MATH_DEPENDENCIES}
774- PRIVATE raft::raft
774+ PRIVATE raft::raft $< TARGET_NAME_IF_EXISTS : hnswlib :: hnswlib >
775775 )
776776
777777 # ensure CUDA symbols aren't relocated to the middle of the debug build binaries
@@ -784,11 +784,6 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$<BOOL:${CUVS_NVTX}>:NVTX_ENAB
784784 include (GNUInstallDirs )
785785 include (CPack )
786786
787- set (_cuvs_lib_targets cuvs)
788- if (NOT CUVS_COMPILE_DYNAMIC_ONLY)
789- list (APPEND _cuvs_lib_targets cuvs_static)
790- endif ()
791-
792787 install (
793788 TARGETS ${_cuvs_lib_targets}
794789 DESTINATION ${lib_dir}
0 commit comments