diff --git a/crates/wdk-build/src/bindgen.rs b/crates/wdk-build/src/bindgen.rs index 51aae94b..48a5d615 100644 --- a/crates/wdk-build/src/bindgen.rs +++ b/crates/wdk-build/src/bindgen.rs @@ -15,7 +15,7 @@ pub trait BuilderExt { /// /// Implementation may return `wdk_build::ConfigError` if it fails to create /// a builder - fn wdk_default(c_header_files: Vec<&str>, config: Config) -> Result; + fn wdk_default(c_header_files: Vec<&str>, config: &Config) -> Result; } impl BuilderExt for Builder { @@ -26,7 +26,7 @@ impl BuilderExt for Builder { /// /// Will return `wdk_build::ConfigError` if any of the resolved include or /// library paths do not exist - fn wdk_default(c_header_files: Vec<&str>, config: Config) -> Result { + fn wdk_default(c_header_files: Vec<&str>, config: &Config) -> Result { let mut builder = Self::default(); for c_header in c_header_files { diff --git a/crates/wdk-sys/build.rs b/crates/wdk-sys/build.rs index efb569ab..3721bf27 100644 --- a/crates/wdk-sys/build.rs +++ b/crates/wdk-sys/build.rs @@ -6,6 +6,8 @@ use std::{ env, path::{Path, PathBuf}, + sync::Arc, + thread::{self, JoinHandle}, }; use bindgen::CodegenConfig; @@ -21,7 +23,7 @@ use wdk_build::{BuilderExt, Config, ConfigError, DriverConfig, KMDFConfig}; // "2.0", "2.15", "2.17", "2.19", "2.21", "2.23", "2.25", "2.27", "2.31", // "2.33", ]; -fn generate_constants(out_path: &Path, config: Config) -> Result<(), ConfigError> { +fn generate_constants(out_path: &Path, config: &Config) -> Result<(), ConfigError> { Ok( bindgen::Builder::wdk_default(vec!["src/ntddk-input.h", "src/wdf-input.h"], config)? .with_codegen_config(CodegenConfig::VARS) @@ -31,7 +33,7 @@ fn generate_constants(out_path: &Path, config: Config) -> Result<(), ConfigError ) } -fn generate_types(out_path: &Path, config: Config) -> Result<(), ConfigError> { +fn generate_types(out_path: &Path, config: &Config) -> Result<(), ConfigError> { Ok( bindgen::Builder::wdk_default(vec!["src/ntddk-input.h", "src/wdf-input.h"], config)? .with_codegen_config(CodegenConfig::TYPES) @@ -41,7 +43,7 @@ fn generate_types(out_path: &Path, config: Config) -> Result<(), ConfigError> { ) } -fn generate_ntddk(out_path: &Path, config: Config) -> Result<(), ConfigError> { +fn generate_ntddk(out_path: &Path, config: &Config) -> Result<(), ConfigError> { Ok( bindgen::Builder::wdk_default(vec!["src/ntddk-input.h"], config)? .with_codegen_config((CodegenConfig::TYPES | CodegenConfig::VARS).complement()) @@ -51,7 +53,7 @@ fn generate_ntddk(out_path: &Path, config: Config) -> Result<(), ConfigError> { ) } -fn generate_wdf(out_path: &Path, config: Config) -> Result<(), ConfigError> { +fn generate_wdf(out_path: &Path, config: &Config) -> Result<(), ConfigError> { // As of NI WDK, this may generate an empty file due to no non-type and non-var // items in the wdf headers(i.e. functions are all inlined). This step is // intentionally left here in case older WDKs have non-inlined functions or new @@ -67,6 +69,15 @@ fn generate_wdf(out_path: &Path, config: Config) -> Result<(), ConfigError> { ) } +type GenerateFn = fn(&Path, &Config) -> Result<(), ConfigError>; + +const GENERATE_FUNCTIONS: [GenerateFn; 4] = [ + generate_constants, + generate_types, + generate_ntddk, + generate_wdf, +]; + fn main() -> anyhow::Result<()> { let tracing_filter = EnvFilter::default() // Show errors and warnings by default @@ -135,12 +146,27 @@ fn main() -> anyhow::Result<()> { ), ]; + let mut handles = Vec::>>::new(); + let config_arc = Arc::new(config); + for out_path in out_paths { - generate_constants(&out_path, config.clone())?; - generate_types(&out_path, config.clone())?; - generate_ntddk(&out_path, config.clone())?; - generate_wdf(&out_path, config.clone())?; + let path_arc = Arc::new(out_path); + for generate_function in GENERATE_FUNCTIONS { + let temp_path = path_arc.clone(); + let temp_config = config_arc.clone(); + let handle: JoinHandle> = thread::spawn(move || { + generate_function(&temp_path, &temp_config)?; + Ok(()) + }); + handles.push(handle); + } + } + + for handle in handles { + if let Err(e) = handle.join().unwrap() { + return Err(e.into()); + } } - Ok(config.export_config()?) + Ok(config_arc.export_config()?) }