From f9c91936d65a6fb0bdcaa2b11952708109627300 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 6 Jul 2024 06:32:22 +0000 Subject: [PATCH 1/7] Regenerate windows sys bindings --- src/windows/windows_sys.rs | 124 +++++-------------------------------- 1 file changed, 17 insertions(+), 107 deletions(-) diff --git a/src/windows/windows_sys.rs b/src/windows/windows_sys.rs index 80d23ebf..2fb15f78 100644 --- a/src/windows/windows_sys.rs +++ b/src/windows/windows_sys.rs @@ -6,7 +6,7 @@ // cd generate-windows-sys/ // cargo run // ``` -// Bindings generated by `windows-bindgen` 0.57.0 +// Bindings generated by `windows-bindgen` 0.58.0 #![allow( non_snake_case, @@ -15,112 +15,22 @@ dead_code, clippy::all )] -#[link(name = "advapi32")] -extern "system" { - pub fn RegCloseKey(hkey: HKEY) -> WIN32_ERROR; -} -#[link(name = "advapi32")] -extern "system" { - pub fn RegEnumKeyExW( - hkey: HKEY, - dwindex: u32, - lpname: PWSTR, - lpcchname: *mut u32, - lpreserved: *const u32, - lpclass: PWSTR, - lpcchclass: *mut u32, - lpftlastwritetime: *mut FILETIME, - ) -> WIN32_ERROR; -} -#[link(name = "advapi32")] -extern "system" { - pub fn RegOpenKeyExW( - hkey: HKEY, - lpsubkey: PCWSTR, - uloptions: u32, - samdesired: REG_SAM_FLAGS, - phkresult: *mut HKEY, - ) -> WIN32_ERROR; -} -#[link(name = "advapi32")] -extern "system" { - pub fn RegQueryValueExW( - hkey: HKEY, - lpvaluename: PCWSTR, - lpreserved: *const u32, - lptype: *mut REG_VALUE_TYPE, - lpdata: *mut u8, - lpcbdata: *mut u32, - ) -> WIN32_ERROR; -} -#[link(name = "kernel32")] -extern "system" { - pub fn FreeLibrary(hlibmodule: HMODULE) -> BOOL; -} -#[link(name = "kernel32")] -extern "system" { - pub fn GetMachineTypeAttributes( - machine: u16, - machinetypeattributes: *mut MACHINE_ATTRIBUTES, - ) -> HRESULT; -} -#[link(name = "kernel32")] -extern "system" { - pub fn GetProcAddress(hmodule: HMODULE, lpprocname: PCSTR) -> FARPROC; -} -#[link(name = "kernel32")] -extern "system" { - pub fn LoadLibraryA(lplibfilename: PCSTR) -> HMODULE; -} -#[link(name = "kernel32")] -extern "system" { - pub fn OpenSemaphoreA(dwdesiredaccess: u32, binherithandle: BOOL, lpname: PCSTR) -> HANDLE; -} -#[link(name = "kernel32")] -extern "system" { - pub fn PeekNamedPipe( - hnamedpipe: HANDLE, - lpbuffer: *mut core::ffi::c_void, - nbuffersize: u32, - lpbytesread: *mut u32, - lptotalbytesavail: *mut u32, - lpbytesleftthismessage: *mut u32, - ) -> BOOL; -} -#[link(name = "kernel32")] -extern "system" { - pub fn ReleaseSemaphore( - hsemaphore: HANDLE, - lreleasecount: i32, - lppreviouscount: *mut i32, - ) -> BOOL; -} -#[link(name = "kernel32")] -extern "system" { - pub fn WaitForSingleObject(hhandle: HANDLE, dwmilliseconds: u32) -> WAIT_EVENT; -} -#[link(name = "ole32")] -extern "system" { - pub fn CoCreateInstance( - rclsid: *const GUID, - punkouter: *mut core::ffi::c_void, - dwclscontext: CLSCTX, - riid: *const GUID, - ppv: *mut *mut core::ffi::c_void, - ) -> HRESULT; -} -#[link(name = "ole32")] -extern "system" { - pub fn CoInitializeEx(pvreserved: *const core::ffi::c_void, dwcoinit: u32) -> HRESULT; -} -#[link(name = "oleaut32")] -extern "system" { - pub fn SysFreeString(bstrstring: BSTR); -} -#[link(name = "oleaut32")] -extern "system" { - pub fn SysStringLen(pbstr: BSTR) -> u32; -} +windows_targets::link!("advapi32.dll" "system" fn RegCloseKey(hkey : HKEY) -> WIN32_ERROR); +windows_targets::link!("advapi32.dll" "system" fn RegEnumKeyExW(hkey : HKEY, dwindex : u32, lpname : PWSTR, lpcchname : *mut u32, lpreserved : *const u32, lpclass : PWSTR, lpcchclass : *mut u32, lpftlastwritetime : *mut FILETIME) -> WIN32_ERROR); +windows_targets::link!("advapi32.dll" "system" fn RegOpenKeyExW(hkey : HKEY, lpsubkey : PCWSTR, uloptions : u32, samdesired : REG_SAM_FLAGS, phkresult : *mut HKEY) -> WIN32_ERROR); +windows_targets::link!("advapi32.dll" "system" fn RegQueryValueExW(hkey : HKEY, lpvaluename : PCWSTR, lpreserved : *const u32, lptype : *mut REG_VALUE_TYPE, lpdata : *mut u8, lpcbdata : *mut u32) -> WIN32_ERROR); +windows_targets::link!("kernel32.dll" "system" fn FreeLibrary(hlibmodule : HMODULE) -> BOOL); +windows_targets::link!("kernel32.dll" "system" fn GetMachineTypeAttributes(machine : u16, machinetypeattributes : *mut MACHINE_ATTRIBUTES) -> HRESULT); +windows_targets::link!("kernel32.dll" "system" fn GetProcAddress(hmodule : HMODULE, lpprocname : PCSTR) -> FARPROC); +windows_targets::link!("kernel32.dll" "system" fn LoadLibraryA(lplibfilename : PCSTR) -> HMODULE); +windows_targets::link!("kernel32.dll" "system" fn OpenSemaphoreA(dwdesiredaccess : u32, binherithandle : BOOL, lpname : PCSTR) -> HANDLE); +windows_targets::link!("kernel32.dll" "system" fn PeekNamedPipe(hnamedpipe : HANDLE, lpbuffer : *mut core::ffi::c_void, nbuffersize : u32, lpbytesread : *mut u32, lptotalbytesavail : *mut u32, lpbytesleftthismessage : *mut u32) -> BOOL); +windows_targets::link!("kernel32.dll" "system" fn ReleaseSemaphore(hsemaphore : HANDLE, lreleasecount : i32, lppreviouscount : *mut i32) -> BOOL); +windows_targets::link!("kernel32.dll" "system" fn WaitForSingleObject(hhandle : HANDLE, dwmilliseconds : u32) -> WAIT_EVENT); +windows_targets::link!("ole32.dll" "system" fn CoCreateInstance(rclsid : *const GUID, punkouter : * mut core::ffi::c_void, dwclscontext : CLSCTX, riid : *const GUID, ppv : *mut *mut core::ffi::c_void) -> HRESULT); +windows_targets::link!("ole32.dll" "system" fn CoInitializeEx(pvreserved : *const core::ffi::c_void, dwcoinit : u32) -> HRESULT); +windows_targets::link!("oleaut32.dll" "system" fn SysFreeString(bstrstring : BSTR)); +windows_targets::link!("oleaut32.dll" "system" fn SysStringLen(pbstr : BSTR) -> u32); pub type ADVANCED_FEATURE_FLAGS = u16; pub type BOOL = i32; pub type BSTR = *const u16; From c407c89e11bf4bc63de9f1c81882bd44ac42ab16 Mon Sep 17 00:00:00 2001 From: Jiahao XU <30436523+NobodyXu@users.noreply.github.com> Date: Sat, 6 Jul 2024 16:36:41 +1000 Subject: [PATCH 2/7] Add new dep windows-targets v0.52 on windows --- Cargo.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index e870abcf..741b0278 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,6 +28,9 @@ once_cell = { version = "1.19", optional = true } # which is still an issue with `resolver = "1"`. libc = { version = "0.2.62", default-features = false, optional = true } +[target.'cfg(windows)'.dependencies] +windows-targets = "0.52" + [features] parallel = ["dep:libc", "dep:jobserver", "dep:once_cell"] From 6dfd7f6d68e33cccfe62fe468ababab745f6d21a Mon Sep 17 00:00:00 2001 From: Jiahao XU Date: Sun, 7 Jul 2024 00:12:24 +1000 Subject: [PATCH 3/7] Replace `windows_targets::link!` with homebrew `link_macro!` To avoid the additional dependencies and build-script. Signed-off-by: Jiahao XU --- .DS_Store | Bin 0 -> 6148 bytes .bash_history | 42 ++++++++++++++++++ .lesshst | 1 + Cargo.toml | 3 -- TODO.md | 15 +++++++ dev-tools/gen-windows-sys-binding/Cargo.toml | 1 + dev-tools/gen-windows-sys-binding/src/main.rs | 38 +++++++++++++--- src/windows/mod.rs | 2 + src/windows/windows_sys.rs | 38 +++++++++------- src/windows/windows_targets.rs | 19 ++++++++ 10 files changed, 135 insertions(+), 24 deletions(-) create mode 100644 .DS_Store create mode 100644 .bash_history create mode 100644 .lesshst create mode 100644 TODO.md create mode 100644 src/windows/windows_targets.rs diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a68de893885029b0bcb44bd8e4a322bf3e48bb0c GIT binary patch literal 6148 zcmeHKy-EW?5T5l;Jrp4ji&(kXE2c?(#`6Irg`iE$4~dv?!6a4|XQP!qiZ2mj;}eJ= z5o~-5XLi?QH6)&|kr6hEbeG$`*`g9Z}Fb zT8(_E8n-*COm?sWtiWGXfWBQHcAx=g&~v`u&Es1;){dj7(uynS3qG>JTlRXm=f-Q_ z#yd^xY{=7j1Iu5$(1boz9Cp|!q%-Uq2K$BQmu*$U)O*_Tq>}krPCc+o^?1;Q3#dAE zcq2L$O~mHEJ9&6D8jPb8-gMOA^UK7y1U)!K#s<_~?Y;9Fu{v>^dvNsrbaSQlK9w`6 zU|x=0hj%%mIu@~xI_|v(U1#rb_~=IM8glnrYcf$aSnF-=XJ^>_015H4{f+|Iv&n*0 zjXbjgtN<%8R)Ee2iGwgSm}pc-2Ttk=fas%J89uAtjws227#d78q6barrHFc|Fjowr zm!n^rywG5xQ7;FfnDIS^S(qD&Q0(ZJDjh_qk!Mzb6>t^s^v?|S|AYDWe|Hi8Vg*=% zf2Dx%qf%7FEt%e$+8p&-iKC2zjPeqVY6(uJ9jgaw#W@_xFed2%F*KNHL=PJO5l}Ml J#0vbV0-v+TptS%1 literal 0 HcmV?d00001 diff --git a/.bash_history b/.bash_history new file mode 100644 index 00000000..6bff4285 --- /dev/null +++ b/.bash_history @@ -0,0 +1,42 @@ +ls +cd +ls +cargo t +ls target/ +cargo t -- gnu_flag_if_supported +cargo t -- gnu_flag_if_supported +cargo t -- gnu_flag_if_supported +cargo t -- gnu_flag_if_supported +cargo t -- gnu_flag_if_supported +cargo t -- gnu_flag_if_supported -- -nocapture +less +apt install git +apt update && apt install git -y +git status +git diff +cargo t -- gnu_flag_if_supported -- -nocapture +cargo t -- gnu_flag_if_supported -- -nocapture +c++ +cargo t -- gnu_flag_if_supported -- -nocapture +cargo t -- gnu_flag_if_supported -- -nocapture +cargo t -- gnu_flag_if_supported -- -nocapture +cargo t -- gnu_flag_if_supported -- -nocapture +cc +c++ +apt install build-essentials +apt install build-essentials\ +apt install build-essential +c++ +cargo t -- gnu_flag_if_supported -- -nocapture +cc -m64 +gcc -m64 +cd +cargo t +cc -m64 +cargo t +uname -a +gcc -v +gcc --version +rustup target +rustup target list +cargo t --target aarch64-unknown-linux-gnu diff --git a/.lesshst b/.lesshst new file mode 100644 index 00000000..4d1c30b7 --- /dev/null +++ b/.lesshst @@ -0,0 +1 @@ +.less-history-file: diff --git a/Cargo.toml b/Cargo.toml index 741b0278..e870abcf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,9 +28,6 @@ once_cell = { version = "1.19", optional = true } # which is still an issue with `resolver = "1"`. libc = { version = "0.2.62", default-features = false, optional = true } -[target.'cfg(windows)'.dependencies] -windows-targets = "0.52" - [features] parallel = ["dep:libc", "dep:jobserver", "dep:once_cell"] diff --git a/TODO.md b/TODO.md new file mode 100644 index 00000000..80f8b8ab --- /dev/null +++ b/TODO.md @@ -0,0 +1,15 @@ +- Optimize `Build::try_get_compiler` where we call `Build::is_flag_supported` for each + `self.flags_supported`. + Instead, create a new function `Build::filter_supported_flags` to avoid the repeated + `cc::Build` instance creation. +- Also add parallel support to `Build::filter_supported_flags`/`Build::try_get_compiler`. + optimize for single flag input. +- Add new fn `Build::flag_if_supported_with_fallbacks`: https://github.com/rust-lang/cc-rs/pull/774 +- optimize `Build::compile_objects` for only compiling single object and also add unit test for multi + objects compilation. + +- Add regression test for parallel `compile_objects` with very large number of + source files + +- Fix race condition in `Build::ensure_check_file` +- Update `Build::fix_env_for_apple_os` to use auto generated stuff 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 7efb1f86..010e1a40 100644 --- a/dev-tools/gen-windows-sys-binding/src/main.rs +++ b/dev-tools/gen-windows-sys-binding/src/main.rs @@ -3,9 +3,11 @@ use std::{ fs, - io::{self, Read, Write}, + io::{BufWriter, Read as _, 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. // @@ -17,7 +19,7 @@ const PRELUDE: &str = r#"// This file is autogenerated. // ``` "#; -fn main() -> io::Result<()> { +fn main() { let manifest_dir = env!("CARGO_MANIFEST_DIR"); let temp_file = tempfile::Builder::new() .suffix(".rs") @@ -55,10 +57,36 @@ fn main() -> io::Result<()> { .read_to_string(&mut bindings) .expect("failed to read temp windows_sys.rs"); + let bindings = bindings.replace( + "windows_targets::link!", + "super::windows_targets::link_macro!", + ); + let mut f = fs::File::create(format!("{manifest_dir}/../../src/windows/windows_sys.rs")) + .map(BufWriter::new) .expect("failed to create windows_sys.rs"); - f.write_all(PRELUDE.as_bytes())?; - f.write_all(bindings.as_bytes())?; - Ok(()) + write!(&mut f, "{PRELUDE}\n{bindings}\n").unwrap(); + + let mut dll_names: Vec<&str> = Regex::new(r#"link_macro!\("(.*)\.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.into_inner().unwrap().sync_all().unwrap(); } diff --git a/src/windows/mod.rs b/src/windows/mod.rs index 9b6f297e..ccf22b0e 100644 --- a/src/windows/mod.rs +++ b/src/windows/mod.rs @@ -6,6 +6,8 @@ pub mod find_tools; #[cfg(windows)] pub(crate) mod windows_sys; +#[cfg(windows)] +mod windows_targets; #[cfg(windows)] mod registry; diff --git a/src/windows/windows_sys.rs b/src/windows/windows_sys.rs index 2fb15f78..778664b5 100644 --- a/src/windows/windows_sys.rs +++ b/src/windows/windows_sys.rs @@ -6,6 +6,7 @@ // cd generate-windows-sys/ // cargo run // ``` + // Bindings generated by `windows-bindgen` 0.58.0 #![allow( @@ -15,22 +16,22 @@ dead_code, clippy::all )] -windows_targets::link!("advapi32.dll" "system" fn RegCloseKey(hkey : HKEY) -> WIN32_ERROR); -windows_targets::link!("advapi32.dll" "system" fn RegEnumKeyExW(hkey : HKEY, dwindex : u32, lpname : PWSTR, lpcchname : *mut u32, lpreserved : *const u32, lpclass : PWSTR, lpcchclass : *mut u32, lpftlastwritetime : *mut FILETIME) -> WIN32_ERROR); -windows_targets::link!("advapi32.dll" "system" fn RegOpenKeyExW(hkey : HKEY, lpsubkey : PCWSTR, uloptions : u32, samdesired : REG_SAM_FLAGS, phkresult : *mut HKEY) -> WIN32_ERROR); -windows_targets::link!("advapi32.dll" "system" fn RegQueryValueExW(hkey : HKEY, lpvaluename : PCWSTR, lpreserved : *const u32, lptype : *mut REG_VALUE_TYPE, lpdata : *mut u8, lpcbdata : *mut u32) -> WIN32_ERROR); -windows_targets::link!("kernel32.dll" "system" fn FreeLibrary(hlibmodule : HMODULE) -> BOOL); -windows_targets::link!("kernel32.dll" "system" fn GetMachineTypeAttributes(machine : u16, machinetypeattributes : *mut MACHINE_ATTRIBUTES) -> HRESULT); -windows_targets::link!("kernel32.dll" "system" fn GetProcAddress(hmodule : HMODULE, lpprocname : PCSTR) -> FARPROC); -windows_targets::link!("kernel32.dll" "system" fn LoadLibraryA(lplibfilename : PCSTR) -> HMODULE); -windows_targets::link!("kernel32.dll" "system" fn OpenSemaphoreA(dwdesiredaccess : u32, binherithandle : BOOL, lpname : PCSTR) -> HANDLE); -windows_targets::link!("kernel32.dll" "system" fn PeekNamedPipe(hnamedpipe : HANDLE, lpbuffer : *mut core::ffi::c_void, nbuffersize : u32, lpbytesread : *mut u32, lptotalbytesavail : *mut u32, lpbytesleftthismessage : *mut u32) -> BOOL); -windows_targets::link!("kernel32.dll" "system" fn ReleaseSemaphore(hsemaphore : HANDLE, lreleasecount : i32, lppreviouscount : *mut i32) -> BOOL); -windows_targets::link!("kernel32.dll" "system" fn WaitForSingleObject(hhandle : HANDLE, dwmilliseconds : u32) -> WAIT_EVENT); -windows_targets::link!("ole32.dll" "system" fn CoCreateInstance(rclsid : *const GUID, punkouter : * mut core::ffi::c_void, dwclscontext : CLSCTX, riid : *const GUID, ppv : *mut *mut core::ffi::c_void) -> HRESULT); -windows_targets::link!("ole32.dll" "system" fn CoInitializeEx(pvreserved : *const core::ffi::c_void, dwcoinit : u32) -> HRESULT); -windows_targets::link!("oleaut32.dll" "system" fn SysFreeString(bstrstring : BSTR)); -windows_targets::link!("oleaut32.dll" "system" fn SysStringLen(pbstr : BSTR) -> u32); +super::windows_targets::link_macro!("advapi32.dll" "system" fn RegCloseKey(hkey : HKEY) -> WIN32_ERROR); +super::windows_targets::link_macro!("advapi32.dll" "system" fn RegEnumKeyExW(hkey : HKEY, dwindex : u32, lpname : PWSTR, lpcchname : *mut u32, lpreserved : *const u32, lpclass : PWSTR, lpcchclass : *mut u32, lpftlastwritetime : *mut FILETIME) -> WIN32_ERROR); +super::windows_targets::link_macro!("advapi32.dll" "system" fn RegOpenKeyExW(hkey : HKEY, lpsubkey : PCWSTR, uloptions : u32, samdesired : REG_SAM_FLAGS, phkresult : *mut HKEY) -> WIN32_ERROR); +super::windows_targets::link_macro!("advapi32.dll" "system" fn RegQueryValueExW(hkey : HKEY, lpvaluename : PCWSTR, lpreserved : *const u32, lptype : *mut REG_VALUE_TYPE, lpdata : *mut u8, lpcbdata : *mut u32) -> WIN32_ERROR); +super::windows_targets::link_macro!("kernel32.dll" "system" fn FreeLibrary(hlibmodule : HMODULE) -> BOOL); +super::windows_targets::link_macro!("kernel32.dll" "system" fn GetMachineTypeAttributes(machine : u16, machinetypeattributes : *mut MACHINE_ATTRIBUTES) -> HRESULT); +super::windows_targets::link_macro!("kernel32.dll" "system" fn GetProcAddress(hmodule : HMODULE, lpprocname : PCSTR) -> FARPROC); +super::windows_targets::link_macro!("kernel32.dll" "system" fn LoadLibraryA(lplibfilename : PCSTR) -> HMODULE); +super::windows_targets::link_macro!("kernel32.dll" "system" fn OpenSemaphoreA(dwdesiredaccess : u32, binherithandle : BOOL, lpname : PCSTR) -> HANDLE); +super::windows_targets::link_macro!("kernel32.dll" "system" fn PeekNamedPipe(hnamedpipe : HANDLE, lpbuffer : *mut core::ffi::c_void, nbuffersize : u32, lpbytesread : *mut u32, lptotalbytesavail : *mut u32, lpbytesleftthismessage : *mut u32) -> BOOL); +super::windows_targets::link_macro!("kernel32.dll" "system" fn ReleaseSemaphore(hsemaphore : HANDLE, lreleasecount : i32, lppreviouscount : *mut i32) -> BOOL); +super::windows_targets::link_macro!("kernel32.dll" "system" fn WaitForSingleObject(hhandle : HANDLE, dwmilliseconds : u32) -> WAIT_EVENT); +super::windows_targets::link_macro!("ole32.dll" "system" fn CoCreateInstance(rclsid : *const GUID, punkouter : * mut core::ffi::c_void, dwclscontext : CLSCTX, riid : *const GUID, ppv : *mut *mut core::ffi::c_void) -> HRESULT); +super::windows_targets::link_macro!("ole32.dll" "system" fn CoInitializeEx(pvreserved : *const core::ffi::c_void, dwcoinit : u32) -> HRESULT); +super::windows_targets::link_macro!("oleaut32.dll" "system" fn SysFreeString(bstrstring : BSTR)); +super::windows_targets::link_macro!("oleaut32.dll" "system" fn SysStringLen(pbstr : BSTR) -> u32); pub type ADVANCED_FEATURE_FLAGS = u16; pub type BOOL = i32; pub type BSTR = *const u16; @@ -113,3 +114,8 @@ pub const WAIT_FAILED: WAIT_EVENT = 4294967295u32; 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" {} \ No newline at end of file diff --git a/src/windows/windows_targets.rs b/src/windows/windows_targets.rs new file mode 100644 index 00000000..f65af87b --- /dev/null +++ b/src/windows/windows_targets.rs @@ -0,0 +1,19 @@ +//! Provides the `link!` macro used by the generated windows bindings. +//! +//! This is a simple wrapper around an `extern` block with a `#[link]` attribute. +//! It's very roughly equivalent to the windows-targets crate. + +macro_rules! link_macro { + ($library:literal $abi:literal $($link_name:literal)? $(#[$doc:meta])? fn $($function:tt)*) => ( + // Note: the windows-targets crate uses a pre-built Windows.lib import library which we don't + // 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. + #[link(name = "kernel32")] + extern $abi { + $(#[link_name=$link_name])? + pub fn $($function)*; + } + ) +} +pub(crate) use link_macro; From 0b408d321dc1ba592cd070e8546ac016e0e15632 Mon Sep 17 00:00:00 2001 From: Jiahao XU Date: Sun, 7 Jul 2024 00:14:18 +1000 Subject: [PATCH 4/7] Fix fmt Signed-off-by: Jiahao XU --- dev-tools/gen-windows-sys-binding/src/main.rs | 1 + src/windows/windows_sys.rs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/dev-tools/gen-windows-sys-binding/src/main.rs b/dev-tools/gen-windows-sys-binding/src/main.rs index 010e1a40..4ae357b4 100644 --- a/dev-tools/gen-windows-sys-binding/src/main.rs +++ b/dev-tools/gen-windows-sys-binding/src/main.rs @@ -86,6 +86,7 @@ fn main() { } f.write_all(r#"extern "C" {}"#.as_bytes()).unwrap(); + f.write_all("\n".as_bytes()).unwrap(); } f.into_inner().unwrap().sync_all().unwrap(); diff --git a/src/windows/windows_sys.rs b/src/windows/windows_sys.rs index 778664b5..410c8843 100644 --- a/src/windows/windows_sys.rs +++ b/src/windows/windows_sys.rs @@ -118,4 +118,4 @@ pub type WIN32_ERROR = u32; #[link(name = "advapi32")] #[link(name = "ole32")] #[link(name = "oleaut32")] -extern "C" {} \ No newline at end of file +extern "C" {} From f6ed3dec6b4a1d73a5defd79f1458c2133805a88 Mon Sep 17 00:00:00 2001 From: Jiahao XU Date: Sun, 7 Jul 2024 00:17:32 +1000 Subject: [PATCH 5/7] Rm accidentally commited files Signed-off-by: Jiahao XU --- .DS_Store | Bin 6148 -> 0 bytes .bash_history | 42 ------------------------------------------ .lesshst | 1 - TODO.md | 15 --------------- 4 files changed, 58 deletions(-) delete mode 100644 .DS_Store delete mode 100644 .bash_history delete mode 100644 .lesshst delete mode 100644 TODO.md diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index a68de893885029b0bcb44bd8e4a322bf3e48bb0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKy-EW?5T5l;Jrp4ji&(kXE2c?(#`6Irg`iE$4~dv?!6a4|XQP!qiZ2mj;}eJ= z5o~-5XLi?QH6)&|kr6hEbeG$`*`g9Z}Fb zT8(_E8n-*COm?sWtiWGXfWBQHcAx=g&~v`u&Es1;){dj7(uynS3qG>JTlRXm=f-Q_ z#yd^xY{=7j1Iu5$(1boz9Cp|!q%-Uq2K$BQmu*$U)O*_Tq>}krPCc+o^?1;Q3#dAE zcq2L$O~mHEJ9&6D8jPb8-gMOA^UK7y1U)!K#s<_~?Y;9Fu{v>^dvNsrbaSQlK9w`6 zU|x=0hj%%mIu@~xI_|v(U1#rb_~=IM8glnrYcf$aSnF-=XJ^>_015H4{f+|Iv&n*0 zjXbjgtN<%8R)Ee2iGwgSm}pc-2Ttk=fas%J89uAtjws227#d78q6barrHFc|Fjowr zm!n^rywG5xQ7;FfnDIS^S(qD&Q0(ZJDjh_qk!Mzb6>t^s^v?|S|AYDWe|Hi8Vg*=% zf2Dx%qf%7FEt%e$+8p&-iKC2zjPeqVY6(uJ9jgaw#W@_xFed2%F*KNHL=PJO5l}Ml J#0vbV0-v+TptS%1 diff --git a/.bash_history b/.bash_history deleted file mode 100644 index 6bff4285..00000000 --- a/.bash_history +++ /dev/null @@ -1,42 +0,0 @@ -ls -cd -ls -cargo t -ls target/ -cargo t -- gnu_flag_if_supported -cargo t -- gnu_flag_if_supported -cargo t -- gnu_flag_if_supported -cargo t -- gnu_flag_if_supported -cargo t -- gnu_flag_if_supported -cargo t -- gnu_flag_if_supported -- -nocapture -less -apt install git -apt update && apt install git -y -git status -git diff -cargo t -- gnu_flag_if_supported -- -nocapture -cargo t -- gnu_flag_if_supported -- -nocapture -c++ -cargo t -- gnu_flag_if_supported -- -nocapture -cargo t -- gnu_flag_if_supported -- -nocapture -cargo t -- gnu_flag_if_supported -- -nocapture -cargo t -- gnu_flag_if_supported -- -nocapture -cc -c++ -apt install build-essentials -apt install build-essentials\ -apt install build-essential -c++ -cargo t -- gnu_flag_if_supported -- -nocapture -cc -m64 -gcc -m64 -cd -cargo t -cc -m64 -cargo t -uname -a -gcc -v -gcc --version -rustup target -rustup target list -cargo t --target aarch64-unknown-linux-gnu diff --git a/.lesshst b/.lesshst deleted file mode 100644 index 4d1c30b7..00000000 --- a/.lesshst +++ /dev/null @@ -1 +0,0 @@ -.less-history-file: diff --git a/TODO.md b/TODO.md deleted file mode 100644 index 80f8b8ab..00000000 --- a/TODO.md +++ /dev/null @@ -1,15 +0,0 @@ -- Optimize `Build::try_get_compiler` where we call `Build::is_flag_supported` for each - `self.flags_supported`. - Instead, create a new function `Build::filter_supported_flags` to avoid the repeated - `cc::Build` instance creation. -- Also add parallel support to `Build::filter_supported_flags`/`Build::try_get_compiler`. - optimize for single flag input. -- Add new fn `Build::flag_if_supported_with_fallbacks`: https://github.com/rust-lang/cc-rs/pull/774 -- optimize `Build::compile_objects` for only compiling single object and also add unit test for multi - objects compilation. - -- Add regression test for parallel `compile_objects` with very large number of - source files - -- Fix race condition in `Build::ensure_check_file` -- Update `Build::fix_env_for_apple_os` to use auto generated stuff From f394c9f0d445a4d87ee6572a2f7f091255ee9c90 Mon Sep 17 00:00:00 2001 From: Jiahao XU Date: Sun, 7 Jul 2024 00:22:37 +1000 Subject: [PATCH 6/7] Refactor `gen-windows-sys-binding` use `fs::read_to_string` Signed-off-by: Jiahao XU --- dev-tools/gen-windows-sys-binding/src/main.rs | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/dev-tools/gen-windows-sys-binding/src/main.rs b/dev-tools/gen-windows-sys-binding/src/main.rs index 4ae357b4..5727cdc5 100644 --- a/dev-tools/gen-windows-sys-binding/src/main.rs +++ b/dev-tools/gen-windows-sys-binding/src/main.rs @@ -3,7 +3,7 @@ use std::{ fs, - io::{BufWriter, Read as _, Write as _}, + io::{BufWriter, Write as _}, }; use regex::Regex; @@ -51,16 +51,12 @@ fn main() { // Generate bindings. windows_bindgen::bindgen(&args).expect("running bindgen failed"); - let mut bindings = String::new(); - fs::File::open(temp_file.path()) - .expect("failed to open temp windows_sys.rs") - .read_to_string(&mut bindings) - .expect("failed to read temp windows_sys.rs"); - - let bindings = bindings.replace( - "windows_targets::link!", - "super::windows_targets::link_macro!", - ); + let bindings = fs::read_to_string(temp_file.path()) + .expect("failed to read temp windows_sys.rs") + .replace( + "windows_targets::link!", + "super::windows_targets::link_macro!", + ); let mut f = fs::File::create(format!("{manifest_dir}/../../src/windows/windows_sys.rs")) .map(BufWriter::new) From cbefede4692158acaf58d4dd351ddaecbde062cd Mon Sep 17 00:00:00 2001 From: Jiahao XU Date: Sun, 7 Jul 2024 14:17:58 +1000 Subject: [PATCH 7/7] Simplify gen-windows-sys-binding Avoid text replacing Signed-off-by: Jiahao XU --- dev-tools/gen-windows-sys-binding/src/main.rs | 17 +++++----- src/windows/windows_sys.rs | 34 +++++++++---------- src/windows/windows_targets.rs | 2 +- 3 files changed, 26 insertions(+), 27 deletions(-) diff --git a/dev-tools/gen-windows-sys-binding/src/main.rs b/dev-tools/gen-windows-sys-binding/src/main.rs index 5727cdc5..0b29ff61 100644 --- a/dev-tools/gen-windows-sys-binding/src/main.rs +++ b/dev-tools/gen-windows-sys-binding/src/main.rs @@ -16,8 +16,7 @@ const PRELUDE: &str = r#"// This file is autogenerated. // ``` // cd generate-windows-sys/ // cargo run -// ``` -"#; +// ```"#; fn main() { let manifest_dir = env!("CARGO_MANIFEST_DIR"); @@ -51,12 +50,8 @@ fn main() { // Generate bindings. windows_bindgen::bindgen(&args).expect("running bindgen failed"); - let bindings = fs::read_to_string(temp_file.path()) - .expect("failed to read temp windows_sys.rs") - .replace( - "windows_targets::link!", - "super::windows_targets::link_macro!", - ); + let bindings = + fs::read_to_string(temp_file.path()).expect("failed to read temp windows_sys.rs"); let mut f = fs::File::create(format!("{manifest_dir}/../../src/windows/windows_sys.rs")) .map(BufWriter::new) @@ -64,7 +59,7 @@ fn main() { write!(&mut f, "{PRELUDE}\n{bindings}\n").unwrap(); - let mut dll_names: Vec<&str> = Regex::new(r#"link_macro!\("(.*)\.dll""#) + let mut dll_names: Vec<&str> = Regex::new(r#"link!\("(.*)\.dll""#) .unwrap() .captures_iter(&bindings) .map(|caps| caps.extract().1) @@ -85,5 +80,9 @@ fn main() { 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(); + f.into_inner().unwrap().sync_all().unwrap(); } diff --git a/src/windows/windows_sys.rs b/src/windows/windows_sys.rs index 410c8843..fd177e65 100644 --- a/src/windows/windows_sys.rs +++ b/src/windows/windows_sys.rs @@ -6,7 +6,6 @@ // cd generate-windows-sys/ // cargo run // ``` - // Bindings generated by `windows-bindgen` 0.58.0 #![allow( @@ -16,22 +15,22 @@ dead_code, clippy::all )] -super::windows_targets::link_macro!("advapi32.dll" "system" fn RegCloseKey(hkey : HKEY) -> WIN32_ERROR); -super::windows_targets::link_macro!("advapi32.dll" "system" fn RegEnumKeyExW(hkey : HKEY, dwindex : u32, lpname : PWSTR, lpcchname : *mut u32, lpreserved : *const u32, lpclass : PWSTR, lpcchclass : *mut u32, lpftlastwritetime : *mut FILETIME) -> WIN32_ERROR); -super::windows_targets::link_macro!("advapi32.dll" "system" fn RegOpenKeyExW(hkey : HKEY, lpsubkey : PCWSTR, uloptions : u32, samdesired : REG_SAM_FLAGS, phkresult : *mut HKEY) -> WIN32_ERROR); -super::windows_targets::link_macro!("advapi32.dll" "system" fn RegQueryValueExW(hkey : HKEY, lpvaluename : PCWSTR, lpreserved : *const u32, lptype : *mut REG_VALUE_TYPE, lpdata : *mut u8, lpcbdata : *mut u32) -> WIN32_ERROR); -super::windows_targets::link_macro!("kernel32.dll" "system" fn FreeLibrary(hlibmodule : HMODULE) -> BOOL); -super::windows_targets::link_macro!("kernel32.dll" "system" fn GetMachineTypeAttributes(machine : u16, machinetypeattributes : *mut MACHINE_ATTRIBUTES) -> HRESULT); -super::windows_targets::link_macro!("kernel32.dll" "system" fn GetProcAddress(hmodule : HMODULE, lpprocname : PCSTR) -> FARPROC); -super::windows_targets::link_macro!("kernel32.dll" "system" fn LoadLibraryA(lplibfilename : PCSTR) -> HMODULE); -super::windows_targets::link_macro!("kernel32.dll" "system" fn OpenSemaphoreA(dwdesiredaccess : u32, binherithandle : BOOL, lpname : PCSTR) -> HANDLE); -super::windows_targets::link_macro!("kernel32.dll" "system" fn PeekNamedPipe(hnamedpipe : HANDLE, lpbuffer : *mut core::ffi::c_void, nbuffersize : u32, lpbytesread : *mut u32, lptotalbytesavail : *mut u32, lpbytesleftthismessage : *mut u32) -> BOOL); -super::windows_targets::link_macro!("kernel32.dll" "system" fn ReleaseSemaphore(hsemaphore : HANDLE, lreleasecount : i32, lppreviouscount : *mut i32) -> BOOL); -super::windows_targets::link_macro!("kernel32.dll" "system" fn WaitForSingleObject(hhandle : HANDLE, dwmilliseconds : u32) -> WAIT_EVENT); -super::windows_targets::link_macro!("ole32.dll" "system" fn CoCreateInstance(rclsid : *const GUID, punkouter : * mut core::ffi::c_void, dwclscontext : CLSCTX, riid : *const GUID, ppv : *mut *mut core::ffi::c_void) -> HRESULT); -super::windows_targets::link_macro!("ole32.dll" "system" fn CoInitializeEx(pvreserved : *const core::ffi::c_void, dwcoinit : u32) -> HRESULT); -super::windows_targets::link_macro!("oleaut32.dll" "system" fn SysFreeString(bstrstring : BSTR)); -super::windows_targets::link_macro!("oleaut32.dll" "system" fn SysStringLen(pbstr : BSTR) -> u32); +windows_targets::link!("advapi32.dll" "system" fn RegCloseKey(hkey : HKEY) -> WIN32_ERROR); +windows_targets::link!("advapi32.dll" "system" fn RegEnumKeyExW(hkey : HKEY, dwindex : u32, lpname : PWSTR, lpcchname : *mut u32, lpreserved : *const u32, lpclass : PWSTR, lpcchclass : *mut u32, lpftlastwritetime : *mut FILETIME) -> WIN32_ERROR); +windows_targets::link!("advapi32.dll" "system" fn RegOpenKeyExW(hkey : HKEY, lpsubkey : PCWSTR, uloptions : u32, samdesired : REG_SAM_FLAGS, phkresult : *mut HKEY) -> WIN32_ERROR); +windows_targets::link!("advapi32.dll" "system" fn RegQueryValueExW(hkey : HKEY, lpvaluename : PCWSTR, lpreserved : *const u32, lptype : *mut REG_VALUE_TYPE, lpdata : *mut u8, lpcbdata : *mut u32) -> WIN32_ERROR); +windows_targets::link!("kernel32.dll" "system" fn FreeLibrary(hlibmodule : HMODULE) -> BOOL); +windows_targets::link!("kernel32.dll" "system" fn GetMachineTypeAttributes(machine : u16, machinetypeattributes : *mut MACHINE_ATTRIBUTES) -> HRESULT); +windows_targets::link!("kernel32.dll" "system" fn GetProcAddress(hmodule : HMODULE, lpprocname : PCSTR) -> FARPROC); +windows_targets::link!("kernel32.dll" "system" fn LoadLibraryA(lplibfilename : PCSTR) -> HMODULE); +windows_targets::link!("kernel32.dll" "system" fn OpenSemaphoreA(dwdesiredaccess : u32, binherithandle : BOOL, lpname : PCSTR) -> HANDLE); +windows_targets::link!("kernel32.dll" "system" fn PeekNamedPipe(hnamedpipe : HANDLE, lpbuffer : *mut core::ffi::c_void, nbuffersize : u32, lpbytesread : *mut u32, lptotalbytesavail : *mut u32, lpbytesleftthismessage : *mut u32) -> BOOL); +windows_targets::link!("kernel32.dll" "system" fn ReleaseSemaphore(hsemaphore : HANDLE, lreleasecount : i32, lppreviouscount : *mut i32) -> BOOL); +windows_targets::link!("kernel32.dll" "system" fn WaitForSingleObject(hhandle : HANDLE, dwmilliseconds : u32) -> WAIT_EVENT); +windows_targets::link!("ole32.dll" "system" fn CoCreateInstance(rclsid : *const GUID, punkouter : * mut core::ffi::c_void, dwclscontext : CLSCTX, riid : *const GUID, ppv : *mut *mut core::ffi::c_void) -> HRESULT); +windows_targets::link!("ole32.dll" "system" fn CoInitializeEx(pvreserved : *const core::ffi::c_void, dwcoinit : u32) -> HRESULT); +windows_targets::link!("oleaut32.dll" "system" fn SysFreeString(bstrstring : BSTR)); +windows_targets::link!("oleaut32.dll" "system" fn SysStringLen(pbstr : BSTR) -> u32); pub type ADVANCED_FEATURE_FLAGS = u16; pub type BOOL = i32; pub type BSTR = *const u16; @@ -119,3 +118,4 @@ pub type WIN32_ERROR = u32; #[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 f65af87b..d08affe0 100644 --- a/src/windows/windows_targets.rs +++ b/src/windows/windows_targets.rs @@ -16,4 +16,4 @@ macro_rules! link_macro { } ) } -pub(crate) use link_macro; +pub(crate) use link_macro as link;