diff --git a/dev-tools/gen-windows-sys-binding/Cargo.toml b/dev-tools/gen-windows-sys-binding/Cargo.toml index 15446016..12d9f276 100644 --- a/dev-tools/gen-windows-sys-binding/Cargo.toml +++ b/dev-tools/gen-windows-sys-binding/Cargo.toml @@ -7,3 +7,4 @@ publish = false [dependencies] windows-bindgen = "0.58" tempfile = "3" +regex = "1" diff --git a/dev-tools/gen-windows-sys-binding/src/main.rs b/dev-tools/gen-windows-sys-binding/src/main.rs index f7d21a52..ef7c15f3 100644 --- a/dev-tools/gen-windows-sys-binding/src/main.rs +++ b/dev-tools/gen-windows-sys-binding/src/main.rs @@ -6,6 +6,8 @@ use std::{ io::{BufWriter, Write as _}, }; +use regex::Regex; + /// This is printed to the file before the rest of the contents. const PRELUDE: &str = r#"// This file is autogenerated. // @@ -58,6 +60,27 @@ fn main() { write!(&mut f, "{PRELUDE}\n{bindings}\n").unwrap(); + let mut dll_names: Vec<&str> = Regex::new(r#"link!\("(.*)\.dll""#) + .unwrap() + .captures_iter(&bindings) + .map(|caps| caps.extract().1) + .map(|[dll_name]| dll_name) + .filter(|dll_name| *dll_name != "kernel32") + .collect(); + + if !dll_names.is_empty() { + dll_names.sort_unstable(); + dll_names.dedup(); + + for dll_name in dll_names { + write!(&mut f, r#"#[link(name = "{dll_name}")]"#).unwrap(); + f.write_all("\n".as_bytes()).unwrap(); + } + + f.write_all(r#"extern "C" {}"#.as_bytes()).unwrap(); + f.write_all("\n".as_bytes()).unwrap(); + } + f.write_all(r#"use super::windows_targets;"#.as_bytes()) .unwrap(); f.write_all("\n".as_bytes()).unwrap(); diff --git a/src/windows/windows_sys.rs b/src/windows/windows_sys.rs index 9e06a237..fd177e65 100644 --- a/src/windows/windows_sys.rs +++ b/src/windows/windows_sys.rs @@ -114,4 +114,8 @@ pub const WAIT_OBJECT_0: WAIT_EVENT = 0u32; pub const WAIT_TIMEOUT: WAIT_EVENT = 258u32; pub type WIN32_ERROR = u32; +#[link(name = "advapi32")] +#[link(name = "ole32")] +#[link(name = "oleaut32")] +extern "C" {} use super::windows_targets; diff --git a/src/windows/windows_targets.rs b/src/windows/windows_targets.rs index 30ddf643..d08affe0 100644 --- a/src/windows/windows_targets.rs +++ b/src/windows/windows_targets.rs @@ -9,8 +9,7 @@ macro_rules! link_macro { // have in this repo. So instead we always link kernel32.lib and add the rest of the import // libraries below by using an empty extern block. This works because extern blocks are not // connected to the library given in the #[link] attribute. - #[cfg_attr(not(target_arch = "x86"), link(name = $library, kind = "raw-dylib", modifiers = "+verbatim"))] - #[cfg_attr(target_arch = "x86", link(name = $library, kind = "raw-dylib", modifiers = "+verbatim", import_name_type = "undecorated"))] + #[link(name = "kernel32")] extern $abi { $(#[link_name=$link_name])? pub fn $($function)*;