diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index b05030cef..6f5178251 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -288,7 +288,7 @@ target_compile_options( ) add_library( - cuvs SHARED + cuvs_objs OBJECT src/cluster/kmeans_balanced_fit_float.cu src/cluster/kmeans_fit_mg_float.cu src/cluster/kmeans_fit_mg_double.cu @@ -436,12 +436,67 @@ add_library( src/stats/trustworthiness_score.cu ) +set_target_properties( + cuvs_objs + PROPERTIES CXX_STANDARD 17 + CXX_STANDARD_REQUIRED ON + CUDA_STANDARD 17 + CUDA_STANDARD_REQUIRED ON + POSITION_INDEPENDENT_CODE ON +) +target_compile_options( + cuvs_objs PRIVATE "$<$:${CUVS_CXX_FLAGS}>" + "$<$:${CUVS_CUDA_FLAGS}>" +) +target_link_libraries( + cuvs_objs PUBLIC raft::raft rmm::rmm ${CUVS_CTK_MATH_DEPENDENCIES} + $ +) + +add_library(cuvs SHARED $) +add_library(cuvs_static STATIC $) + target_compile_options( cuvs INTERFACE $<$:--expt-extended-lambda --expt-relaxed-constexpr> ) add_library(cuvs::cuvs ALIAS cuvs) +add_library(cuvs::cuvs_static ALIAS cuvs_static) + +set_target_properties( + cuvs_static + PROPERTIES BUILD_RPATH "\$ORIGIN" + INSTALL_RPATH "\$ORIGIN" + CXX_STANDARD 17 + CXX_STANDARD_REQUIRED ON + POSITION_INDEPENDENT_CODE ON + INTERFACE_POSITION_INDEPENDENT_CODE ON + EXPORT_NAME cuvs_static +) + +target_compile_options(cuvs_static PRIVATE "$<$:${CUVS_CXX_FLAGS}>") + +target_include_directories( + cuvs_objs + PUBLIC "$" + "$" + INTERFACE "$" +) + +target_include_directories( + cuvs_static + PUBLIC "$" + INTERFACE "$" +) + +# ensure CUDA symbols aren't relocated to the middle of the debug build binaries +target_link_options(cuvs_static PRIVATE $) + +target_include_directories( + cuvs_static PUBLIC "$" + "$" +) target_include_directories( cuvs PUBLIC "$" @@ -471,11 +526,17 @@ if(NOT BUILD_CPU_ONLY) PUBLIC rmm::rmm raft::raft ${CUVS_CTK_MATH_DEPENDENCIES} PRIVATE nvidia::cutlass::cutlass $ cuvs-cagra-search ) + + target_link_libraries( + cuvs_static + PUBLIC rmm::rmm raft::raft ${CUVS_CTK_MATH_DEPENDENCIES} + PRIVATE nvidia::cutlass::cutlass $ cuvs-cagra-search + ) endif() if(BUILD_CAGRA_HNSWLIB) - target_link_libraries(cuvs PRIVATE hnswlib::hnswlib) - target_compile_definitions(cuvs PUBLIC CUVS_BUILD_CAGRA_HNSWLIB) + target_link_libraries(cuvs_objs PRIVATE hnswlib::hnswlib) + target_compile_definitions(cuvs_objs PUBLIC CUVS_BUILD_CAGRA_HNSWLIB) endif() # Endian detection @@ -557,11 +618,16 @@ if(BUILD_C_LIBRARY) src/neighbors/ivf_flat_c.cpp src/neighbors/ivf_pq_c.cpp src/neighbors/cagra_c.cpp - src/neighbors/hnsw_c.cpp + $<$:src/neighbors/hnsw_c.cpp> src/neighbors/refine/refine_c.cpp src/distance/pairwise_distance_c.cpp ) + if(BUILD_CAGRA_HNSWLIB) + target_link_libraries(cuvs_c PRIVATE hnswlib::hnswlib) + target_compile_definitions(cuvs_c PUBLIC CUVS_BUILD_CAGRA_HNSWLIB) + endif() + add_library(cuvs::c_api ALIAS cuvs_c) set_target_properties( @@ -600,7 +666,7 @@ include(GNUInstallDirs) include(CPack) install( - TARGETS cuvs + TARGETS cuvs cuvs_static cuvs-cagra-search DESTINATION ${lib_dir} COMPONENT cuvs EXPORT cuvs-exports diff --git a/cpp/test/CMakeLists.txt b/cpp/test/CMakeLists.txt index 58cfc3862..bd07bebee 100644 --- a/cpp/test/CMakeLists.txt +++ b/cpp/test/CMakeLists.txt @@ -174,6 +174,8 @@ if(BUILD_TESTS) if(BUILD_CAGRA_HNSWLIB) ConfigureTest(NAME NEIGHBORS_HNSW_TEST PATH neighbors/hnsw.cu GPUS 1 PERCENT 100) + target_link_libraries(NEIGHBORS_HNSW_TEST PRIVATE hnswlib::hnswlib) + target_compile_definitions(NEIGHBORS_HNSW_TEST PUBLIC CUVS_BUILD_CAGRA_HNSWLIB) endif() ConfigureTest( @@ -227,6 +229,8 @@ if(BUILD_C_TESTS) if(BUILD_CAGRA_HNSWLIB) ConfigureTest(NAME HNSW_C_TEST PATH neighbors/ann_hnsw_c.cu C_LIB) + target_link_libraries(NEIGHBORS_HNSW_TEST PRIVATE hnswlib::hnswlib) + target_compile_definitions(NEIGHBORS_HNSW_TEST PUBLIC CUVS_BUILD_CAGRA_HNSWLIB) endif() endif()