Skip to content

Commit 5629977

Browse files
authored
Add a static library for cuvs (#382)
For the cuml integration, we need to be able to statically link to cuvs in order build the python wheels. This change adds a static target that lets us do that Authors: - Ben Frederickson (https://github.com/benfred) Approvers: - Corey J. Nolet (https://github.com/cjnolet) URL: #382
1 parent 59bc6bd commit 5629977

File tree

2 files changed

+75
-5
lines changed

2 files changed

+75
-5
lines changed

cpp/CMakeLists.txt

Lines changed: 71 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ target_compile_options(
288288
)
289289

290290
add_library(
291-
cuvs SHARED
291+
cuvs_objs OBJECT
292292
src/cluster/kmeans_balanced_fit_float.cu
293293
src/cluster/kmeans_fit_mg_float.cu
294294
src/cluster/kmeans_fit_mg_double.cu
@@ -436,12 +436,67 @@ add_library(
436436
src/stats/trustworthiness_score.cu
437437
)
438438

439+
set_target_properties(
440+
cuvs_objs
441+
PROPERTIES CXX_STANDARD 17
442+
CXX_STANDARD_REQUIRED ON
443+
CUDA_STANDARD 17
444+
CUDA_STANDARD_REQUIRED ON
445+
POSITION_INDEPENDENT_CODE ON
446+
)
447+
target_compile_options(
448+
cuvs_objs PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:${CUVS_CXX_FLAGS}>"
449+
"$<$<COMPILE_LANGUAGE:CUDA>:${CUVS_CUDA_FLAGS}>"
450+
)
451+
target_link_libraries(
452+
cuvs_objs PUBLIC raft::raft rmm::rmm ${CUVS_CTK_MATH_DEPENDENCIES}
453+
$<TARGET_NAME_IF_EXISTS:OpenMP::OpenMP_CXX>
454+
)
455+
456+
add_library(cuvs SHARED $<TARGET_OBJECTS:cuvs_objs>)
457+
add_library(cuvs_static STATIC $<TARGET_OBJECTS:cuvs_objs>)
458+
439459
target_compile_options(
440460
cuvs INTERFACE $<$<COMPILE_LANG_AND_ID:CUDA,NVIDIA>:--expt-extended-lambda
441461
--expt-relaxed-constexpr>
442462
)
443463

444464
add_library(cuvs::cuvs ALIAS cuvs)
465+
add_library(cuvs::cuvs_static ALIAS cuvs_static)
466+
467+
set_target_properties(
468+
cuvs_static
469+
PROPERTIES BUILD_RPATH "\$ORIGIN"
470+
INSTALL_RPATH "\$ORIGIN"
471+
CXX_STANDARD 17
472+
CXX_STANDARD_REQUIRED ON
473+
POSITION_INDEPENDENT_CODE ON
474+
INTERFACE_POSITION_INDEPENDENT_CODE ON
475+
EXPORT_NAME cuvs_static
476+
)
477+
478+
target_compile_options(cuvs_static PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:${CUVS_CXX_FLAGS}>")
479+
480+
target_include_directories(
481+
cuvs_objs
482+
PUBLIC "$<BUILD_INTERFACE:${DLPACK_INCLUDE_DIR}>"
483+
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
484+
INTERFACE "$<INSTALL_INTERFACE:include>"
485+
)
486+
487+
target_include_directories(
488+
cuvs_static
489+
PUBLIC "$<BUILD_INTERFACE:${DLPACK_INCLUDE_DIR}>"
490+
INTERFACE "$<INSTALL_INTERFACE:include>"
491+
)
492+
493+
# ensure CUDA symbols aren't relocated to the middle of the debug build binaries
494+
target_link_options(cuvs_static PRIVATE $<HOST_LINK:${CMAKE_CURRENT_BINARY_DIR}/fatbin.ld>)
495+
496+
target_include_directories(
497+
cuvs_static PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
498+
"$<INSTALL_INTERFACE:include>"
499+
)
445500

446501
target_include_directories(
447502
cuvs PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
@@ -471,11 +526,17 @@ if(NOT BUILD_CPU_ONLY)
471526
PUBLIC rmm::rmm raft::raft ${CUVS_CTK_MATH_DEPENDENCIES}
472527
PRIVATE nvidia::cutlass::cutlass $<TARGET_NAME_IF_EXISTS:OpenMP::OpenMP_CXX> cuvs-cagra-search
473528
)
529+
530+
target_link_libraries(
531+
cuvs_static
532+
PUBLIC rmm::rmm raft::raft ${CUVS_CTK_MATH_DEPENDENCIES}
533+
PRIVATE nvidia::cutlass::cutlass $<TARGET_NAME_IF_EXISTS:OpenMP::OpenMP_CXX> cuvs-cagra-search
534+
)
474535
endif()
475536

476537
if(BUILD_CAGRA_HNSWLIB)
477-
target_link_libraries(cuvs PRIVATE hnswlib::hnswlib)
478-
target_compile_definitions(cuvs PUBLIC CUVS_BUILD_CAGRA_HNSWLIB)
538+
target_link_libraries(cuvs_objs PRIVATE hnswlib::hnswlib)
539+
target_compile_definitions(cuvs_objs PUBLIC CUVS_BUILD_CAGRA_HNSWLIB)
479540
endif()
480541

481542
# Endian detection
@@ -557,11 +618,16 @@ if(BUILD_C_LIBRARY)
557618
src/neighbors/ivf_flat_c.cpp
558619
src/neighbors/ivf_pq_c.cpp
559620
src/neighbors/cagra_c.cpp
560-
src/neighbors/hnsw_c.cpp
621+
$<$<BOOL:${BUILD_CAGRA_HNSWLIB}>:src/neighbors/hnsw_c.cpp>
561622
src/neighbors/refine/refine_c.cpp
562623
src/distance/pairwise_distance_c.cpp
563624
)
564625

626+
if(BUILD_CAGRA_HNSWLIB)
627+
target_link_libraries(cuvs_c PRIVATE hnswlib::hnswlib)
628+
target_compile_definitions(cuvs_c PUBLIC CUVS_BUILD_CAGRA_HNSWLIB)
629+
endif()
630+
565631
add_library(cuvs::c_api ALIAS cuvs_c)
566632

567633
set_target_properties(
@@ -600,7 +666,7 @@ include(GNUInstallDirs)
600666
include(CPack)
601667

602668
install(
603-
TARGETS cuvs
669+
TARGETS cuvs cuvs_static cuvs-cagra-search
604670
DESTINATION ${lib_dir}
605671
COMPONENT cuvs
606672
EXPORT cuvs-exports

cpp/test/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,8 @@ if(BUILD_TESTS)
174174

175175
if(BUILD_CAGRA_HNSWLIB)
176176
ConfigureTest(NAME NEIGHBORS_HNSW_TEST PATH neighbors/hnsw.cu GPUS 1 PERCENT 100)
177+
target_link_libraries(NEIGHBORS_HNSW_TEST PRIVATE hnswlib::hnswlib)
178+
target_compile_definitions(NEIGHBORS_HNSW_TEST PUBLIC CUVS_BUILD_CAGRA_HNSWLIB)
177179
endif()
178180

179181
ConfigureTest(
@@ -227,6 +229,8 @@ if(BUILD_C_TESTS)
227229

228230
if(BUILD_CAGRA_HNSWLIB)
229231
ConfigureTest(NAME HNSW_C_TEST PATH neighbors/ann_hnsw_c.cu C_LIB)
232+
target_link_libraries(NEIGHBORS_HNSW_TEST PRIVATE hnswlib::hnswlib)
233+
target_compile_definitions(NEIGHBORS_HNSW_TEST PUBLIC CUVS_BUILD_CAGRA_HNSWLIB)
230234
endif()
231235
endif()
232236

0 commit comments

Comments
 (0)