6 use std::path::PathBuf;
8 fn detect_vulkan_calling_convention() -> io::Result<String> {
9 let code = bindgen::builder()
12 r#"#include <vulkan/vk_platform.h>
17 VKAPI_ATTR void VKAPI_CALL detect_fn();
23 ).clang_arg("-target")
24 .clang_arg(env::var("TARGET").unwrap())
25 .clang_arg("-I../external/Vulkan-Headers/include")
26 .whitelist_function("detect_fn")
28 .map_err(|_| io::Error::new(io::ErrorKind::Other, "generate() failed"))?
30 if let Some(captures) = regex::Regex::new(r#"extern "([^"]+)""#)
34 Ok(captures[1].to_owned())
36 eprintln!("code:\n{}", code);
37 Err(io::Error::new(io::ErrorKind::Other, "regex not found"))
41 fn main() -> io::Result<()> {
42 println!("cargo:rerun-if-changed=vulkan-wrapper.h");
43 println!("cargo:rerun-if-changed=../external/Vulkan-Headers/include");
44 let vulkan_calling_convention = detect_vulkan_calling_convention()?;
45 let match_calling_convention_regex = regex::Regex::new(r#"extern "([^"]+)""#).unwrap();
46 let mut builder = bindgen::builder()
47 .header("vulkan-wrapper.h")
49 .clang_arg(env::var("TARGET").unwrap())
50 .clang_arg("-I../external/Vulkan-Headers/include")
51 .prepend_enum_name(false)
53 .whitelist_var("VK_.*")
54 .whitelist_var("ICD_LOADER_MAGIC");
62 builder = builder.blacklist_type(t).blacklist_type(format!("{}_T", t));
79 "VkDescriptorSetLayout",
85 "VkSamplerYcbcrConversion",
86 "VkDescriptorUpdateTemplate",
91 "VkDebugReportCallbackEXT",
92 "VkDebugUtilsMessengerEXT",
93 "VkValidationCacheEXT",
95 builder = builder.blacklist_type(t).blacklist_type(format!("{}_T", t));
98 .whitelist_type("PFN_.*")
99 .blacklist_type("^xcb_.*")
102 .constified_enum(".*");
103 let mut code = builder
105 .map_err(|_| io::Error::new(io::ErrorKind::Other, "generate() failed"))?
107 code = match_calling_convention_regex
108 .replace_all(&code, |captures: ®ex::Captures| {
109 if captures[1] == vulkan_calling_convention {
113 PathBuf::from(env::var("OUT_DIR").unwrap()).join("vulkan-types.rs"),
116 eprintln!("vulkan_calling_convention: {:?}", vulkan_calling_convention);
117 panic!("unhandled non-vulkan calling convention");
121 PathBuf::from(env::var("OUT_DIR").unwrap()).join("vulkan-types.rs"),