Skip to content

Commit 1663fcb

Browse files
committed
Remove CUDA symbols from pre-generated bindings
1 parent be5fa67 commit 1663fcb

8 files changed

Lines changed: 108 additions & 279 deletions

File tree

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/*
2+
* SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
#pragma once
7+
8+
/*
9+
* Minimal bindgen-only CUDA runtime stub.
10+
*
11+
* cuVS C headers currently include <cuda_runtime.h> only for cudaStream_t and
12+
* cudaDataType_t in public C ABI declarations. The Rust bindings provide their
13+
* own ABI-compatible definitions and blocklist CUDA items, so bindgen only needs
14+
* these declarations to parse the headers without having to discover a CUDA Toolkit.
15+
*/
16+
typedef struct CUstream_st* cudaStream_t;
17+
typedef unsigned int cudaDataType_t;

rust/cuvs-sys/build.rs

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,31 +9,28 @@ mod cmake;
99
use std::path::{Path, PathBuf};
1010

1111
#[cfg(feature = "generate-bindings")]
12-
fn generate_bindings(
13-
include_dir: &Path,
14-
include_dirs: &[PathBuf],
15-
system_include_dirs: &[PathBuf],
16-
) {
12+
fn generate_bindings(include_dir: &Path, include_dirs: &[PathBuf]) {
1713
let out_dir = PathBuf::from(std::env::var("OUT_DIR").expect("OUT_DIR not set by Cargo"));
14+
let stub_dir = Path::new(env!("CARGO_MANIFEST_DIR")).join("bindgen-stubs");
1815

1916
let mut builder = bindgen::Builder::default()
2017
.header("cuvs_c_wrapper.h")
2118
.must_use_type("cuvsError_t")
22-
.allowlist_function("(cuvs|cudaMemcpyAsync).*")
23-
.allowlist_type("(cuvs|DL|cudaError|cudaMemcpyKind).*")
24-
.rustified_enum("(cuvs|DL|cudaError).*")
19+
.allowlist_function("cuvs.*")
20+
.allowlist_type("(cuvs|DL).*")
21+
.rustified_enum("(cuvs|DL).*")
22+
.blocklist_item("cuda.*")
23+
.blocklist_item("CUstream_st")
24+
.raw_line("use crate::{cudaDataType_t, cudaStream_t};")
2525
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()));
2626

27+
builder = builder.clang_arg(format!("-I{}", stub_dir.display()));
2728
builder = builder.clang_arg(format!("-I{}", include_dir.display()));
2829

2930
for include_dir in include_dirs {
3031
builder = builder.clang_arg(format!("-I{}", include_dir.display()));
3132
}
3233

33-
for include_dir in system_include_dirs {
34-
builder = builder.clang_arg(format!("-isystem{}", include_dir.display()));
35-
}
36-
3734
builder
3835
.generate()
3936
.expect("bindgen failed to generate cuvs bindings")
@@ -44,6 +41,7 @@ fn generate_bindings(
4441
fn main() {
4542
println!("cargo::rerun-if-changed=cmake.rs");
4643
println!("cargo::rerun-if-changed=cmake/find_cuvs.cmake");
44+
println!("cargo::rerun-if-changed=bindgen-stubs/cuda_runtime.h");
4745
println!("cargo::rerun-if-env-changed=CMAKE_PREFIX_PATH");
4846
println!("cargo::rerun-if-env-changed=CONDA_PREFIX");
4947
println!("cargo::rerun-if-env-changed=LIBCUVS_USE_PYTHON");
@@ -61,19 +59,11 @@ fn main() {
6159
}
6260
};
6361

64-
// The bindings expose cudaMemcpyAsync which lives in libcudart,
65-
// not in libcuvs_c, so we must link it explicitly.
66-
println!("cargo:rustc-link-lib=dylib=cudart");
67-
6862
// Expose include path to downstream crates via DEP_CUVS_INCLUDE.
6963
println!("cargo::metadata=include={}", metadata.include_dir.display());
7064
// Expose the directory containing libcuvs_c.so via DEP_CUVS_LIB.
7165
println!("cargo::metadata=lib={}", metadata.lib_dir.display());
7266

7367
#[cfg(feature = "generate-bindings")]
74-
generate_bindings(
75-
&metadata.include_dir,
76-
&metadata.bindgen_include_dirs,
77-
&metadata.bindgen_system_include_dirs,
78-
);
68+
generate_bindings(&metadata.include_dir, &metadata.bindgen_include_dirs);
7969
}

rust/cuvs-sys/cmake.rs

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ pub(crate) struct CuvsMetadata {
3030
pub(crate) include_dir: PathBuf,
3131
#[cfg(feature = "generate-bindings")]
3232
pub(crate) bindgen_include_dirs: Vec<PathBuf>,
33-
#[cfg(feature = "generate-bindings")]
34-
pub(crate) bindgen_system_include_dirs: Vec<PathBuf>,
3533
pub(crate) lib_dir: PathBuf,
3634
}
3735

@@ -165,19 +163,6 @@ fn find_cuvs_package(cmake_dir: &Path) -> Result<cmake_package::CMakePackage> {
165163
})
166164
}
167165

168-
#[cfg(feature = "generate-bindings")]
169-
fn find_cudatoolkit_package() -> Result<cmake_package::CMakePackage> {
170-
find_package("CUDAToolkit").find().map_err(|e| match e {
171-
CmakeError::CMakeNotFound | CmakeError::UnsupportedCMakeVersion => {
172-
cmake_unavailable_error()
173-
}
174-
_ => anyhow::anyhow!(
175-
"Could not find CUDA Toolkit CMake package.\n\n\
176-
Install CUDA Toolkit so that `find_package(CUDAToolkit)` succeeds."
177-
),
178-
})
179-
}
180-
181166
#[cfg(feature = "generate-bindings")]
182167
fn find_dlpack_package() -> Result<cmake_package::CMakePackage> {
183168
find_package("dlpack").find().map_err(|e| match e {
@@ -216,7 +201,7 @@ pub(crate) fn try_find_cuvs_package(
216201
.map(PathBuf::from)
217202
.context("cuVS CMake target did not export any include directories")?;
218203

219-
// CUDAToolkit and DLPack include directories are only needed for bindgen.
204+
// DLPack include directories are only needed for bindgen.
220205
#[cfg(feature = "generate-bindings")]
221206
let bindgen_include_dirs: Vec<_> = {
222207
let dlpack = find_dlpack_package()?;
@@ -230,18 +215,6 @@ pub(crate) fn try_find_cuvs_package(
230215
.collect()
231216
};
232217

233-
#[cfg(feature = "generate-bindings")]
234-
let bindgen_system_include_dirs: Vec<_> = {
235-
let cudatoolkit = find_cudatoolkit_package()?;
236-
let cudatoolkit_target = find_target(&cudatoolkit, "CUDA::toolkit")?;
237-
cudatoolkit_target
238-
.include_directories
239-
.iter()
240-
.map(PathBuf::from)
241-
.filter(|dir| dir.is_dir())
242-
.collect()
243-
};
244-
245218
let lib_dir = target
246219
.location
247220
.as_deref()
@@ -256,8 +229,6 @@ pub(crate) fn try_find_cuvs_package(
256229
include_dir,
257230
#[cfg(feature = "generate-bindings")]
258231
bindgen_include_dirs,
259-
#[cfg(feature = "generate-bindings")]
260-
bindgen_system_include_dirs,
261232
lib_dir,
262233
})
263234
}

rust/cuvs-sys/src/bindings.rs

Lines changed: 2 additions & 198 deletions
Original file line numberDiff line numberDiff line change
@@ -1,202 +1,7 @@
11
/* automatically generated by rust-bindgen 0.72.1 */
22

3-
#[repr(u32)]
4-
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
5-
pub enum cudaError {
6-
cudaSuccess = 0,
7-
cudaErrorInvalidValue = 1,
8-
cudaErrorMemoryAllocation = 2,
9-
cudaErrorInitializationError = 3,
10-
cudaErrorCudartUnloading = 4,
11-
cudaErrorProfilerDisabled = 5,
12-
cudaErrorProfilerNotInitialized = 6,
13-
cudaErrorProfilerAlreadyStarted = 7,
14-
cudaErrorProfilerAlreadyStopped = 8,
15-
cudaErrorInvalidConfiguration = 9,
16-
cudaErrorInvalidPitchValue = 12,
17-
cudaErrorInvalidSymbol = 13,
18-
cudaErrorInvalidHostPointer = 16,
19-
cudaErrorInvalidDevicePointer = 17,
20-
cudaErrorInvalidTexture = 18,
21-
cudaErrorInvalidTextureBinding = 19,
22-
cudaErrorInvalidChannelDescriptor = 20,
23-
cudaErrorInvalidMemcpyDirection = 21,
24-
cudaErrorAddressOfConstant = 22,
25-
cudaErrorTextureFetchFailed = 23,
26-
cudaErrorTextureNotBound = 24,
27-
cudaErrorSynchronizationError = 25,
28-
cudaErrorInvalidFilterSetting = 26,
29-
cudaErrorInvalidNormSetting = 27,
30-
cudaErrorMixedDeviceExecution = 28,
31-
cudaErrorNotYetImplemented = 31,
32-
cudaErrorMemoryValueTooLarge = 32,
33-
cudaErrorStubLibrary = 34,
34-
cudaErrorInsufficientDriver = 35,
35-
cudaErrorCallRequiresNewerDriver = 36,
36-
cudaErrorInvalidSurface = 37,
37-
cudaErrorDuplicateVariableName = 43,
38-
cudaErrorDuplicateTextureName = 44,
39-
cudaErrorDuplicateSurfaceName = 45,
40-
cudaErrorDevicesUnavailable = 46,
41-
cudaErrorIncompatibleDriverContext = 49,
42-
cudaErrorMissingConfiguration = 52,
43-
cudaErrorPriorLaunchFailure = 53,
44-
cudaErrorLaunchMaxDepthExceeded = 65,
45-
cudaErrorLaunchFileScopedTex = 66,
46-
cudaErrorLaunchFileScopedSurf = 67,
47-
cudaErrorSyncDepthExceeded = 68,
48-
cudaErrorLaunchPendingCountExceeded = 69,
49-
cudaErrorInvalidDeviceFunction = 98,
50-
cudaErrorNoDevice = 100,
51-
cudaErrorInvalidDevice = 101,
52-
cudaErrorDeviceNotLicensed = 102,
53-
cudaErrorSoftwareValidityNotEstablished = 103,
54-
cudaErrorStartupFailure = 127,
55-
cudaErrorInvalidKernelImage = 200,
56-
cudaErrorDeviceUninitialized = 201,
57-
cudaErrorMapBufferObjectFailed = 205,
58-
cudaErrorUnmapBufferObjectFailed = 206,
59-
cudaErrorArrayIsMapped = 207,
60-
cudaErrorAlreadyMapped = 208,
61-
cudaErrorNoKernelImageForDevice = 209,
62-
cudaErrorAlreadyAcquired = 210,
63-
cudaErrorNotMapped = 211,
64-
cudaErrorNotMappedAsArray = 212,
65-
cudaErrorNotMappedAsPointer = 213,
66-
cudaErrorECCUncorrectable = 214,
67-
cudaErrorUnsupportedLimit = 215,
68-
cudaErrorDeviceAlreadyInUse = 216,
69-
cudaErrorPeerAccessUnsupported = 217,
70-
cudaErrorInvalidPtx = 218,
71-
cudaErrorInvalidGraphicsContext = 219,
72-
cudaErrorNvlinkUncorrectable = 220,
73-
cudaErrorJitCompilerNotFound = 221,
74-
cudaErrorUnsupportedPtxVersion = 222,
75-
cudaErrorJitCompilationDisabled = 223,
76-
cudaErrorUnsupportedExecAffinity = 224,
77-
cudaErrorUnsupportedDevSideSync = 225,
78-
cudaErrorContained = 226,
79-
cudaErrorInvalidSource = 300,
80-
cudaErrorFileNotFound = 301,
81-
cudaErrorSharedObjectSymbolNotFound = 302,
82-
cudaErrorSharedObjectInitFailed = 303,
83-
cudaErrorOperatingSystem = 304,
84-
cudaErrorInvalidResourceHandle = 400,
85-
cudaErrorIllegalState = 401,
86-
cudaErrorLossyQuery = 402,
87-
cudaErrorSymbolNotFound = 500,
88-
cudaErrorNotReady = 600,
89-
cudaErrorIllegalAddress = 700,
90-
cudaErrorLaunchOutOfResources = 701,
91-
cudaErrorLaunchTimeout = 702,
92-
cudaErrorLaunchIncompatibleTexturing = 703,
93-
cudaErrorPeerAccessAlreadyEnabled = 704,
94-
cudaErrorPeerAccessNotEnabled = 705,
95-
cudaErrorSetOnActiveProcess = 708,
96-
cudaErrorContextIsDestroyed = 709,
97-
cudaErrorAssert = 710,
98-
cudaErrorTooManyPeers = 711,
99-
cudaErrorHostMemoryAlreadyRegistered = 712,
100-
cudaErrorHostMemoryNotRegistered = 713,
101-
cudaErrorHardwareStackError = 714,
102-
cudaErrorIllegalInstruction = 715,
103-
cudaErrorMisalignedAddress = 716,
104-
cudaErrorInvalidAddressSpace = 717,
105-
cudaErrorInvalidPc = 718,
106-
cudaErrorLaunchFailure = 719,
107-
cudaErrorCooperativeLaunchTooLarge = 720,
108-
cudaErrorTensorMemoryLeak = 721,
109-
cudaErrorNotPermitted = 800,
110-
cudaErrorNotSupported = 801,
111-
cudaErrorSystemNotReady = 802,
112-
cudaErrorSystemDriverMismatch = 803,
113-
cudaErrorCompatNotSupportedOnDevice = 804,
114-
cudaErrorMpsConnectionFailed = 805,
115-
cudaErrorMpsRpcFailure = 806,
116-
cudaErrorMpsServerNotReady = 807,
117-
cudaErrorMpsMaxClientsReached = 808,
118-
cudaErrorMpsMaxConnectionsReached = 809,
119-
cudaErrorMpsClientTerminated = 810,
120-
cudaErrorCdpNotSupported = 811,
121-
cudaErrorCdpVersionMismatch = 812,
122-
cudaErrorStreamCaptureUnsupported = 900,
123-
cudaErrorStreamCaptureInvalidated = 901,
124-
cudaErrorStreamCaptureMerge = 902,
125-
cudaErrorStreamCaptureUnmatched = 903,
126-
cudaErrorStreamCaptureUnjoined = 904,
127-
cudaErrorStreamCaptureIsolation = 905,
128-
cudaErrorStreamCaptureImplicit = 906,
129-
cudaErrorCapturedEvent = 907,
130-
cudaErrorStreamCaptureWrongThread = 908,
131-
cudaErrorTimeout = 909,
132-
cudaErrorGraphExecUpdateFailure = 910,
133-
cudaErrorExternalDevice = 911,
134-
cudaErrorInvalidClusterSize = 912,
135-
cudaErrorFunctionNotLoaded = 913,
136-
cudaErrorInvalidResourceType = 914,
137-
cudaErrorInvalidResourceConfiguration = 915,
138-
cudaErrorStreamDetached = 917,
139-
cudaErrorUnknown = 999,
140-
cudaErrorApiFailureBase = 10000,
141-
}
142-
pub const cudaMemcpyKind_cudaMemcpyHostToHost: cudaMemcpyKind = 0;
143-
pub const cudaMemcpyKind_cudaMemcpyHostToDevice: cudaMemcpyKind = 1;
144-
pub const cudaMemcpyKind_cudaMemcpyDeviceToHost: cudaMemcpyKind = 2;
145-
pub const cudaMemcpyKind_cudaMemcpyDeviceToDevice: cudaMemcpyKind = 3;
146-
pub const cudaMemcpyKind_cudaMemcpyDefault: cudaMemcpyKind = 4;
147-
pub type cudaMemcpyKind = ::std::os::raw::c_uint;
148-
pub use self::cudaError as cudaError_t;
149-
#[repr(C)]
150-
#[derive(Debug, Copy, Clone)]
151-
pub struct CUstream_st {
152-
_unused: [u8; 0],
153-
}
154-
pub type cudaStream_t = *mut CUstream_st;
155-
pub const cudaDataType_t_CUDA_R_16F: cudaDataType_t = 2;
156-
pub const cudaDataType_t_CUDA_C_16F: cudaDataType_t = 6;
157-
pub const cudaDataType_t_CUDA_R_16BF: cudaDataType_t = 14;
158-
pub const cudaDataType_t_CUDA_C_16BF: cudaDataType_t = 15;
159-
pub const cudaDataType_t_CUDA_R_32F: cudaDataType_t = 0;
160-
pub const cudaDataType_t_CUDA_C_32F: cudaDataType_t = 4;
161-
pub const cudaDataType_t_CUDA_R_64F: cudaDataType_t = 1;
162-
pub const cudaDataType_t_CUDA_C_64F: cudaDataType_t = 5;
163-
pub const cudaDataType_t_CUDA_R_4I: cudaDataType_t = 16;
164-
pub const cudaDataType_t_CUDA_C_4I: cudaDataType_t = 17;
165-
pub const cudaDataType_t_CUDA_R_4U: cudaDataType_t = 18;
166-
pub const cudaDataType_t_CUDA_C_4U: cudaDataType_t = 19;
167-
pub const cudaDataType_t_CUDA_R_8I: cudaDataType_t = 3;
168-
pub const cudaDataType_t_CUDA_C_8I: cudaDataType_t = 7;
169-
pub const cudaDataType_t_CUDA_R_8U: cudaDataType_t = 8;
170-
pub const cudaDataType_t_CUDA_C_8U: cudaDataType_t = 9;
171-
pub const cudaDataType_t_CUDA_R_16I: cudaDataType_t = 20;
172-
pub const cudaDataType_t_CUDA_C_16I: cudaDataType_t = 21;
173-
pub const cudaDataType_t_CUDA_R_16U: cudaDataType_t = 22;
174-
pub const cudaDataType_t_CUDA_C_16U: cudaDataType_t = 23;
175-
pub const cudaDataType_t_CUDA_R_32I: cudaDataType_t = 10;
176-
pub const cudaDataType_t_CUDA_C_32I: cudaDataType_t = 11;
177-
pub const cudaDataType_t_CUDA_R_32U: cudaDataType_t = 12;
178-
pub const cudaDataType_t_CUDA_C_32U: cudaDataType_t = 13;
179-
pub const cudaDataType_t_CUDA_R_64I: cudaDataType_t = 24;
180-
pub const cudaDataType_t_CUDA_C_64I: cudaDataType_t = 25;
181-
pub const cudaDataType_t_CUDA_R_64U: cudaDataType_t = 26;
182-
pub const cudaDataType_t_CUDA_C_64U: cudaDataType_t = 27;
183-
pub const cudaDataType_t_CUDA_R_8F_E4M3: cudaDataType_t = 28;
184-
pub const cudaDataType_t_CUDA_R_8F_UE4M3: cudaDataType_t = 28;
185-
pub const cudaDataType_t_CUDA_R_8F_E5M2: cudaDataType_t = 29;
186-
pub const cudaDataType_t_CUDA_R_8F_UE8M0: cudaDataType_t = 30;
187-
pub const cudaDataType_t_CUDA_R_6F_E2M3: cudaDataType_t = 31;
188-
pub const cudaDataType_t_CUDA_R_6F_E3M2: cudaDataType_t = 32;
189-
pub const cudaDataType_t_CUDA_R_4F_E2M1: cudaDataType_t = 33;
190-
pub type cudaDataType_t = ::std::os::raw::c_uint;
191-
unsafe extern "C" {
192-
pub fn cudaMemcpyAsync(
193-
dst: *mut ::std::os::raw::c_void,
194-
src: *const ::std::os::raw::c_void,
195-
count: usize,
196-
kind: cudaMemcpyKind,
197-
stream: cudaStream_t,
198-
) -> cudaError_t;
199-
}
3+
use crate::{cudaDataType_t, cudaStream_t};
4+
2005
#[repr(u32)]
2016
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
2027
pub enum DLDeviceType {
@@ -779,7 +584,6 @@ unsafe extern "C" {
779584
}
780585
#[doc = " @defgroup ivf_pq_c_search_params IVF-PQ index search parameters\n @{\n/\n/**\n @brief Supplemental parameters to search IVF-PQ index\n"]
781586
#[repr(C)]
782-
#[derive(Debug, Copy, Clone)]
783587
pub struct cuvsIvfPqSearchParams {
784588
#[doc = " The number of clusters to search."]
785589
pub n_probes: u32,

0 commit comments

Comments
 (0)