@@ -28,6 +28,8 @@ struct CuvsMetadata {
2828 include_dir : PathBuf ,
2929 #[ cfg( feature = "generate-bindings" ) ]
3030 bindgen_include_dirs : Vec < PathBuf > ,
31+ #[ cfg( feature = "generate-bindings" ) ]
32+ bindgen_system_include_dirs : Vec < PathBuf > ,
3133 lib_dir : PathBuf ,
3234}
3335
@@ -134,15 +136,24 @@ fn try_find_cuvs_package(required_version: &Version) -> Result<CuvsMetadata> {
134136 // CUDAToolkit and DLPack include directories are only needed for bindgen.
135137 #[ cfg( feature = "generate-bindings" ) ]
136138 let bindgen_include_dirs: Vec < _ > = {
137- let cudatoolkit = find_cudatoolkit_package ( ) ?;
138- let cudatoolkit_target = find_target ( & cudatoolkit, "CUDAToolkit" , "CUDA::toolkit" ) ?;
139139 let dlpack = find_dlpack_package ( ) ?;
140140 let dlpack_target = find_target ( & dlpack, "dlpack" , "dlpack::dlpack" ) ?;
141- target
141+ dlpack_target
142+ . include_directories
143+ . iter ( )
144+ . map ( PathBuf :: from)
145+ . filter ( |dir| dir. is_dir ( ) )
146+ . filter ( |dir| dir != & include_dir)
147+ . collect ( )
148+ } ;
149+
150+ #[ cfg( feature = "generate-bindings" ) ]
151+ let bindgen_system_include_dirs: Vec < _ > = {
152+ let cudatoolkit = find_cudatoolkit_package ( ) ?;
153+ let cudatoolkit_target = find_target ( & cudatoolkit, "CUDAToolkit" , "CUDA::toolkit" ) ?;
154+ cudatoolkit_target
142155 . include_directories
143156 . iter ( )
144- . chain ( cudatoolkit_target. include_directories . iter ( ) )
145- . chain ( dlpack_target. include_directories . iter ( ) )
146157 . map ( PathBuf :: from)
147158 . filter ( |dir| dir. is_dir ( ) )
148159 . collect ( )
@@ -162,6 +173,8 @@ fn try_find_cuvs_package(required_version: &Version) -> Result<CuvsMetadata> {
162173 include_dir,
163174 #[ cfg( feature = "generate-bindings" ) ]
164175 bindgen_include_dirs,
176+ #[ cfg( feature = "generate-bindings" ) ]
177+ bindgen_system_include_dirs,
165178 lib_dir,
166179 } )
167180}
@@ -217,7 +230,11 @@ fn locate_cuvs() -> Result<CuvsMetadata> {
217230}
218231
219232#[ cfg( feature = "generate-bindings" ) ]
220- fn generate_bindings ( include_dirs : & [ PathBuf ] ) {
233+ fn generate_bindings (
234+ include_dir : & Path ,
235+ include_dirs : & [ PathBuf ] ,
236+ system_include_dirs : & [ PathBuf ] ,
237+ ) {
221238 let out_dir = PathBuf :: from ( std:: env:: var ( "OUT_DIR" ) . expect ( "OUT_DIR not set by Cargo" ) ) ;
222239
223240 let mut builder = bindgen:: Builder :: default ( )
@@ -228,10 +245,16 @@ fn generate_bindings(include_dirs: &[PathBuf]) {
228245 . rustified_enum ( "(cuvs|DL|cudaError).*" )
229246 . parse_callbacks ( Box :: new ( bindgen:: CargoCallbacks :: new ( ) ) ) ;
230247
248+ builder = builder. clang_arg ( format ! ( "-I{}" , include_dir. display( ) ) ) ;
249+
231250 for include_dir in include_dirs {
232251 builder = builder. clang_arg ( format ! ( "-I{}" , include_dir. display( ) ) ) ;
233252 }
234253
254+ for include_dir in system_include_dirs {
255+ builder = builder. clang_arg ( format ! ( "-isystem{}" , include_dir. display( ) ) ) ;
256+ }
257+
235258 builder
236259 . generate ( )
237260 . expect ( "bindgen failed to generate cuvs bindings" )
@@ -267,5 +290,9 @@ fn main() {
267290 println ! ( "cargo::metadata=lib={}" , metadata. lib_dir. display( ) ) ;
268291
269292 #[ cfg( feature = "generate-bindings" ) ]
270- generate_bindings ( & metadata. bindgen_include_dirs ) ;
293+ generate_bindings (
294+ & metadata. include_dir ,
295+ & metadata. bindgen_include_dirs ,
296+ & metadata. bindgen_system_include_dirs ,
297+ ) ;
271298}
0 commit comments