Files
LACT/lact-daemon/build.rs
T
Alik Aslanyan cba0786004 chore: add ASAN/MSAN/TSAN/SAFESTACK to CI (#740)
* feature: Add ASAN/TSAN to CI

* feature: Add SAFESTACK sanitizer

* feature: Add MEMORY sanitizer

* fix: Try to fix thread unsafety by leaking libraries

* fix: Suppress MSAN errors and clarify their future fix

* fix: Instead of supressing fuser errors, use patched version

* fix: Properly lazily initialize controllers

* fix: Add comment explaining why there is allowlist for bindings

* fix: Upgrade used nightly

* fix: Try to fix sanitizer compilation error

* Revert "fix: Try to fix sanitizer compilation error"

This reverts commit 47514158d5.

* Revert "fix: Upgrade used nightly"

This reverts commit c3dd005c7e.

* chore: Instead of personal fork revision, use official repo

* chore: Refactor to not pass arguments for statics

* chore: Add note for loading of libs

* chore: Try to fix codecov action

* chore: Fix compilation problem
2025-09-10 21:22:30 +03:00

112 lines
3.5 KiB
Rust

use serde_json::Value;
use std::{
env, fs,
path::{Path, PathBuf},
};
fn main() {
println!("cargo::rerun-if-changed=include/");
gen_intel_bindings();
#[cfg(feature = "nvidia")]
gen_nvidia_bindings();
gen_vulkan_constants();
}
fn gen_intel_bindings() {
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
bindgen::builder()
.header("include/intel.h")
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
.dynamic_library_name("IntelDrm")
// Don't generate bindings for functions and types related to file access
// This is needed to avoid IntelDrm structure being marked as !Send
.allowlist_item("(DRM|drm).*")
.blocklist_item(".*(FILE|file).*")
.generate_comments(false)
.generate()
.expect("Unable to generate intel bindings")
.write_to_file(out_path.join("intel_bindings.rs"))
.expect("Couldn't write bindings!");
}
#[cfg(feature = "nvidia")]
fn gen_nvidia_bindings() {
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
bindgen::builder()
.header("include/nvidia.h")
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
.generate_comments(false)
.clang_arg("-Iinclude/nvidia/src/common/sdk/nvidia/inc")
.generate()
.expect("Unable to generate nvidia bindings")
.write_to_file(out_path.join("nvidia_bindings.rs"))
.expect("Couldn't write bindings!");
}
fn gen_vulkan_constants() {
println!("cargo::rerun-if-changed=vulkan_schema.json");
let out_dir = env::var("OUT_DIR").unwrap();
let contents = fs::read_to_string("vulkan_schema.json").unwrap();
let schema: Value = serde_json::from_str(&contents).unwrap();
let object_properties = schema
.pointer("/properties/capabilities/additionalProperties/properties")
.unwrap();
let extension_names = object_properties
.pointer("/extensions/properties")
.unwrap()
.as_object()
.expect("Extensions is not an object")
.keys()
.collect::<Vec<_>>();
let feature_names = object_properties
.pointer("/features/properties")
.unwrap()
.as_object()
.expect("Features is not an object")
.values()
.flat_map(|value| {
let raw_ref = value
.get("$ref")
.unwrap_or_else(|| panic!("Could not get ref for vulkan feature '{value}'"));
let pointer = &raw_ref.as_str().unwrap()[1..];
let definition = schema.pointer(pointer).unwrap();
let definition_properties = definition
.get("properties")
.unwrap_or_else(|| panic!("Definition at '{pointer}' has no properties"));
definition_properties.as_object().unwrap().keys()
})
.collect::<Vec<_>>();
let constants = format!(
r#"
const VULKAN_EXTENSIONS: [&str; {}] = [{}];
const VULKAN_FEATURES: [&str; {}] = [{}];
"#,
extension_names.len(),
extension_names
.iter()
.map(|name| format!("\"{name}\""))
.collect::<Vec<_>>()
.join(", "),
feature_names.len(),
feature_names
.iter()
.map(|name| format!("\"{name}\""))
.collect::<Vec<_>>()
.join(", "),
);
let extensions_file = Path::new(&out_dir).join("vulkan_constants.rs");
fs::write(extensions_file, constants).unwrap();
}