From a8c862f774886cfaf288557e2a86e70d8da3ee24 Mon Sep 17 00:00:00 2001 From: divyegala Date: Mon, 3 Nov 2025 21:32:42 +0000 Subject: [PATCH 01/23] decouple distance type --- c/src/cluster/kmeans.cpp | 6 +-- c/src/distance/pairwise_distance.cpp | 4 +- c/src/neighbors/brute_force.cpp | 2 +- c/src/neighbors/hnsw.cpp | 4 +- c/src/neighbors/refine.cpp | 4 +- cpp/CMakeLists.txt | 10 ---- cpp/include/cuvs/distance/distance.hpp | 50 ++++++++++++++++++- .../neighbors/detail/cagra/cagra_build.cuh | 2 +- 8 files changed, 60 insertions(+), 22 deletions(-) diff --git a/c/src/cluster/kmeans.cpp b/c/src/cluster/kmeans.cpp index dbd9649eed..698f387616 100644 --- a/c/src/cluster/kmeans.cpp +++ b/c/src/cluster/kmeans.cpp @@ -18,7 +18,7 @@ namespace { cuvs::cluster::kmeans::params convert_params(const cuvsKMeansParams& params) { auto kmeans_params = cuvs::cluster::kmeans::params(); - kmeans_params.metric = params.metric; + kmeans_params.metric = static_cast(params.metric); kmeans_params.init = static_cast(params.init); kmeans_params.n_clusters = params.n_clusters; kmeans_params.max_iter = params.max_iter; @@ -33,7 +33,7 @@ cuvs::cluster::kmeans::params convert_params(const cuvsKMeansParams& params) cuvs::cluster::kmeans::balanced_params convert_balanced_params(const cuvsKMeansParams& params) { auto kmeans_params = cuvs::cluster::kmeans::balanced_params(); - kmeans_params.metric = params.metric; + kmeans_params.metric = static_cast(params.metric); kmeans_params.n_iters = params.hierarchical_n_iters; return kmeans_params; } @@ -185,7 +185,7 @@ extern "C" cuvsError_t cuvsKMeansParamsCreate(cuvsKMeansParams_t* params) cuvs::cluster::kmeans::params cpp_params; cuvs::cluster::kmeans::balanced_params cpp_balanced_params; *params = - new cuvsKMeansParams{.metric = cpp_params.metric, + new cuvsKMeansParams{.metric = static_cast(cpp_params.metric), .n_clusters = cpp_params.n_clusters, .init = static_cast(cpp_params.init), .max_iter = cpp_params.max_iter, diff --git a/c/src/distance/pairwise_distance.cpp b/c/src/distance/pairwise_distance.cpp index 6e22d6f7a8..6ddd79e42c 100644 --- a/c/src/distance/pairwise_distance.cpp +++ b/c/src/distance/pairwise_distance.cpp @@ -12,6 +12,7 @@ #include #include +#include #include #include "../core/exceptions.hpp" @@ -35,8 +36,9 @@ void _pairwise_distance(cuvsResources_t res, auto x_mds = cuvs::core::from_dlpack(x_tensor); auto y_mds = cuvs::core::from_dlpack(y_tensor); auto distances_mds = cuvs::core::from_dlpack(distances_tensor); + auto metric_type = static_cast(metric); - cuvs::distance::pairwise_distance(*res_ptr, x_mds, y_mds, distances_mds, metric, metric_arg); + cuvs::distance::pairwise_distance(*res_ptr, x_mds, y_mds, distances_mds, metric_type, metric_arg); } } // namespace diff --git a/c/src/neighbors/brute_force.cpp b/c/src/neighbors/brute_force.cpp index c7e0d04641..74879fba2d 100644 --- a/c/src/neighbors/brute_force.cpp +++ b/c/src/neighbors/brute_force.cpp @@ -35,7 +35,7 @@ void* _build(cuvsResources_t res, auto mds = cuvs::core::from_dlpack(dataset_tensor); cuvs::neighbors::brute_force::index_params params; - params.metric = metric; + params.metric = static_cast((int)metric); params.metric_arg = metric_arg; auto index_on_stack = cuvs::neighbors::brute_force::build(*res_ptr, params, mds); diff --git a/c/src/neighbors/hnsw.cpp b/c/src/neighbors/hnsw.cpp index 0858415de7..b19d98abd0 100644 --- a/c/src/neighbors/hnsw.cpp +++ b/c/src/neighbors/hnsw.cpp @@ -13,7 +13,6 @@ #include #include -#include #include #include @@ -110,8 +109,9 @@ void* _deserialize(cuvsResources_t res, cuvs::neighbors::hnsw::index* index = nullptr; auto cpp_params = cuvs::neighbors::hnsw::index_params(); cpp_params.hierarchy = static_cast(params->hierarchy); + auto metric_type = static_cast(metric); cuvs::neighbors::hnsw::deserialize( - *res_ptr, cpp_params, std::string(filename), dim, metric, &index); + *res_ptr, cpp_params, std::string(filename), dim, metric_type, &index); return index; } } // namespace diff --git a/c/src/neighbors/refine.cpp b/c/src/neighbors/refine.cpp index 82f28e31f7..4bd4c47f39 100644 --- a/c/src/neighbors/refine.cpp +++ b/c/src/neighbors/refine.cpp @@ -41,7 +41,7 @@ void _refine(bool on_device, auto candidates = cuvs::core::from_dlpack(candidates_tensor); auto indices = cuvs::core::from_dlpack(indices_tensor); auto distances = cuvs::core::from_dlpack(distances_tensor); - cuvs::neighbors::refine(*res_ptr, dataset, queries, candidates, indices, distances, metric); + cuvs::neighbors::refine(*res_ptr, dataset, queries, candidates, indices, distances, static_cast((int)metric)); } else { using queries_type = raft::host_matrix_view; using candidates_type = raft::host_matrix_view; @@ -52,7 +52,7 @@ void _refine(bool on_device, auto candidates = cuvs::core::from_dlpack(candidates_tensor); auto indices = cuvs::core::from_dlpack(indices_tensor); auto distances = cuvs::core::from_dlpack(distances_tensor); - cuvs::neighbors::refine(*res_ptr, dataset, queries, candidates, indices, distances, metric); + cuvs::neighbors::refine(*res_ptr, dataset, queries, candidates, indices, distances, static_cast((int)metric)); } } } // namespace diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 7d7ac16942..5996d76b71 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -303,7 +303,6 @@ if(NOT BUILD_CPU_ONLY) target_link_libraries(cuvs-cagra-search PRIVATE raft::raft) target_include_directories( cuvs-cagra-search PRIVATE "$" - "$" ) target_compile_options( cuvs-cagra-search PRIVATE "$<$:${CUVS_CXX_FLAGS}>" @@ -554,7 +553,6 @@ if(NOT BUILD_CPU_ONLY) target_include_directories( cuvs_objs PUBLIC "$" - "$" INTERFACE "$" ) @@ -620,7 +618,6 @@ if(NOT BUILD_CPU_ONLY) cuvs PUBLIC "$" "$" - "$" "$" ) @@ -683,7 +680,6 @@ SECTIONS cuvs_static PUBLIC "$" "$" - "$" "$" ) target_link_libraries( @@ -749,12 +745,6 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$:NVTX_ENAB ) if(BUILD_C_LIBRARY) - install( - DIRECTORY ../c/include/cuvs - COMPONENT cuvs - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - ) - install( TARGETS cuvs_c DESTINATION ${lib_dir} diff --git a/cpp/include/cuvs/distance/distance.hpp b/cpp/include/cuvs/distance/distance.hpp index b72151a610..62f2ae3894 100644 --- a/cpp/include/cuvs/distance/distance.hpp +++ b/cpp/include/cuvs/distance/distance.hpp @@ -7,14 +7,60 @@ #include #include -#include #include #include #include namespace cuvs::distance { -using DistanceType = cuvsDistanceType; +/** enum to tell how to compute distance */ +enum class DistanceType : int { + + /** evaluate as dist_ij = sum(x_ik^2) + sum(y_ij)^2 - 2*sum(x_ik * y_jk) */ + L2Expanded = 0, + /** same as above, but inside the epilogue, perform square root operation */ + L2SqrtExpanded = 1, + /** cosine distance */ + CosineExpanded = 2, + /** L1 distance */ + L1 = 3, + /** evaluate as dist_ij += (x_ik - y-jk)^2 */ + L2Unexpanded = 4, + /** same as above, but inside the epilogue, perform square root operation */ + L2SqrtUnexpanded = 5, + /** basic inner product **/ + InnerProduct = 6, + /** Chebyshev (Linf) distance **/ + Linf = 7, + /** Canberra distance **/ + Canberra = 8, + /** Generalized Minkowski distance **/ + LpUnexpanded = 9, + /** Correlation distance **/ + CorrelationExpanded = 10, + /** Jaccard distance **/ + JaccardExpanded = 11, + /** Hellinger distance **/ + HellingerExpanded = 12, + /** Haversine distance **/ + Haversine = 13, + /** Bray-Curtis distance **/ + BrayCurtis = 14, + /** Jensen-Shannon distance**/ + JensenShannon = 15, + /** Hamming distance **/ + HammingUnexpanded = 16, + /** KLDivergence **/ + KLDivergence = 17, + /** RusselRao **/ + RusselRaoExpanded = 18, + /** Dice-Sorensen distance **/ + DiceExpanded = 19, + /** Bitstring Hamming distance **/ + BitwiseHamming = 20, + /** Precomputed (special value) **/ + Precomputed = 100 +}; /** * Whether minimal distance corresponds to similar elements (using the given metric). diff --git a/cpp/src/neighbors/detail/cagra/cagra_build.cuh b/cpp/src/neighbors/detail/cagra/cagra_build.cuh index bd1ad85d44..cae399c0f9 100644 --- a/cpp/src/neighbors/detail/cagra/cagra_build.cuh +++ b/cpp/src/neighbors/detail/cagra/cagra_build.cuh @@ -700,7 +700,7 @@ index build( } } RAFT_EXPECTS( - params.metric != BitwiseHamming || + params.metric != cuvs::distance::DistanceType::BitwiseHamming || std::holds_alternative( knn_build_params) || std::holds_alternative(knn_build_params), From ac63cd1401665ae7971f8c02eeacb0df8d152c16 Mon Sep 17 00:00:00 2001 From: divyegala Date: Mon, 3 Nov 2025 21:51:06 +0000 Subject: [PATCH 02/23] more updates --- c/src/neighbors/brute_force.cpp | 2 ++ c/src/neighbors/cagra.cpp | 2 ++ c/src/neighbors/hnsw.cpp | 2 ++ c/src/neighbors/nn_descent.cpp | 3 ++- c/src/neighbors/refine.cpp | 2 ++ c/src/neighbors/tiered_index.cpp | 6 ++++-- c/tests/neighbors/brute_force_c.cu | 14 +++++++------- cpp/src/neighbors/detail/cagra/cagra_build.cuh | 4 ++-- cpp/src/neighbors/detail/nn_descent.cuh | 2 +- cpp/tests/neighbors/ann_cagra.cuh | 12 ++++++------ 10 files changed, 30 insertions(+), 19 deletions(-) diff --git a/c/src/neighbors/brute_force.cpp b/c/src/neighbors/brute_force.cpp index 74879fba2d..097f6b0f07 100644 --- a/c/src/neighbors/brute_force.cpp +++ b/c/src/neighbors/brute_force.cpp @@ -14,6 +14,8 @@ #include #include +#include +#include #include #include #include diff --git a/c/src/neighbors/cagra.cpp b/c/src/neighbors/cagra.cpp index 215dbdf308..b8242fe07a 100644 --- a/c/src/neighbors/cagra.cpp +++ b/c/src/neighbors/cagra.cpp @@ -12,6 +12,8 @@ #include #include +#include +#include #include #include #include diff --git a/c/src/neighbors/hnsw.cpp b/c/src/neighbors/hnsw.cpp index b19d98abd0..ac517689fd 100644 --- a/c/src/neighbors/hnsw.cpp +++ b/c/src/neighbors/hnsw.cpp @@ -13,6 +13,8 @@ #include #include +#include +#include #include #include diff --git a/c/src/neighbors/nn_descent.cpp b/c/src/neighbors/nn_descent.cpp index b0026e4fa2..62079bb274 100644 --- a/c/src/neighbors/nn_descent.cpp +++ b/c/src/neighbors/nn_descent.cpp @@ -15,6 +15,7 @@ #include #include +#include #include #include @@ -170,7 +171,7 @@ extern "C" cuvsError_t cuvsNNDescentIndexParamsCreate(cuvsNNDescentIndexParams_t cuvs::neighbors::nn_descent::index_params cpp_params; *params = new cuvsNNDescentIndexParams{ - .metric = cpp_params.metric, + .metric = static_cast((int)cpp_params.metric), .metric_arg = cpp_params.metric_arg, .graph_degree = cpp_params.graph_degree, .intermediate_graph_degree = cpp_params.intermediate_graph_degree, diff --git a/c/src/neighbors/refine.cpp b/c/src/neighbors/refine.cpp index 4bd4c47f39..46304628ae 100644 --- a/c/src/neighbors/refine.cpp +++ b/c/src/neighbors/refine.cpp @@ -11,6 +11,8 @@ #include #include +#include +#include #include #include diff --git a/c/src/neighbors/tiered_index.cpp b/c/src/neighbors/tiered_index.cpp index 2f8ed1ec37..2a7d54b16d 100644 --- a/c/src/neighbors/tiered_index.cpp +++ b/c/src/neighbors/tiered_index.cpp @@ -12,6 +12,8 @@ #include #include +#include +#include #include #include @@ -35,7 +37,7 @@ void convert_c_index_params(cuvsTieredIndexParams params, { out->min_ann_rows = params.min_ann_rows; out->create_ann_index_on_extend = params.create_ann_index_on_extend; - out->metric = params.metric; + out->metric = static_cast((int)params.metric); if constexpr (std::is_same_v) { if (params.cagra_params != NULL) { @@ -314,7 +316,7 @@ extern "C" cuvsError_t cuvsTieredIndexParamsCreate(cuvsTieredIndexParams_t* para return cuvs::core::translate_exceptions([=] { cuvs::neighbors::tiered_index::index_params cpp_params; *params = new cuvsTieredIndexParams{ - .metric = cpp_params.metric, + .metric = static_cast((int)cpp_params.metric), .algo = CUVS_TIERED_INDEX_ALGO_CAGRA, .min_ann_rows = cpp_params.min_ann_rows, .create_ann_index_on_extend = cpp_params.create_ann_index_on_extend}; diff --git a/c/tests/neighbors/brute_force_c.cu b/c/tests/neighbors/brute_force_c.cu index f4450c9d3b..0e7191c84e 100644 --- a/c/tests/neighbors/brute_force_c.cu +++ b/c/tests/neighbors/brute_force_c.cu @@ -161,11 +161,11 @@ void cpu_sddmm(value_t* A, norms_B += B[b_index] * B[b_index]; } vals[j] = alpha * sum + beta * vals[j]; - if (metric == cuvs::distance::DistanceType::L2Expanded) { + if (metric == L2Expanded) { vals[j] = value_t(-2.0) * vals[j] + norms_A + norms_B; - } else if (metric == cuvs::distance::DistanceType::L2SqrtExpanded) { + } else if (metric == L2SqrtExpanded) { vals[j] = std::sqrt(value_t(-2.0) * vals[j] + norms_A + norms_B); - } else if (metric == cuvs::distance::DistanceType::CosineExpanded) { + } else if (metric == CosineExpanded) { vals[j] = value_t(1.0) - vals[j] / std::sqrt(norms_A * norms_B); } } @@ -306,7 +306,7 @@ void recall_eval(T* query_data, n_rows, n_dim, n_neighbors, - static_cast((uint16_t)metric)); + static_cast((int)metric)); size_t size = n_queries * n_neighbors; std::vector neighbors_h(size); @@ -363,7 +363,7 @@ void recall_eval_with_filter(T* query_data, raft::copy(queries_h.data(), query_data, n_queries * n_dim, stream); raft::copy(indices_h.data(), index_data, n_rows * n_dim, stream); - bool select_min = cuvs::distance::is_min_close(metric); + bool select_min = cuvs::distance::is_min_close(static_cast((int)metric)); cpu_brute_force_with_filter(queries_h.data(), indices_h.data(), @@ -377,7 +377,7 @@ void recall_eval_with_filter(T* query_data, n_neighbors, nnz, select_min, - static_cast((uint16_t)metric)); + static_cast((int)metric)); // verify output double min_recall = 0.95; @@ -453,7 +453,7 @@ void run_test_with_filter(int64_t n_samples, int64_t nnz = create_sparse_matrix(n_rows_filter, n_samples, sparsity, filter_h); cuvsDistanceType metric = L2Expanded; - bool select_min = cuvs::distance::is_min_close(metric); + bool select_min = cuvs::distance::is_min_close(static_cast((int)metric)); std::vector distances_ref_h( n_queries * n_neighbors, diff --git a/cpp/src/neighbors/detail/cagra/cagra_build.cuh b/cpp/src/neighbors/detail/cagra/cagra_build.cuh index cae399c0f9..08ba6bf207 100644 --- a/cpp/src/neighbors/detail/cagra/cagra_build.cuh +++ b/cpp/src/neighbors/detail/cagra/cagra_build.cuh @@ -131,7 +131,7 @@ void build_knn_graph( const std::string model_name = [&]() { char model_name[1024]; sprintf(model_name, - "%s-%lux%lu.cluster_%u.pq_%u.%ubit.itr_%u.metric_%u.pqcenter_%u", + "%s-%lux%lu.cluster_%u.pq_%u.%ubit.itr_%u.metric_%d.pqcenter_%u", "IVF-PQ", static_cast(dataset.extent(0)), static_cast(dataset.extent(1)), @@ -139,7 +139,7 @@ void build_knn_graph( pq.build_params.pq_dim, pq.build_params.pq_bits, pq.build_params.kmeans_n_iters, - pq.build_params.metric, + static_cast(pq.build_params.metric), static_cast(pq.build_params.codebook_kind)); return std::string(model_name); }(); diff --git a/cpp/src/neighbors/detail/nn_descent.cuh b/cpp/src/neighbors/detail/nn_descent.cuh index 9b1525e2bf..db26fbe6d9 100644 --- a/cpp/src/neighbors/detail/nn_descent.cuh +++ b/cpp/src/neighbors/detail/nn_descent.cuh @@ -1108,7 +1108,7 @@ void GNND::build(Data_t* data, { using input_t = typename std::remove_const::type; - if (build_config_.metric == cuvsDistanceType::BitwiseHamming && + if (build_config_.metric == distance::DistanceType::BitwiseHamming && !(std::is_same_v || std::is_same_v)) { RAFT_FAIL( "Data type needs to be int8 or uint8 for NN Descent to run with BitwiseHamming distance."); diff --git a/cpp/tests/neighbors/ann_cagra.cuh b/cpp/tests/neighbors/ann_cagra.cuh index ea10df800f..ee16467e13 100644 --- a/cpp/tests/neighbors/ann_cagra.cuh +++ b/cpp/tests/neighbors/ann_cagra.cuh @@ -193,7 +193,7 @@ void InitDataset(const raft::resources& handle, if constexpr (std::is_same_v || std::is_same_v) { GenerateRoundingErrorFreeDataset(handle, datatset_ptr, size, dim, r, true); - if (metric == InnerProduct) { + if (metric == cuvs::distance::DistanceType::InnerProduct) { auto dataset_view = raft::make_device_matrix_view(datatset_ptr, size, dim); raft::linalg::row_normalize( handle, raft::make_const_mdspan(dataset_view), dataset_view); @@ -205,7 +205,7 @@ void InitDataset(const raft::resources& handle, raft::random::uniformInt(handle, r, datatset_ptr, size * dim, DataT(1), DataT(20)); } - if (metric == InnerProduct) { + if (metric == cuvs::distance::DistanceType::InnerProduct) { // TODO (enp1s0): Change this once row_normalize supports (u)int8 matrices. // https://github.com/rapidsai/raft/issues/2291 @@ -282,10 +282,10 @@ inline ::std::ostream& operator<<(::std::ostream& os, const AnnCagraInputs& p) { const auto metric_str = [](const cuvs::distance::DistanceType dist) -> std::string { switch (dist) { - case InnerProduct: return "InnerProduct"; - case L2Expanded: return "L2"; - case BitwiseHamming: return "BitwiseHamming"; - case CosineExpanded: return "Cosine"; + case cuvs::distance::DistanceType::InnerProduct: return "InnerProduct"; + case cuvs::distance::DistanceType::L2Expanded: return "L2"; + case cuvs::distance::DistanceType::BitwiseHamming: return "BitwiseHamming"; + case cuvs::distance::DistanceType::CosineExpanded: return "Cosine"; default: break; } return "Unknown"; From 1b6a045ce7e6210ba5968c313da887d64af244d5 Mon Sep 17 00:00:00 2001 From: divyegala Date: Mon, 3 Nov 2025 21:56:03 +0000 Subject: [PATCH 03/23] more fixes --- c/src/neighbors/all_neighbors.cpp | 1 + c/tests/neighbors/brute_force_c.cu | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/c/src/neighbors/all_neighbors.cpp b/c/src/neighbors/all_neighbors.cpp index bd936bd562..22e0929e2b 100644 --- a/c/src/neighbors/all_neighbors.cpp +++ b/c/src/neighbors/all_neighbors.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include #include diff --git a/c/tests/neighbors/brute_force_c.cu b/c/tests/neighbors/brute_force_c.cu index 0e7191c84e..eb04ffc608 100644 --- a/c/tests/neighbors/brute_force_c.cu +++ b/c/tests/neighbors/brute_force_c.cu @@ -377,7 +377,7 @@ void recall_eval_with_filter(T* query_data, n_neighbors, nnz, select_min, - static_cast((int)metric)); + metric); // verify output double min_recall = 0.95; From 681c457c2e1675398c44c1919f9f50b8e9e0d7bf Mon Sep 17 00:00:00 2001 From: divyegala Date: Mon, 3 Nov 2025 22:59:21 +0000 Subject: [PATCH 04/23] fix --- cpp/src/cluster/detail/kmeans_common.cuh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cpp/src/cluster/detail/kmeans_common.cuh b/cpp/src/cluster/detail/kmeans_common.cuh index 0d3b99d5ff..c40aeb7cac 100644 --- a/cpp/src/cluster/detail/kmeans_common.cuh +++ b/cpp/src/cluster/detail/kmeans_common.cuh @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2022-2024, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2022-2025, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ #pragma once @@ -306,7 +306,8 @@ void pairwise_distance_kmeans(raft::resources const& handle, raft::layout_c_contiguous, IndexT>(handle, X, centroids, pairwiseDistance); } else { - RAFT_FAIL("kmeans requires L2Expanded or L2SqrtExpanded distance, have %i", metric); + RAFT_FAIL("kmeans requires L2Expanded or L2SqrtExpanded distance, have %i", + static_cast(metric)); } } From b6772062e91ca345eb9ae9a44fa45423b28e09ad Mon Sep 17 00:00:00 2001 From: divyegala Date: Mon, 3 Nov 2025 23:42:37 +0000 Subject: [PATCH 05/23] add patch to faiss --- .../patches/faiss/cpp-distance-type.patch | 73 +++++++++++++++++++ cpp/cmake/patches/faiss_override.json | 5 ++ 2 files changed, 78 insertions(+) create mode 100644 cpp/cmake/patches/faiss/cpp-distance-type.patch diff --git a/cpp/cmake/patches/faiss/cpp-distance-type.patch b/cpp/cmake/patches/faiss/cpp-distance-type.patch new file mode 100644 index 0000000000..63dcbdced8 --- /dev/null +++ b/cpp/cmake/patches/faiss/cpp-distance-type.patch @@ -0,0 +1,73 @@ +diff --git a/faiss/gpu/GpuDistance.cu b/faiss/gpu/GpuDistance.cu +index c82c73e7d..b9100c272 100644 +--- a/faiss/gpu/GpuDistance.cu ++++ b/faiss/gpu/GpuDistance.cu +@@ -239,7 +239,7 @@ void bfKnn(GpuResourcesProvider* prov, const GpuDistanceParams& args) { + if (should_use_cuvs(args) && args.queriesRowMajor == args.vectorsRowMajor && + args.outIndicesType == IndicesDataType::I64 && + args.vectorType == DistanceDataType::F32 && args.k > 0) { +- cuvsDistanceType distance = metricFaissToCuvs(args.metric, false); ++ auto distance = metricFaissToCuvs(args.metric, false); + + auto resImpl = prov->getResources(); + auto res = resImpl.get(); +diff --git a/faiss/gpu/impl/CuvsFlatIndex.cu b/faiss/gpu/impl/CuvsFlatIndex.cu +index 15cf427cf..d877e766d 100644 +--- a/faiss/gpu/impl/CuvsFlatIndex.cu ++++ b/faiss/gpu/impl/CuvsFlatIndex.cu +@@ -92,7 +92,7 @@ void CuvsFlatIndex::query( + outDistances.getSize(0), + outDistances.getSize(1)); + +- cuvsDistanceType distance = metricFaissToCuvs(metric, exactDistance); ++ auto distance = metricFaissToCuvs(metric, exactDistance); + + std::optional> + norms_view = raft::make_device_vector_view( +diff --git a/faiss/gpu/utils/CuvsUtils.h b/faiss/gpu/utils/CuvsUtils.h +index e44e5f12d..42fe8ca48 100644 +--- a/faiss/gpu/utils/CuvsUtils.h ++++ b/faiss/gpu/utils/CuvsUtils.h +@@ -27,32 +27,32 @@ + #include + #include + +-#include ++#include + + #pragma GCC visibility push(default) + namespace faiss { + namespace gpu { + +-inline cuvsDistanceType metricFaissToCuvs( ++inline cuvs::distance::DistanceType metricFaissToCuvs( + MetricType metric, + bool exactDistance) { + switch (metric) { + case MetricType::METRIC_INNER_PRODUCT: +- return cuvsDistanceType::InnerProduct; ++ return cuvs::distance::DistanceType::InnerProduct; + case MetricType::METRIC_L2: +- return cuvsDistanceType::L2Expanded; ++ return cuvs::distance::DistanceType::L2Expanded; + case MetricType::METRIC_L1: +- return cuvsDistanceType::L1; ++ return cuvs::distance::DistanceType::L1; + case MetricType::METRIC_Linf: +- return cuvsDistanceType::Linf; ++ return cuvs::distance::DistanceType::Linf; + case MetricType::METRIC_Lp: +- return cuvsDistanceType::LpUnexpanded; ++ return cuvs::distance::DistanceType::LpUnexpanded; + case MetricType::METRIC_Canberra: +- return cuvsDistanceType::Canberra; ++ return cuvs::distance::DistanceType::Canberra; + case MetricType::METRIC_BrayCurtis: +- return cuvsDistanceType::BrayCurtis; ++ return cuvs::distance::DistanceType::BrayCurtis; + case MetricType::METRIC_JensenShannon: +- return cuvsDistanceType::JensenShannon; ++ return cuvs::distance::DistanceType::JensenShannon; + default: + RAFT_FAIL("Distance type not supported"); + } diff --git a/cpp/cmake/patches/faiss_override.json b/cpp/cmake/patches/faiss_override.json index 84cd248b57..37ec2253e0 100644 --- a/cpp/cmake/patches/faiss_override.json +++ b/cpp/cmake/patches/faiss_override.json @@ -14,6 +14,11 @@ "file" : "${current_json_dir}/faiss/refactor-rmm-memory-resources.patch", "issue" : "Refactor RMM memory resources to use updated APIs", "fixed_in" : "" + }, + { + "file" : "${current_json_dir}/faiss/cpp-distance-type.patch", + "issue" : "Use C++ distance type instead of C distance type", + "fixed_in" : "" } ] } From f23bb38c1dc9058c9f6a75fc6442e28e0df87110 Mon Sep 17 00:00:00 2001 From: divyegala Date: Mon, 3 Nov 2025 23:46:11 +0000 Subject: [PATCH 06/23] one more cast --- cpp/src/distance/sparse_distance.cuh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/src/distance/sparse_distance.cuh b/cpp/src/distance/sparse_distance.cuh index ea3c2038e3..915941b220 100644 --- a/cpp/src/distance/sparse_distance.cuh +++ b/cpp/src/distance/sparse_distance.cuh @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2024, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ @@ -97,7 +97,7 @@ void pairwiseDistance(value_t* out, .compute(out); break; - default: THROW("Unsupported distance: %d", metric); + default: THROW("Unsupported distance: %d", static_cast(metric)); } } }; // namespace distance From 83625effefd011ec7fe52a953fc609067226399d Mon Sep 17 00:00:00 2001 From: divyegala Date: Tue, 4 Nov 2025 00:54:49 +0000 Subject: [PATCH 07/23] combine faiss patches --- ...-rmm-memory-resources.patch => faiss.diff} | 111 ++++++++++++++++-- .../patches/faiss/cpp-distance-type.patch | 73 ------------ ...fix-missing-includes-for-thrust-copy.patch | 40 ------- cpp/cmake/patches/faiss_override.json | 14 +-- 4 files changed, 102 insertions(+), 136 deletions(-) rename cpp/cmake/patches/{faiss/refactor-rmm-memory-resources.patch => faiss.diff} (51%) delete mode 100644 cpp/cmake/patches/faiss/cpp-distance-type.patch delete mode 100644 cpp/cmake/patches/faiss/fix-missing-includes-for-thrust-copy.patch diff --git a/cpp/cmake/patches/faiss/refactor-rmm-memory-resources.patch b/cpp/cmake/patches/faiss.diff similarity index 51% rename from cpp/cmake/patches/faiss/refactor-rmm-memory-resources.patch rename to cpp/cmake/patches/faiss.diff index 19df8a514a..185449c4e2 100644 --- a/cpp/cmake/patches/faiss/refactor-rmm-memory-resources.patch +++ b/cpp/cmake/patches/faiss.diff @@ -1,13 +1,16 @@ -From 0aa03d6eaf4bacc4d669254499966d892453961d Mon Sep 17 00:00:00 2001 -From: Bradley Dice -Date: Wed, 29 Oct 2025 12:37:57 -0500 -Subject: [PATCH] Refactor RMM memory resources - ---- - faiss/gpu/StandardGpuResources.cpp | 14 +++++++------- - faiss/gpu/StandardGpuResources.h | 7 ++++--- - 2 files changed, 11 insertions(+), 10 deletions(-) +diff --git a/faiss/gpu/GpuDistance.cu b/faiss/gpu/GpuDistance.cu +index c82c73e7d..b9100c272 100644 +--- a/faiss/gpu/GpuDistance.cu ++++ b/faiss/gpu/GpuDistance.cu +@@ -239,7 +239,7 @@ void bfKnn(GpuResourcesProvider* prov, const GpuDistanceParams& args) { + if (should_use_cuvs(args) && args.queriesRowMajor == args.vectorsRowMajor && + args.outIndicesType == IndicesDataType::I64 && + args.vectorType == DistanceDataType::F32 && args.k > 0) { +- cuvsDistanceType distance = metricFaissToCuvs(args.metric, false); ++ auto distance = metricFaissToCuvs(args.metric, false); + auto resImpl = prov->getResources(); + auto res = resImpl.get(); diff --git a/faiss/gpu/StandardGpuResources.cpp b/faiss/gpu/StandardGpuResources.cpp index 649b7cb5c..765fdb3d0 100644 --- a/faiss/gpu/StandardGpuResources.cpp @@ -101,5 +104,91 @@ index f23ca19d8..c43926fce 100644 #endif /// Pinned memory allocation for use with this GPU --- -2.51.0 +diff --git a/faiss/gpu/impl/BinaryCuvsCagra.cu b/faiss/gpu/impl/BinaryCuvsCagra.cu +index 0ca21dc5f..b331fdc8f 100644 +--- a/faiss/gpu/impl/BinaryCuvsCagra.cu ++++ b/faiss/gpu/impl/BinaryCuvsCagra.cu +@@ -32,6 +32,9 @@ + #include + #include + ++#include ++#include ++ + namespace faiss { + namespace gpu { + +diff --git a/faiss/gpu/impl/CuvsCagra.cu b/faiss/gpu/impl/CuvsCagra.cu +index 482e4d672..4246776e8 100644 +--- a/faiss/gpu/impl/CuvsCagra.cu ++++ b/faiss/gpu/impl/CuvsCagra.cu +@@ -31,6 +31,9 @@ + #include + #include + ++#include ++#include ++ + namespace faiss { + namespace gpu { + +diff --git a/faiss/gpu/impl/CuvsFlatIndex.cu b/faiss/gpu/impl/CuvsFlatIndex.cu +index 15cf427cf..d877e766d 100644 +--- a/faiss/gpu/impl/CuvsFlatIndex.cu ++++ b/faiss/gpu/impl/CuvsFlatIndex.cu +@@ -92,7 +92,7 @@ void CuvsFlatIndex::query( + outDistances.getSize(0), + outDistances.getSize(1)); + +- cuvsDistanceType distance = metricFaissToCuvs(metric, exactDistance); ++ auto distance = metricFaissToCuvs(metric, exactDistance); + + std::optional> + norms_view = raft::make_device_vector_view( +diff --git a/faiss/gpu/utils/CuvsUtils.h b/faiss/gpu/utils/CuvsUtils.h +index e44e5f12d..42fe8ca48 100644 +--- a/faiss/gpu/utils/CuvsUtils.h ++++ b/faiss/gpu/utils/CuvsUtils.h +@@ -27,32 +27,32 @@ + #include + #include + +-#include ++#include + + #pragma GCC visibility push(default) + namespace faiss { + namespace gpu { + +-inline cuvsDistanceType metricFaissToCuvs( ++inline cuvs::distance::DistanceType metricFaissToCuvs( + MetricType metric, + bool exactDistance) { + switch (metric) { + case MetricType::METRIC_INNER_PRODUCT: +- return cuvsDistanceType::InnerProduct; ++ return cuvs::distance::DistanceType::InnerProduct; + case MetricType::METRIC_L2: +- return cuvsDistanceType::L2Expanded; ++ return cuvs::distance::DistanceType::L2Expanded; + case MetricType::METRIC_L1: +- return cuvsDistanceType::L1; ++ return cuvs::distance::DistanceType::L1; + case MetricType::METRIC_Linf: +- return cuvsDistanceType::Linf; ++ return cuvs::distance::DistanceType::Linf; + case MetricType::METRIC_Lp: +- return cuvsDistanceType::LpUnexpanded; ++ return cuvs::distance::DistanceType::LpUnexpanded; + case MetricType::METRIC_Canberra: +- return cuvsDistanceType::Canberra; ++ return cuvs::distance::DistanceType::Canberra; + case MetricType::METRIC_BrayCurtis: +- return cuvsDistanceType::BrayCurtis; ++ return cuvs::distance::DistanceType::BrayCurtis; + case MetricType::METRIC_JensenShannon: +- return cuvsDistanceType::JensenShannon; ++ return cuvs::distance::DistanceType::JensenShannon; + default: + RAFT_FAIL("Distance type not supported"); + } diff --git a/cpp/cmake/patches/faiss/cpp-distance-type.patch b/cpp/cmake/patches/faiss/cpp-distance-type.patch deleted file mode 100644 index 63dcbdced8..0000000000 --- a/cpp/cmake/patches/faiss/cpp-distance-type.patch +++ /dev/null @@ -1,73 +0,0 @@ -diff --git a/faiss/gpu/GpuDistance.cu b/faiss/gpu/GpuDistance.cu -index c82c73e7d..b9100c272 100644 ---- a/faiss/gpu/GpuDistance.cu -+++ b/faiss/gpu/GpuDistance.cu -@@ -239,7 +239,7 @@ void bfKnn(GpuResourcesProvider* prov, const GpuDistanceParams& args) { - if (should_use_cuvs(args) && args.queriesRowMajor == args.vectorsRowMajor && - args.outIndicesType == IndicesDataType::I64 && - args.vectorType == DistanceDataType::F32 && args.k > 0) { -- cuvsDistanceType distance = metricFaissToCuvs(args.metric, false); -+ auto distance = metricFaissToCuvs(args.metric, false); - - auto resImpl = prov->getResources(); - auto res = resImpl.get(); -diff --git a/faiss/gpu/impl/CuvsFlatIndex.cu b/faiss/gpu/impl/CuvsFlatIndex.cu -index 15cf427cf..d877e766d 100644 ---- a/faiss/gpu/impl/CuvsFlatIndex.cu -+++ b/faiss/gpu/impl/CuvsFlatIndex.cu -@@ -92,7 +92,7 @@ void CuvsFlatIndex::query( - outDistances.getSize(0), - outDistances.getSize(1)); - -- cuvsDistanceType distance = metricFaissToCuvs(metric, exactDistance); -+ auto distance = metricFaissToCuvs(metric, exactDistance); - - std::optional> - norms_view = raft::make_device_vector_view( -diff --git a/faiss/gpu/utils/CuvsUtils.h b/faiss/gpu/utils/CuvsUtils.h -index e44e5f12d..42fe8ca48 100644 ---- a/faiss/gpu/utils/CuvsUtils.h -+++ b/faiss/gpu/utils/CuvsUtils.h -@@ -27,32 +27,32 @@ - #include - #include - --#include -+#include - - #pragma GCC visibility push(default) - namespace faiss { - namespace gpu { - --inline cuvsDistanceType metricFaissToCuvs( -+inline cuvs::distance::DistanceType metricFaissToCuvs( - MetricType metric, - bool exactDistance) { - switch (metric) { - case MetricType::METRIC_INNER_PRODUCT: -- return cuvsDistanceType::InnerProduct; -+ return cuvs::distance::DistanceType::InnerProduct; - case MetricType::METRIC_L2: -- return cuvsDistanceType::L2Expanded; -+ return cuvs::distance::DistanceType::L2Expanded; - case MetricType::METRIC_L1: -- return cuvsDistanceType::L1; -+ return cuvs::distance::DistanceType::L1; - case MetricType::METRIC_Linf: -- return cuvsDistanceType::Linf; -+ return cuvs::distance::DistanceType::Linf; - case MetricType::METRIC_Lp: -- return cuvsDistanceType::LpUnexpanded; -+ return cuvs::distance::DistanceType::LpUnexpanded; - case MetricType::METRIC_Canberra: -- return cuvsDistanceType::Canberra; -+ return cuvs::distance::DistanceType::Canberra; - case MetricType::METRIC_BrayCurtis: -- return cuvsDistanceType::BrayCurtis; -+ return cuvs::distance::DistanceType::BrayCurtis; - case MetricType::METRIC_JensenShannon: -- return cuvsDistanceType::JensenShannon; -+ return cuvs::distance::DistanceType::JensenShannon; - default: - RAFT_FAIL("Distance type not supported"); - } diff --git a/cpp/cmake/patches/faiss/fix-missing-includes-for-thrust-copy.patch b/cpp/cmake/patches/faiss/fix-missing-includes-for-thrust-copy.patch deleted file mode 100644 index 9f250b88be..0000000000 --- a/cpp/cmake/patches/faiss/fix-missing-includes-for-thrust-copy.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 87c5331dfa6ec30fd9839ecb89af519e65f010e7 Mon Sep 17 00:00:00 2001 -From: Bradley Dice -Date: Mon, 29 Sep 2025 15:39:17 -0500 -Subject: [PATCH] Fix missing includes for thrust::copy - ---- - faiss/gpu/impl/BinaryCuvsCagra.cu | 3 +++ - faiss/gpu/impl/CuvsCagra.cu | 3 +++ - 2 files changed, 6 insertions(+) - -diff --git a/faiss/gpu/impl/BinaryCuvsCagra.cu b/faiss/gpu/impl/BinaryCuvsCagra.cu -index 0ca21dc5f..b331fdc8f 100644 ---- a/faiss/gpu/impl/BinaryCuvsCagra.cu -+++ b/faiss/gpu/impl/BinaryCuvsCagra.cu -@@ -32,6 +32,9 @@ - #include - #include - -+#include -+#include -+ - namespace faiss { - namespace gpu { - -diff --git a/faiss/gpu/impl/CuvsCagra.cu b/faiss/gpu/impl/CuvsCagra.cu -index 9ac4e1c5a..755817f43 100644 ---- a/faiss/gpu/impl/CuvsCagra.cu -+++ b/faiss/gpu/impl/CuvsCagra.cu -@@ -31,6 +31,9 @@ - #include - #include - -+#include -+#include -+ - namespace faiss { - namespace gpu { - --- -2.49.0 diff --git a/cpp/cmake/patches/faiss_override.json b/cpp/cmake/patches/faiss_override.json index 37ec2253e0..d2c0478bda 100644 --- a/cpp/cmake/patches/faiss_override.json +++ b/cpp/cmake/patches/faiss_override.json @@ -6,18 +6,8 @@ "git_tag": "v1.12.0", "patches" : [ { - "file" : "${current_json_dir}/faiss/fix-missing-includes-for-thrust-copy.patch", - "issue" : "Fix missing Thrust includes. https://github.com/facebookresearch/faiss/pull/4597", - "fixed_in" : "" - }, - { - "file" : "${current_json_dir}/faiss/refactor-rmm-memory-resources.patch", - "issue" : "Refactor RMM memory resources to use updated APIs", - "fixed_in" : "" - }, - { - "file" : "${current_json_dir}/faiss/cpp-distance-type.patch", - "issue" : "Use C++ distance type instead of C distance type", + "file" : "${current_json_dir}/faiss/faiss.diff", + "issue" : "Multiple fixes for cuVS compatibility", "fixed_in" : "" } ] From 692cfc5200de60086927ced37357627722640ddf Mon Sep 17 00:00:00 2001 From: divyegala Date: Tue, 4 Nov 2025 01:50:28 +0000 Subject: [PATCH 08/23] correct path --- cpp/cmake/patches/faiss_override.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/cmake/patches/faiss_override.json b/cpp/cmake/patches/faiss_override.json index d2c0478bda..b8358da48b 100644 --- a/cpp/cmake/patches/faiss_override.json +++ b/cpp/cmake/patches/faiss_override.json @@ -6,7 +6,7 @@ "git_tag": "v1.12.0", "patches" : [ { - "file" : "${current_json_dir}/faiss/faiss.diff", + "file" : "${current_json_dir}/faiss.diff", "issue" : "Multiple fixes for cuVS compatibility", "fixed_in" : "" } From aae2a970e366f598fcb7e5b0e6447ae0a679eafb Mon Sep 17 00:00:00 2001 From: divyegala Date: Tue, 4 Nov 2025 02:55:06 +0000 Subject: [PATCH 09/23] install c headers --- cpp/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 5996d76b71..04641e64e2 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -752,6 +752,12 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$:NVTX_ENAB EXPORT cuvs-c-exports ) + install( + DIRECTORY ../c/include/cuvs/ + component c_api + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + ) + install( FILES ${CUVS_C_BINARY_DIR}/include/cuvs/core/c_config.h COMPONENT cuvs From 8055f351add2a411bc17517330a2840caa0dbe70 Mon Sep 17 00:00:00 2001 From: divyegala Date: Tue, 4 Nov 2025 03:40:30 +0000 Subject: [PATCH 10/23] correct dir structure --- cpp/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 04641e64e2..afbe3d93d9 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -754,8 +754,8 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$:NVTX_ENAB install( DIRECTORY ../c/include/cuvs/ - component c_api - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT c_api + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cuvs ) install( From 1605aa3921d85f3318b879b95df98872dcf8813a Mon Sep 17 00:00:00 2001 From: divyegala Date: Tue, 4 Nov 2025 04:38:50 +0000 Subject: [PATCH 11/23] separate components --- conda/recipes/libcuvs/recipe.yaml | 121 ++++++++++++++++++++++++++++++ cpp/CMakeLists.txt | 108 ++++++++++++++------------ 2 files changed, 182 insertions(+), 47 deletions(-) diff --git a/conda/recipes/libcuvs/recipe.yaml b/conda/recipes/libcuvs/recipe.yaml index 8b4516dc36..878f269aa1 100644 --- a/conda/recipes/libcuvs/recipe.yaml +++ b/conda/recipes/libcuvs/recipe.yaml @@ -78,6 +78,61 @@ cache: - mkl-devel =2023 outputs: + - package: + name: libcuvs-headers + version: ${{ version }} + build: + string: cuda${{ cuda_major }}_${{ date_string }}_${{ head_rev }} + dynamic_linking: + overlinking_behavior: "error" + prefix_detection: + ignore_binary_files: True + script: + content: | + cmake --install cpp/build --component cuvs_cpp_headers + requirements: + build: + - cmake ${{ cmake_version }} + - ${{ stdlib("c") }} + host: + - librmm =${{ minor_version }} + - libraft-headers =${{ minor_version }} + - nccl ${{ nccl_version }} + - cuda-version =${{ cuda_version }} + - cuda-cudart-dev + - cuda-profiler-api + - libcublas-dev + - libcurand-dev + - libcusolver-dev + - libcusparse-dev + run: + - ${{ pin_compatible("cuda-version", upper_bound="x", lower_bound="x") }} + - libraft-headers =${{ minor_version }} + - librmm =${{ minor_version }} + - nccl + - cuda-cudart + - libcublas + - libcurand + - libcusolver + - libcusparse + ignore_run_exports: + by_name: + - cuda-cudart + - cuda-version + - libaio + - libboost + - libcublas + - libcurand + - libcusolver + - libcusparse + - librmm + - mkl + - nccl + about: + homepage: ${{ load_from_file("python/libcuvs/pyproject.toml").project.urls.Homepage }} + license: ${{ load_from_file("python/libcuvs/pyproject.toml").project.license.text }} + summary: ${{ load_from_file("python/libcuvs/pyproject.toml").project.description }} + - package: name: libcuvs version: ${{ version }} @@ -97,6 +152,7 @@ outputs: - cmake ${{ cmake_version }} - ${{ stdlib("c") }} host: + - ${{ pin_subpackage("libcuvs-headers", exact=True) }} - librmm =${{ minor_version }} - libraft-headers =${{ minor_version }} - nccl ${{ nccl_version }} @@ -109,7 +165,66 @@ outputs: - libcusparse-dev run: - ${{ pin_compatible("cuda-version", upper_bound="x", lower_bound="x") }} + - ${{ pin_subpackage("libcuvs-headers", exact=True) }} - libraft-headers =${{ minor_version }} + - librmm =${{ minor_version }} + - nccl + - cuda-cudart + - libcublas + - libcurand + - libcusolver + - libcusparse + ignore_run_exports: + by_name: + - cuda-cudart + - cuda-version + - libaio + - libboost + - libcublas + - libcurand + - libcusolver + - libcusparse + - librmm + - mkl + - nccl + about: + homepage: ${{ load_from_file("python/libcuvs/pyproject.toml").project.urls.Homepage }} + license: ${{ load_from_file("python/libcuvs/pyproject.toml").project.license.text }} + summary: ${{ load_from_file("python/libcuvs/pyproject.toml").project.description }} + + - package: + name: libcuvs-static + version: ${{ version }} + build: + string: cuda${{ cuda_major }}_${{ date_string }}_${{ head_rev }} + dynamic_linking: + overlinking_behavior: "error" + prefix_detection: + ignore_binary_files: True + script: + content: | + cmake --install cpp/build --component cuvs_static + requirements: + build: + - cmake ${{ cmake_version }} + - ${{ stdlib("c") }} + host: + - ${{ pin_subpackage("libcuvs-headers", exact=True) }} + - librmm =${{ minor_version }} + - libraft-headers =${{ minor_version }} + - nccl ${{ nccl_version }} + - cuda-version =${{ cuda_version }} + - cuda-cudart-dev + - cuda-profiler-api + - libcublas-dev + - libcurand-dev + - libcusolver-dev + - libcusparse-dev + run: + - ${{ pin_compatible("cuda-version", upper_bound="x", lower_bound="x") }} + - ${{ pin_subpackage("libcuvs-headers", exact=True) }} + - libraft-headers =${{ minor_version }} + - librmm =${{ minor_version }} - nccl - cuda-cudart - libcublas @@ -152,6 +267,7 @@ outputs: - librmm =${{ minor_version }} - libraft-headers =${{ minor_version }} - nccl ${{ nccl_version }} + - ${{ pin_subpackage("libcuvs-headers", exact=True) }} - ${{ pin_subpackage("libcuvs", exact=True) }} - cuda-version =${{ cuda_version }} - openblas # required by some CPU algos in benchmarks @@ -162,6 +278,7 @@ outputs: - libcusolver-dev - libcusparse-dev run: + - ${{ pin_subpackage("libcuvs-headers", exact=True) }} - ${{ pin_subpackage("libcuvs", exact=True) }} - ${{ pin_compatible("cuda-version", upper_bound="x", lower_bound="x") }} - libraft-headers =${{ minor_version }} @@ -237,6 +354,7 @@ outputs: - ninja - ${{ stdlib("c") }} host: + - ${{ pin_subpackage("libcuvs-headers", exact=True) }} - ${{ pin_subpackage("libcuvs", exact=True) }} - cuda-version =${{ cuda_version }} - libraft-headers =${{ minor_version }} @@ -249,6 +367,7 @@ outputs: - libcusolver-dev - libcusparse-dev run: + - ${{ pin_subpackage("libcuvs-headers", exact=True) }} - ${{ pin_subpackage("libcuvs", exact=True) }} - ${{ pin_compatible("cuda-version", upper_bound="x", lower_bound="x") }} - nccl @@ -298,6 +417,7 @@ outputs: - cmake ${{ cmake_version }} - ${{ stdlib("c") }} host: + - ${{ pin_subpackage("libcuvs-headers", exact=True) }} - ${{ pin_subpackage("libcuvs", exact=True) }} - cuda-cudart-dev - cuda-profiler-api @@ -317,6 +437,7 @@ outputs: - libboost-devel =1.87 - mkl-devel =2023 run: + - ${{ pin_subpackage("libcuvs-headers", exact=True) }} - ${{ pin_subpackage("libcuvs", exact=True) }} - ${{ pin_compatible("cuda-version", upper_bound="x", lower_bound="x") }} - cuda-cudart diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index afbe3d93d9..9d205f5a14 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -46,6 +46,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON) option(BUILD_SHARED_LIBS "Build cuvs shared libraries" ON) option(BUILD_TESTS "Build cuvs unit-tests" ON) +option(INSTALL_CPP_HEADERS "Install cuVS C++ headers" ON) option(BUILD_C_LIBRARY "Build cuVS C API library" ON) option(BUILD_CUVS_BENCH "Build cuVS ann benchmarks" OFF) option(BUILD_CAGRA_HNSWLIB "Build CAGRA+hnswlib interface" ON) @@ -70,10 +71,12 @@ if(BUILD_CPU_ONLY) set(BUILD_TESTS OFF) set(BUILD_C_LIBRARY OFF) set(BUILD_CAGRA_HNSWLIB OFF) + set(INSTALL_CPP_HEADERS OFF) elseif(NOT BUILD_SHARED_LIBS) set(BUILD_TESTS OFF) set(BUILD_C_LIBRARY OFF) set(BUILD_CAGRA_HNSWLIB OFF) + set(INSTALL_CPP_HEADERS OFF) endif() if(NOT BUILD_SHARED_LIBS AND CUVS_COMPILE_DYNAMIC_ONLY) @@ -88,9 +91,11 @@ set(_cuvs_lib_targets cuvs cuvs_static) if(CUVS_COMPILE_DYNAMIC_ONLY) set(cuvs_compile_mode "shared_only") set(_cuvs_lib_targets cuvs) + set(INSTALL_CPP_HEADERS ON) elseif(NOT BUILD_SHARED_LIBS) set(cuvs_compile_mode "static_only") set(_cuvs_lib_targets cuvs_static) + set(INSTALL_CPP_HEADERS ON) endif() # Needed because GoogleBenchmark changes the state of FindThreads.cmake, causing subsequent runs to @@ -207,6 +212,18 @@ endif() # ################################################################################################## # * cuvs --------------------------------------------------------------------- if(NOT BUILD_CPU_ONLY) + if(INSTALL_CPP_HEADERS) + add_library(cuvs_cpp_headers INTERFACE) + add_library(cuvs::cuvs_cpp_headers ALIAS cuvs_cpp_headers) + target_include_directories( + cuvs_cpp_headers + INTERFACE "$" + "$" + "$" + ) + target_link_libraries(cuvs_cpp_headers INTERFACE raft::raft rmm::rmm) + endif() + add_library( cuvs-cagra-search OBJECT src/neighbors/cagra_search_float.cu @@ -300,10 +317,7 @@ if(NOT BUILD_CPU_ONLY) CUDA_SEPARABLE_COMPILATION ON POSITION_INDEPENDENT_CODE ON ) - target_link_libraries(cuvs-cagra-search PRIVATE raft::raft) - target_include_directories( - cuvs-cagra-search PRIVATE "$" - ) + target_link_libraries(cuvs-cagra-search PRIVATE raft::raft cuvs::cuvs_cpp_headers) target_compile_options( cuvs-cagra-search PRIVATE "$<$:${CUVS_CXX_FLAGS}>" "$<$:${CUVS_CUDA_FLAGS}>" @@ -546,16 +560,10 @@ if(NOT BUILD_CPU_ONLY) target_link_libraries( cuvs_objs - PRIVATE raft::raft rmm::rmm ${CUVS_CTK_MATH_DEPENDENCIES} + PRIVATE raft::raft rmm::rmm cuvs::cuvs_cpp_headers ${CUVS_CTK_MATH_DEPENDENCIES} $ $ ) - target_include_directories( - cuvs_objs - PUBLIC "$" - INTERFACE "$" - ) - # Endian detection include(TestBigEndian) test_big_endian(BIG_ENDIAN) @@ -614,17 +622,11 @@ if(NOT BUILD_CPU_ONLY) $<$:NVTX_ENABLED> ) - target_include_directories( - cuvs - PUBLIC "$" - "$" - "$" - ) - target_link_libraries( cuvs PUBLIC rmm::rmm raft::raft + cuvs::cuvs_cpp_headers ${CUVS_CTK_MATH_DEPENDENCIES} $> $> @@ -676,16 +678,11 @@ SECTIONS # 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_link_libraries( cuvs_static PUBLIC rmm::rmm raft::raft + cuvs::cuvs_cpp_headers ${CUVS_CTK_MATH_DEPENDENCIES} $> $> @@ -731,20 +728,46 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$:NVTX_ENAB include(GNUInstallDirs) include(CPack) - install( - TARGETS ${_cuvs_lib_targets} - DESTINATION ${lib_dir} - COMPONENT cuvs - EXPORT cuvs-exports - ) + if(TARGET cuvs_cpp_headers) + install( + TARGETS cuvs_cpp_headers + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT cuvs_cpp_headers + EXPORT cuvs-cpp-headers-exports + ) - install( - DIRECTORY include/cuvs - COMPONENT cuvs - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - ) + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/include/cuvs/version_config.h + COMPONENT cuvs_cpp_headers + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cuvs + ) - if(BUILD_C_LIBRARY) + list(APPEND cuvs_components cuvs_cpp_headers) + list(APPEND cuvs_export_sets cuvs-cpp-headers-exports) + endif() + + if(TARGET cuvs) + install( + TARGETS cuvs + DESTINATION ${lib_dir} + COMPONENT cuvs + EXPORT cuvs-exports + ) + endif() + + if(TARGET cuvs_static) + install( + TARGETS cuvs_static + DESTINATION ${lib_dir} + COMPONENT cuvs_static + EXPORT cuvs-static-exports + ) + + list(APPEND cuvs_components cuvs_static) + list(APPEND cuvs_export_sets cuvs-static-exports) + endif() + + if(TARGET cuvs_c) install( TARGETS cuvs_c DESTINATION ${lib_dir} @@ -763,18 +786,9 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$:NVTX_ENAB COMPONENT cuvs DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cuvs/core/ ) - endif() - install( - FILES ${CMAKE_CURRENT_BINARY_DIR}/include/cuvs/version_config.h - COMPONENT cuvs - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cuvs - ) - - if(TARGET cuvs_c) list(APPEND cuvs_components c_api) list(APPEND cuvs_export_sets cuvs-c-exports) - set(CUVS_C_TARGET cuvs_c) endif() # Use `rapids_export` for 22.04 as it will have COMPONENT support @@ -783,7 +797,7 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$:NVTX_ENAB EXPORT_SET cuvs-exports COMPONENTS ${cuvs_components} COMPONENTS_EXPORT_SET ${cuvs_export_sets} - GLOBAL_TARGETS cuvs ${CUVS_C_TARGET} + GLOBAL_TARGETS cuvs cuvs_cpp_headers cuvs_static cuvs_c NAMESPACE cuvs:: ) @@ -794,7 +808,7 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$:NVTX_ENAB EXPORT_SET cuvs-exports COMPONENTS ${cuvs_components} COMPONENTS_EXPORT_SET ${cuvs_export_sets} - GLOBAL_TARGETS cuvs ${CUVS_C_TARGET} + GLOBAL_TARGETS cuvs cuvs_cpp_headers cuvs_static cuvs_c NAMESPACE cuvs:: ) endif() From 04558a62a318adc592956e2486d656d6abd9447b Mon Sep 17 00:00:00 2001 From: divyegala Date: Tue, 4 Nov 2025 05:13:02 +0000 Subject: [PATCH 12/23] find cuvs_cpp_headers in python --- python/cuvs/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/cuvs/CMakeLists.txt b/python/cuvs/CMakeLists.txt index 603ceadc04..5ae10b9f80 100644 --- a/python/cuvs/CMakeLists.txt +++ b/python/cuvs/CMakeLists.txt @@ -36,7 +36,7 @@ include(rapids-find) rapids_cpm_init() # --- cuVS ---# -find_package(cuvs "${RAPIDS_VERSION}" REQUIRED COMPONENTS c_api) +find_package(cuvs "${RAPIDS_VERSION}" REQUIRED COMPONENTS c_api cuvs_cpp_headers) # --- dlpack ---# include(../../cpp/cmake/thirdparty/get_dlpack.cmake) From badbdbeb718335110ae60f71b9d0a7da78e26e3d Mon Sep 17 00:00:00 2001 From: divyegala Date: Tue, 4 Nov 2025 05:45:18 +0000 Subject: [PATCH 13/23] remove breaking change, make cuvs and cuvs_static separate packages --- cpp/CMakeLists.txt | 73 ++++++++++++++++++++++++++------------ python/cuvs/CMakeLists.txt | 2 +- 2 files changed, 52 insertions(+), 23 deletions(-) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 9d205f5a14..480870942d 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -728,24 +728,6 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$:NVTX_ENAB include(GNUInstallDirs) include(CPack) - if(TARGET cuvs_cpp_headers) - install( - TARGETS cuvs_cpp_headers - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - COMPONENT cuvs_cpp_headers - EXPORT cuvs-cpp-headers-exports - ) - - install( - FILES ${CMAKE_CURRENT_BINARY_DIR}/include/cuvs/version_config.h - COMPONENT cuvs_cpp_headers - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cuvs - ) - - list(APPEND cuvs_components cuvs_cpp_headers) - list(APPEND cuvs_export_sets cuvs-cpp-headers-exports) - endif() - if(TARGET cuvs) install( TARGETS cuvs @@ -753,6 +735,21 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$:NVTX_ENAB COMPONENT cuvs EXPORT cuvs-exports ) + + if(TARGET cuvs_cpp_headers) + install( + TARGETS cuvs_cpp_headers + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT cuvs_cpp_headers + EXPORT cuvs-exports + ) + + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/include/cuvs/version_config.h + COMPONENT cuvs_cpp_headers + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cuvs + ) + endif() endif() if(TARGET cuvs_static) @@ -763,8 +760,20 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$:NVTX_ENAB EXPORT cuvs-static-exports ) - list(APPEND cuvs_components cuvs_static) - list(APPEND cuvs_export_sets cuvs-static-exports) + if(TARGET cuvs_cpp_headers) + install( + TARGETS cuvs_cpp_headers + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT cuvs_cpp_headers + EXPORT cuvs-static-exports + ) + + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/include/cuvs/version_config.h + COMPONENT cuvs_cpp_headers + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cuvs + ) + endif() endif() if(TARGET cuvs_c) @@ -797,7 +806,7 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$:NVTX_ENAB EXPORT_SET cuvs-exports COMPONENTS ${cuvs_components} COMPONENTS_EXPORT_SET ${cuvs_export_sets} - GLOBAL_TARGETS cuvs cuvs_cpp_headers cuvs_static cuvs_c + GLOBAL_TARGETS cuvs cuvs_cpp_headers cuvs_c NAMESPACE cuvs:: ) @@ -808,7 +817,27 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$:NVTX_ENAB EXPORT_SET cuvs-exports COMPONENTS ${cuvs_components} COMPONENTS_EXPORT_SET ${cuvs_export_sets} - GLOBAL_TARGETS cuvs cuvs_cpp_headers cuvs_static cuvs_c + GLOBAL_TARGETS cuvs cuvs_cpp_headers cuvs_c + NAMESPACE cuvs:: + ) + + rapids_export( + INSTALL cuvs_static + EXPORT_SET cuvs-static-exports + COMPONENTS ${cuvs_components} + COMPONENTS_EXPORT_SET ${cuvs_export_sets} + GLOBAL_TARGETS cuvs_static cuvs_cpp_headers cuvs_c + NAMESPACE cuvs:: + ) + + # ################################################################################################ + # * build export ------------------------------------------------------------- + rapids_export( + BUILD cuvs_static + EXPORT_SET cuvs-static-exports + COMPONENTS ${cuvs_components} + COMPONENTS_EXPORT_SET ${cuvs_export_sets} + GLOBAL_TARGETS cuvs_static cuvs_cpp_headers cuvs_c NAMESPACE cuvs:: ) endif() diff --git a/python/cuvs/CMakeLists.txt b/python/cuvs/CMakeLists.txt index 5ae10b9f80..603ceadc04 100644 --- a/python/cuvs/CMakeLists.txt +++ b/python/cuvs/CMakeLists.txt @@ -36,7 +36,7 @@ include(rapids-find) rapids_cpm_init() # --- cuVS ---# -find_package(cuvs "${RAPIDS_VERSION}" REQUIRED COMPONENTS c_api cuvs_cpp_headers) +find_package(cuvs "${RAPIDS_VERSION}" REQUIRED COMPONENTS c_api) # --- dlpack ---# include(../../cpp/cmake/thirdparty/get_dlpack.cmake) From 3f67d1a6f84d3a81d9cbe6f1c4939ce2667cf225 Mon Sep 17 00:00:00 2001 From: divyegala Date: Tue, 4 Nov 2025 05:54:33 +0000 Subject: [PATCH 14/23] revert --- conda/recipes/libcuvs/recipe.yaml | 2 + cpp/CMakeLists.txt | 73 ++++++++++--------------------- python/cuvs/CMakeLists.txt | 2 +- 3 files changed, 25 insertions(+), 52 deletions(-) diff --git a/conda/recipes/libcuvs/recipe.yaml b/conda/recipes/libcuvs/recipe.yaml index 878f269aa1..9f49f1003c 100644 --- a/conda/recipes/libcuvs/recipe.yaml +++ b/conda/recipes/libcuvs/recipe.yaml @@ -204,6 +204,8 @@ outputs: script: content: | cmake --install cpp/build --component cuvs_static + cmake --install cpp/build --component c_api + cmake --install cpp/build --component hnswlib requirements: build: - cmake ${{ cmake_version }} diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 480870942d..9d205f5a14 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -728,6 +728,24 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$:NVTX_ENAB include(GNUInstallDirs) include(CPack) + if(TARGET cuvs_cpp_headers) + install( + TARGETS cuvs_cpp_headers + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT cuvs_cpp_headers + EXPORT cuvs-cpp-headers-exports + ) + + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/include/cuvs/version_config.h + COMPONENT cuvs_cpp_headers + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cuvs + ) + + list(APPEND cuvs_components cuvs_cpp_headers) + list(APPEND cuvs_export_sets cuvs-cpp-headers-exports) + endif() + if(TARGET cuvs) install( TARGETS cuvs @@ -735,21 +753,6 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$:NVTX_ENAB COMPONENT cuvs EXPORT cuvs-exports ) - - if(TARGET cuvs_cpp_headers) - install( - TARGETS cuvs_cpp_headers - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - COMPONENT cuvs_cpp_headers - EXPORT cuvs-exports - ) - - install( - FILES ${CMAKE_CURRENT_BINARY_DIR}/include/cuvs/version_config.h - COMPONENT cuvs_cpp_headers - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cuvs - ) - endif() endif() if(TARGET cuvs_static) @@ -760,20 +763,8 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$:NVTX_ENAB EXPORT cuvs-static-exports ) - if(TARGET cuvs_cpp_headers) - install( - TARGETS cuvs_cpp_headers - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - COMPONENT cuvs_cpp_headers - EXPORT cuvs-static-exports - ) - - install( - FILES ${CMAKE_CURRENT_BINARY_DIR}/include/cuvs/version_config.h - COMPONENT cuvs_cpp_headers - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cuvs - ) - endif() + list(APPEND cuvs_components cuvs_static) + list(APPEND cuvs_export_sets cuvs-static-exports) endif() if(TARGET cuvs_c) @@ -806,7 +797,7 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$:NVTX_ENAB EXPORT_SET cuvs-exports COMPONENTS ${cuvs_components} COMPONENTS_EXPORT_SET ${cuvs_export_sets} - GLOBAL_TARGETS cuvs cuvs_cpp_headers cuvs_c + GLOBAL_TARGETS cuvs cuvs_cpp_headers cuvs_static cuvs_c NAMESPACE cuvs:: ) @@ -817,27 +808,7 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$:NVTX_ENAB EXPORT_SET cuvs-exports COMPONENTS ${cuvs_components} COMPONENTS_EXPORT_SET ${cuvs_export_sets} - GLOBAL_TARGETS cuvs cuvs_cpp_headers cuvs_c - NAMESPACE cuvs:: - ) - - rapids_export( - INSTALL cuvs_static - EXPORT_SET cuvs-static-exports - COMPONENTS ${cuvs_components} - COMPONENTS_EXPORT_SET ${cuvs_export_sets} - GLOBAL_TARGETS cuvs_static cuvs_cpp_headers cuvs_c - NAMESPACE cuvs:: - ) - - # ################################################################################################ - # * build export ------------------------------------------------------------- - rapids_export( - BUILD cuvs_static - EXPORT_SET cuvs-static-exports - COMPONENTS ${cuvs_components} - COMPONENTS_EXPORT_SET ${cuvs_export_sets} - GLOBAL_TARGETS cuvs_static cuvs_cpp_headers cuvs_c + GLOBAL_TARGETS cuvs cuvs_cpp_headers cuvs_static cuvs_c NAMESPACE cuvs:: ) endif() diff --git a/python/cuvs/CMakeLists.txt b/python/cuvs/CMakeLists.txt index 603ceadc04..5ae10b9f80 100644 --- a/python/cuvs/CMakeLists.txt +++ b/python/cuvs/CMakeLists.txt @@ -36,7 +36,7 @@ include(rapids-find) rapids_cpm_init() # --- cuVS ---# -find_package(cuvs "${RAPIDS_VERSION}" REQUIRED COMPONENTS c_api) +find_package(cuvs "${RAPIDS_VERSION}" REQUIRED COMPONENTS c_api cuvs_cpp_headers) # --- dlpack ---# include(../../cpp/cmake/thirdparty/get_dlpack.cmake) From 76fe7037b66113ea7dee7eb9e2228da82beaa1c0 Mon Sep 17 00:00:00 2001 From: divyegala Date: Tue, 4 Nov 2025 06:47:05 +0000 Subject: [PATCH 15/23] put headers in main export list --- cpp/CMakeLists.txt | 5 +---- python/cuvs/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 9d205f5a14..4b635bea65 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -733,7 +733,7 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$:NVTX_ENAB TARGETS cuvs_cpp_headers DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} COMPONENT cuvs_cpp_headers - EXPORT cuvs-cpp-headers-exports + EXPORT cuvs-exports ) install( @@ -741,9 +741,6 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$:NVTX_ENAB COMPONENT cuvs_cpp_headers DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cuvs ) - - list(APPEND cuvs_components cuvs_cpp_headers) - list(APPEND cuvs_export_sets cuvs-cpp-headers-exports) endif() if(TARGET cuvs) diff --git a/python/cuvs/CMakeLists.txt b/python/cuvs/CMakeLists.txt index 5ae10b9f80..603ceadc04 100644 --- a/python/cuvs/CMakeLists.txt +++ b/python/cuvs/CMakeLists.txt @@ -36,7 +36,7 @@ include(rapids-find) rapids_cpm_init() # --- cuVS ---# -find_package(cuvs "${RAPIDS_VERSION}" REQUIRED COMPONENTS c_api cuvs_cpp_headers) +find_package(cuvs "${RAPIDS_VERSION}" REQUIRED COMPONENTS c_api) # --- dlpack ---# include(../../cpp/cmake/thirdparty/get_dlpack.cmake) From 1703c00e483092f13e57070f33242a55a0a83327 Mon Sep 17 00:00:00 2001 From: divyegala Date: Tue, 4 Nov 2025 06:58:59 +0000 Subject: [PATCH 16/23] remove c api install from static conda package --- conda/recipes/libcuvs/recipe.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/conda/recipes/libcuvs/recipe.yaml b/conda/recipes/libcuvs/recipe.yaml index 9f49f1003c..17f43cb8fd 100644 --- a/conda/recipes/libcuvs/recipe.yaml +++ b/conda/recipes/libcuvs/recipe.yaml @@ -204,7 +204,6 @@ outputs: script: content: | cmake --install cpp/build --component cuvs_static - cmake --install cpp/build --component c_api cmake --install cpp/build --component hnswlib requirements: build: From ad0cd4186914483903c8bd3f4dd1d3a97981d716 Mon Sep 17 00:00:00 2001 From: Robert Maynard Date: Thu, 13 Nov 2025 11:50:05 -0500 Subject: [PATCH 17/23] Correct issues in adding cpp-headers target --- c/CMakeLists.txt | 29 ++--- conda/recipes/libcuvs/recipe.yaml | 1 + cpp/CMakeLists.txt | 102 ++++++------------ cpp/cmake/modules/generate_cuvs_export.cmake | 105 +++++++++++++++++++ cpp/cmake/thirdparty/get_hnswlib.cmake | 2 - 5 files changed, 148 insertions(+), 91 deletions(-) create mode 100644 cpp/cmake/modules/generate_cuvs_export.cmake diff --git a/c/CMakeLists.txt b/c/CMakeLists.txt index 1608a5598d..0d5ee899bd 100644 --- a/c/CMakeLists.txt +++ b/c/CMakeLists.txt @@ -33,7 +33,11 @@ option(CUVSC_STATIC_CUVS_LIBRARY "Link against statical version of libcuvs" OFF) # Check if cuVS is already available. If so, it is the user's responsibility to ensure that the # CMake package is also available at build time of the Python cuvs package. if(NOT TARGET cuvs::cuvs) - find_package(cuvs "${RAPIDS_VERSION}" REQUIRED) + if(CUVSC_STATIC_CUVS_LIBRARY) + find_package(cuvs "${RAPIDS_VERSION}" REQUIRED COMPONENTS cuvs_static) + else() + find_package(cuvs "${RAPIDS_VERSION}" REQUIRED COMPONENTS cuvs_shared) + endif() else() set(BUILDING_FROM_CUVS ON) endif() @@ -158,8 +162,8 @@ if(PROJECT_IS_TOP_LEVEL) include(CPack) # Add CUDAToolkit as an export dependency - rapids_export_package(INSTALL CUDAToolkit cuvs-c-exports) - rapids_export_package(BUILD CUDAToolkit cuvs-c-exports) + rapids_export_package(INSTALL CUDAToolkit cuvs-exports) + rapids_export_package(BUILD CUDAToolkit cuvs-exports) install( TARGETS cuvs_c @@ -167,21 +171,6 @@ if(PROJECT_IS_TOP_LEVEL) COMPONENT cuvs_c EXPORT cuvs-c-exports ) - - rapids_export( - INSTALL cuvs_c - VERSION "${RAPIDS_VERSION}" - EXPORT_SET cuvs-c-exports - GLOBAL_TARGETS cuvs_c - NAMESPACE cuvs:: - ) - rapids_export( - BUILD cuvs_c - VERSION "${RAPIDS_VERSION}" - EXPORT_SET cuvs-c-exports - GLOBAL_TARGETS cuvs_c - NAMESPACE cuvs:: - ) install( DIRECTORY include/cuvs COMPONENT cuvs_c @@ -192,6 +181,10 @@ if(PROJECT_IS_TOP_LEVEL) COMPONENT cuvs_c DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cuvs/core/ ) + + include(../cpp/cmake/modules/generate_cuvs_export.cmake) + generate_cuvs_export(CLIB COMPONENTS cuvs_c EXPORT_SETS cuvs-c-exports) + endif() # ################################################################################################## diff --git a/conda/recipes/libcuvs/recipe.yaml b/conda/recipes/libcuvs/recipe.yaml index 17f43cb8fd..45630be48d 100644 --- a/conda/recipes/libcuvs/recipe.yaml +++ b/conda/recipes/libcuvs/recipe.yaml @@ -145,6 +145,7 @@ outputs: script: content: | cmake --install cpp/build --component cuvs + cmake --install cpp/build --component cuvs_shared cmake --install cpp/build --component c_api cmake --install cpp/build --component hnswlib requirements: diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 60424ac3ea..01f8510896 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -46,7 +46,6 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON) option(BUILD_SHARED_LIBS "Build cuvs shared libraries" ON) option(BUILD_TESTS "Build cuvs unit-tests" ON) -option(INSTALL_CPP_HEADERS "Install cuVS C++ headers" ON) option(BUILD_C_LIBRARY "Build cuVS C API library" ON) option(BUILD_CUVS_BENCH "Build cuVS ann benchmarks" OFF) option(BUILD_CAGRA_HNSWLIB "Build CAGRA+hnswlib interface" ON) @@ -76,7 +75,6 @@ elseif(NOT BUILD_SHARED_LIBS) set(BUILD_TESTS OFF) set(BUILD_C_LIBRARY OFF) set(BUILD_CAGRA_HNSWLIB OFF) - set(INSTALL_CPP_HEADERS OFF) endif() if(NOT BUILD_SHARED_LIBS AND CUVS_COMPILE_DYNAMIC_ONLY) @@ -91,11 +89,9 @@ set(_cuvs_lib_targets cuvs cuvs_static) if(CUVS_COMPILE_DYNAMIC_ONLY) set(cuvs_compile_mode "shared_only") set(_cuvs_lib_targets cuvs) - set(INSTALL_CPP_HEADERS ON) elseif(NOT BUILD_SHARED_LIBS) set(cuvs_compile_mode "static_only") set(_cuvs_lib_targets cuvs_static) - set(INSTALL_CPP_HEADERS ON) endif() # Needed because GoogleBenchmark changes the state of FindThreads.cmake, causing subsequent runs to @@ -212,17 +208,15 @@ endif() # ################################################################################################## # * cuvs --------------------------------------------------------------------- if(NOT BUILD_CPU_ONLY) - if(INSTALL_CPP_HEADERS) - add_library(cuvs_cpp_headers INTERFACE) - add_library(cuvs::cuvs_cpp_headers ALIAS cuvs_cpp_headers) - target_include_directories( - cuvs_cpp_headers - INTERFACE "$" - "$" - "$" - ) - target_link_libraries(cuvs_cpp_headers INTERFACE raft::raft rmm::rmm) - endif() + + add_library(cuvs_cpp_headers INTERFACE) + add_library(cuvs::cuvs_cpp_headers ALIAS cuvs_cpp_headers) + target_include_directories( + cuvs_cpp_headers + INTERFACE "$" + "$" + "$" + ) add_library( cuvs-cagra-search OBJECT @@ -727,14 +721,29 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$:NVTX_ENAB include(GNUInstallDirs) include(CPack) + set(target_names cuvs cuvs_static cuvs_cpp_headers cuvs_c) + set(component_names cuvs_shared cuvs_static cuvs_cpp_headers c_api) + set(export_names cuvs-shared-exports cuvs-static-exports cuvs-cpp-headers-exports cuvs-c-exports) + foreach(target component export IN ZIP_LISTS target_names component_names export_names) + if(TARGET ${target}) + install( + TARGETS ${target} + DESTINATION ${lib_dir} + COMPONENT ${component} + EXPORT ${export} + ) + + list(APPEND cuvs_components ${component}) + list(APPEND cuvs_export_sets ${export}) + endif() + endforeach() + if(TARGET cuvs_cpp_headers) install( - TARGETS cuvs_cpp_headers - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + DIRECTORY include/cuvs COMPONENT cuvs_cpp_headers - EXPORT cuvs-exports + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) - install( FILES ${CMAKE_CURRENT_BINARY_DIR}/include/cuvs/version_config.h COMPONENT cuvs_cpp_headers @@ -742,71 +751,22 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$:NVTX_ENAB ) endif() - if(TARGET cuvs) - install( - TARGETS cuvs - DESTINATION ${lib_dir} - COMPONENT cuvs - EXPORT cuvs-exports - ) - endif() - - if(TARGET cuvs_static) - install( - TARGETS cuvs_static - DESTINATION ${lib_dir} - COMPONENT cuvs_static - EXPORT cuvs-static-exports - ) - - list(APPEND cuvs_components cuvs_static) - list(APPEND cuvs_export_sets cuvs-static-exports) - endif() - if(TARGET cuvs_c) - install( - TARGETS cuvs_c - DESTINATION ${lib_dir} - COMPONENT c_api - EXPORT cuvs-c-exports - ) - install( DIRECTORY ../c/include/cuvs/ COMPONENT c_api DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cuvs ) - install( FILES ${CUVS_C_BINARY_DIR}/include/cuvs/core/c_config.h - COMPONENT cuvs + COMPONENT c_api DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cuvs/core/ ) - - list(APPEND cuvs_components c_api) - list(APPEND cuvs_export_sets cuvs-c-exports) endif() - # Use `rapids_export` for 22.04 as it will have COMPONENT support - rapids_export( - INSTALL cuvs - EXPORT_SET cuvs-exports - COMPONENTS ${cuvs_components} - COMPONENTS_EXPORT_SET ${cuvs_export_sets} - GLOBAL_TARGETS cuvs cuvs_cpp_headers cuvs_static cuvs_c - NAMESPACE cuvs:: - ) + include(cmake/modules/generate_cuvs_export.cmake) + generate_cuvs_export(COMPONENTS ${cuvs_components} EXPORT_SETS ${cuvs_export_sets}) - # ################################################################################################ - # * build export ------------------------------------------------------------- - rapids_export( - BUILD cuvs - EXPORT_SET cuvs-exports - COMPONENTS ${cuvs_components} - COMPONENTS_EXPORT_SET ${cuvs_export_sets} - GLOBAL_TARGETS cuvs cuvs_cpp_headers cuvs_static cuvs_c - NAMESPACE cuvs:: - ) endif() # ################################################################################################## diff --git a/cpp/cmake/modules/generate_cuvs_export.cmake b/cpp/cmake/modules/generate_cuvs_export.cmake new file mode 100644 index 0000000000..4f00827e35 --- /dev/null +++ b/cpp/cmake/modules/generate_cuvs_export.cmake @@ -0,0 +1,105 @@ +# ============================================================================= +# cmake-format: off +# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION. +# SPDX-License-Identifier: Apache-2.0 +# cmake-format: on +# ============================================================================= + +function(generate_cuvs_export ) + set(options "CLIB") + set(one_value "") + set(multi_value EXPORT_SETS COMPONENTS) + cmake_parse_arguments(_CUVS_RAPIDS "${options}" "${one_value}" "${multi_value}" ${ARGN}) + + + set(placehold_name "cuvs_placeholder") + if(_CUVS_RAPIDS_CLIB) + string(APPEND placehold_name "_c") + endif() + + # We need a placeholder target in cuvs-exports so that we can generate an export set since all the + # real targets are conditional + # + # tasks: need a second name for when calling from cuvs_c + # tasks: need to write a query over set(cuvs_comp_names cuvs_shared;cuvs_static;cuvs_cpp_headers;c_api) + #. since we need that to be invariant + if(NOT TARGET cuvs::${placehold_name}) + add_library(${placehold_name} INTERFACE) + add_library(cuvs::${placehold_name} ALIAS ${placehold_name}) + install( + TARGETS ${placehold_name} + EXPORT cuvs-exports + ) + endif() + + # tasks we need to add in dependencies file inclusion as well + + set(cuvs_final_code_block + [=[ + + if(NOT TARGET cuvs::cuvs_cpp_headers) + + file(GLOB cuvs_component_dep_files LIST_DIRECTORIES FALSE + "${CMAKE_CURRENT_LIST_DIR}/cuvs-cuvs_cpp_headers*-dependencies.cmake") + foreach(f IN LISTS cuvs_component_dep_files) + include("${f}") + endforeach() + + file(GLOB cuvs_component_target_files LIST_DIRECTORIES FALSE + "${CMAKE_CURRENT_LIST_DIR}/cuvs-cuvs_cpp_headers*-targets.cmake") + + foreach(f IN LISTS cuvs_component_target_files) + include("${f}") + endforeach() + endif() + + if(NOT cuvs_FIND_COMPONENTS) + + file(GLOB cuvs_component_dep_files LIST_DIRECTORIES FALSE + "${CMAKE_CURRENT_LIST_DIR}/cuvs-cuvs_shared*-dependencies.cmake") + foreach(f IN LISTS cuvs_component_dep_files) + include("${f}") + endforeach() + + file(GLOB cuvs_component_target_files LIST_DIRECTORIES FALSE + "${CMAKE_CURRENT_LIST_DIR}/cuvs-cuvs_shared*-targets.cmake") + foreach(f IN LISTS cuvs_component_target_files) + include("${f}") + endforeach() + endif() + + foreach(target IN LISTS rapids_namespaced_global_targets) + if(TARGET ${target}) + get_target_property(_is_imported ${target} IMPORTED) + get_target_property(_already_global ${target} IMPORTED_GLOBAL) + if(_is_imported AND NOT _already_global) + set_target_properties(${target} PROPERTIES IMPORTED_GLOBAL TRUE) + endif() + endif() + endforeach() + ]=]) + + rapids_export( + INSTALL cuvs + VERSION "${RAPIDS_VERSION}" + EXPORT_SET cuvs-exports + COMPONENTS ${_CUVS_RAPIDS_COMPONENTS} + COMPONENTS_EXPORT_SET ${_CUVS_RAPIDS_EXPORT_SETS} + GLOBAL_TARGETS cuvs cuvs_cpp_headers cuvs_static cuvs_c + NAMESPACE cuvs:: + FINAL_CODE_BLOCK cuvs_final_code_block + ) + + # ################################################################################################ + # * build export ------------------------------------------------------------- + rapids_export( + BUILD cuvs + VERSION "${RAPIDS_VERSION}" + EXPORT_SET cuvs-exports + COMPONENTS ${_CUVS_RAPIDS_COMPONENTS} + COMPONENTS_EXPORT_SET ${_CUVS_RAPIDS_EXPORT_SETS} + GLOBAL_TARGETS cuvs cuvs_cpp_headers cuvs_static cuvs_c + NAMESPACE cuvs:: + FINAL_CODE_BLOCK cuvs_final_code_block + ) +endfunction() diff --git a/cpp/cmake/thirdparty/get_hnswlib.cmake b/cpp/cmake/thirdparty/get_hnswlib.cmake index 07c099426a..220dc8df2c 100644 --- a/cpp/cmake/thirdparty/get_hnswlib.cmake +++ b/cpp/cmake/thirdparty/get_hnswlib.cmake @@ -19,8 +19,6 @@ function(find_and_configure_hnswlib) FIND_VAR find_args CPM_VAR cpm_args TO_INSTALL_VAR to_install - BUILD_EXPORT_SET cuvs-exports - INSTALL_EXPORT_SET cuvs-exports ) rapids_cpm_find( From ed34f0bc0b7c81c1267ae01a1b808b87e1d8d85f Mon Sep 17 00:00:00 2001 From: Robert Maynard Date: Fri, 14 Nov 2025 11:51:44 -0500 Subject: [PATCH 18/23] Correct issues found in CI / code review --- c/CMakeLists.txt | 8 ++++---- cpp/cmake/modules/generate_cuvs_export.cmake | 12 +++++------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/c/CMakeLists.txt b/c/CMakeLists.txt index 0d5ee899bd..8e172672c3 100644 --- a/c/CMakeLists.txt +++ b/c/CMakeLists.txt @@ -168,22 +168,22 @@ if(PROJECT_IS_TOP_LEVEL) install( TARGETS cuvs_c DESTINATION ${lib_dir} - COMPONENT cuvs_c + COMPONENT c_api EXPORT cuvs-c-exports ) install( DIRECTORY include/cuvs - COMPONENT cuvs_c + COMPONENT c_api DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/include/cuvs/core/c_config.h - COMPONENT cuvs_c + COMPONENT c_api DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cuvs/core/ ) include(../cpp/cmake/modules/generate_cuvs_export.cmake) - generate_cuvs_export(CLIB COMPONENTS cuvs_c EXPORT_SETS cuvs-c-exports) + generate_cuvs_export(CLIB COMPONENTS c_api EXPORT_SETS cuvs-c-exports) endif() diff --git a/cpp/cmake/modules/generate_cuvs_export.cmake b/cpp/cmake/modules/generate_cuvs_export.cmake index 4f00827e35..9c287208ce 100644 --- a/cpp/cmake/modules/generate_cuvs_export.cmake +++ b/cpp/cmake/modules/generate_cuvs_export.cmake @@ -5,7 +5,7 @@ # cmake-format: on # ============================================================================= -function(generate_cuvs_export ) +function(generate_cuvs_export) set(options "CLIB") set(one_value "") set(multi_value EXPORT_SETS COMPONENTS) @@ -26,16 +26,13 @@ function(generate_cuvs_export ) if(NOT TARGET cuvs::${placehold_name}) add_library(${placehold_name} INTERFACE) add_library(cuvs::${placehold_name} ALIAS ${placehold_name}) - install( - TARGETS ${placehold_name} - EXPORT cuvs-exports - ) + install(TARGETS ${placehold_name} EXPORT cuvs-exports) endif() # tasks we need to add in dependencies file inclusion as well set(cuvs_final_code_block - [=[ + [=[ if(NOT TARGET cuvs::cuvs_cpp_headers) @@ -77,7 +74,8 @@ function(generate_cuvs_export ) endif() endif() endforeach() - ]=]) + ]=] + ) rapids_export( INSTALL cuvs From ff2da4271b2f270ced04ea207c6796c39d8df47b Mon Sep 17 00:00:00 2001 From: Robert Maynard Date: Fri, 14 Nov 2025 12:14:26 -0500 Subject: [PATCH 19/23] remove out of date task comment --- cpp/cmake/modules/generate_cuvs_export.cmake | 3 --- 1 file changed, 3 deletions(-) diff --git a/cpp/cmake/modules/generate_cuvs_export.cmake b/cpp/cmake/modules/generate_cuvs_export.cmake index 9c287208ce..5bfde07163 100644 --- a/cpp/cmake/modules/generate_cuvs_export.cmake +++ b/cpp/cmake/modules/generate_cuvs_export.cmake @@ -20,9 +20,6 @@ function(generate_cuvs_export) # We need a placeholder target in cuvs-exports so that we can generate an export set since all the # real targets are conditional # - # tasks: need a second name for when calling from cuvs_c - # tasks: need to write a query over set(cuvs_comp_names cuvs_shared;cuvs_static;cuvs_cpp_headers;c_api) - #. since we need that to be invariant if(NOT TARGET cuvs::${placehold_name}) add_library(${placehold_name} INTERFACE) add_library(cuvs::${placehold_name} ALIAS ${placehold_name}) From a35df39ee56b5a621f6292754c5b46929d9772c7 Mon Sep 17 00:00:00 2001 From: Robert Maynard Date: Fri, 14 Nov 2025 12:37:39 -0500 Subject: [PATCH 20/23] Restore cuvs_cpp_headers --- cpp/CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 01f8510896..dfeb0c10fc 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -217,6 +217,7 @@ if(NOT BUILD_CPU_ONLY) "$" "$" ) + target_link_libraries(cuvs_cpp_headers INTERFACE raft::raft rmm::rmm) add_library( cuvs-cagra-search OBJECT @@ -311,7 +312,7 @@ if(NOT BUILD_CPU_ONLY) CUDA_SEPARABLE_COMPILATION ON POSITION_INDEPENDENT_CODE ON ) - target_link_libraries(cuvs-cagra-search PRIVATE raft::raft cuvs::cuvs_cpp_headers) + target_link_libraries(cuvs-cagra-search PRIVATE cuvs::cuvs_cpp_headers) target_compile_options( cuvs-cagra-search PRIVATE "$<$:${CUVS_CXX_FLAGS}>" "$<$:${CUVS_CUDA_FLAGS}>" @@ -553,7 +554,7 @@ if(NOT BUILD_CPU_ONLY) target_link_libraries( cuvs_objs - PRIVATE raft::raft rmm::rmm cuvs::cuvs_cpp_headers ${CUVS_CTK_MATH_DEPENDENCIES} + PRIVATE cuvs::cuvs_cpp_headers ${CUVS_CTK_MATH_DEPENDENCIES} $ $ ) From 3df7f5f27d807875a4136abf11c79235908bc14e Mon Sep 17 00:00:00 2001 From: Robert Maynard Date: Fri, 14 Nov 2025 12:45:28 -0500 Subject: [PATCH 21/23] Correct style issues found by CI --- cpp/cmake/modules/generate_cuvs_export.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/cpp/cmake/modules/generate_cuvs_export.cmake b/cpp/cmake/modules/generate_cuvs_export.cmake index 5bfde07163..4ffb619d3d 100644 --- a/cpp/cmake/modules/generate_cuvs_export.cmake +++ b/cpp/cmake/modules/generate_cuvs_export.cmake @@ -11,7 +11,6 @@ function(generate_cuvs_export) set(multi_value EXPORT_SETS COMPONENTS) cmake_parse_arguments(_CUVS_RAPIDS "${options}" "${one_value}" "${multi_value}" ${ARGN}) - set(placehold_name "cuvs_placeholder") if(_CUVS_RAPIDS_CLIB) string(APPEND placehold_name "_c") From e20157702b74ff78623801af5c866fe15208fc9f Mon Sep 17 00:00:00 2001 From: Robert Maynard Date: Fri, 14 Nov 2025 14:19:31 -0500 Subject: [PATCH 22/23] Correct breaks in find_package(cuvs) found by devcontainers --- cpp/cmake/modules/generate_cuvs_export.cmake | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cpp/cmake/modules/generate_cuvs_export.cmake b/cpp/cmake/modules/generate_cuvs_export.cmake index 4ffb619d3d..66779dd448 100644 --- a/cpp/cmake/modules/generate_cuvs_export.cmake +++ b/cpp/cmake/modules/generate_cuvs_export.cmake @@ -31,7 +31,6 @@ function(generate_cuvs_export) [=[ if(NOT TARGET cuvs::cuvs_cpp_headers) - file(GLOB cuvs_component_dep_files LIST_DIRECTORIES FALSE "${CMAKE_CURRENT_LIST_DIR}/cuvs-cuvs_cpp_headers*-dependencies.cmake") foreach(f IN LISTS cuvs_component_dep_files) @@ -46,8 +45,7 @@ function(generate_cuvs_export) endforeach() endif() - if(NOT cuvs_FIND_COMPONENTS) - + if(NOT TARGET cuvs::cuvs) file(GLOB cuvs_component_dep_files LIST_DIRECTORIES FALSE "${CMAKE_CURRENT_LIST_DIR}/cuvs-cuvs_shared*-dependencies.cmake") foreach(f IN LISTS cuvs_component_dep_files) From c682ecd77fd85e28e2a2ace8adaf71735f363426 Mon Sep 17 00:00:00 2001 From: Robert Maynard Date: Mon, 17 Nov 2025 12:17:46 -0500 Subject: [PATCH 23/23] Refactor generate_cuvs_export to auto bring in cuvs::cuvs_static --- cpp/cmake/modules/generate_cuvs_export.cmake | 43 +++++++------------- 1 file changed, 15 insertions(+), 28 deletions(-) diff --git a/cpp/cmake/modules/generate_cuvs_export.cmake b/cpp/cmake/modules/generate_cuvs_export.cmake index 66779dd448..57be638fe7 100644 --- a/cpp/cmake/modules/generate_cuvs_export.cmake +++ b/cpp/cmake/modules/generate_cuvs_export.cmake @@ -30,34 +30,21 @@ function(generate_cuvs_export) set(cuvs_final_code_block [=[ - if(NOT TARGET cuvs::cuvs_cpp_headers) - file(GLOB cuvs_component_dep_files LIST_DIRECTORIES FALSE - "${CMAKE_CURRENT_LIST_DIR}/cuvs-cuvs_cpp_headers*-dependencies.cmake") - foreach(f IN LISTS cuvs_component_dep_files) - include("${f}") - endforeach() - - file(GLOB cuvs_component_target_files LIST_DIRECTORIES FALSE - "${CMAKE_CURRENT_LIST_DIR}/cuvs-cuvs_cpp_headers*-targets.cmake") - - foreach(f IN LISTS cuvs_component_target_files) - include("${f}") - endforeach() - endif() - - if(NOT TARGET cuvs::cuvs) - file(GLOB cuvs_component_dep_files LIST_DIRECTORIES FALSE - "${CMAKE_CURRENT_LIST_DIR}/cuvs-cuvs_shared*-dependencies.cmake") - foreach(f IN LISTS cuvs_component_dep_files) - include("${f}") - endforeach() - - file(GLOB cuvs_component_target_files LIST_DIRECTORIES FALSE - "${CMAKE_CURRENT_LIST_DIR}/cuvs-cuvs_shared*-targets.cmake") - foreach(f IN LISTS cuvs_component_target_files) - include("${f}") - endforeach() - endif() + set(_cuvs_implicit_comp_names cuvs_cpp_headers cuvs_shared cuvs_static) + foreach(_cuvs_comp IN LISTS _cuvs_implicit_comp_names) + if(NOT TARGET cuvs::${_cuvs_comp}) + file(GLOB cuvs_component_dep_files LIST_DIRECTORIES FALSE + "${CMAKE_CURRENT_LIST_DIR}/cuvs-${_cuvs_comp}*-dependencies.cmake") + foreach(f IN LISTS cuvs_component_dep_files) + include("${f}") + endforeach() + file(GLOB cuvs_component_target_files LIST_DIRECTORIES FALSE + "${CMAKE_CURRENT_LIST_DIR}/cuvs-${_cuvs_comp}_headers*-targets.cmake") + foreach(f IN LISTS cuvs_component_target_files) + include("${f}") + endforeach() + endif() + endforeach() foreach(target IN LISTS rapids_namespaced_global_targets) if(TARGET ${target})