diff --git a/crates/libs/cppwinrt/Cargo.toml b/crates/libs/cppwinrt/Cargo.toml new file mode 100644 index 0000000000..3d705640b9 --- /dev/null +++ b/crates/libs/cppwinrt/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "cppwinrt" +version = "0.1.0" +authors = ["Microsoft"] +edition = "2021" +rust-version = "1.60" +license = "MIT OR Apache-2.0" +description = "C++/WinRT" +repository = "https://github.com/microsoft/windows-rs" +readme = "readme.md" +categories = ["os::windows-apis"] + +[lints] +workspace = true + +[package.metadata.docs.rs] +default-target = "x86_64-pc-windows-msvc" +targets = [] diff --git a/crates/libs/cppwinrt/cppwinrt.exe b/crates/libs/cppwinrt/cppwinrt.exe new file mode 100644 index 0000000000..7ece3873ef Binary files /dev/null and b/crates/libs/cppwinrt/cppwinrt.exe differ diff --git a/crates/libs/cppwinrt/readme.md b/crates/libs/cppwinrt/readme.md new file mode 100644 index 0000000000..d0886d9241 --- /dev/null +++ b/crates/libs/cppwinrt/readme.md @@ -0,0 +1,31 @@ +## C++/WinRT + +The [cppwinrt](https://crates.io/crates/cppwinrt) crate bundles the C++/WinRT compiler for use in Rust. + +* [Getting started](https://kennykerr.ca/rust-getting-started/) +* [Samples](https://github.com/microsoft/windows-rs/tree/0.56.0/crates/samples) +* [Releases](https://github.com/microsoft/windows-rs/releases) + +Start by adding the following to your Cargo.toml file: + +```toml +[dependencies.cppwinrt] +version = "0.1" +``` + +Use `cppwinrt` function as needed: + +```rust +fn main() { + match cppwinrt::cppwinrt(["-help"]) { + Ok(output) => println!("{output}"), + Err(error) => println!("{error}"), + }; +} +``` + +Source: + +* +* +* Version 2.0.240405.15 diff --git a/crates/libs/cppwinrt/src/lib.rs b/crates/libs/cppwinrt/src/lib.rs new file mode 100644 index 0000000000..1819774a38 --- /dev/null +++ b/crates/libs/cppwinrt/src/lib.rs @@ -0,0 +1,43 @@ +/*! +Learn more about Rust for Windows here: +*/ + +const VERSION: &str = "2.0.240405.15"; + +/// Calls the C++/WinRT compiler with the given arguments. +/// +/// Use `cppwinrt["-help"]` for available options. +pub fn cppwinrt(args: I) -> Result +where + I: IntoIterator, + S: AsRef, +{ + let mut path = std::env::temp_dir(); + path.push(format!("cppwinrt-{VERSION}.exe")); + + std::fs::write(&path, std::include_bytes!("../cppwinrt.exe")).unwrap(); + let mut command = std::process::Command::new(&path); + command.args(args); + let output = command.output().expect("failed to run cppwinrt"); + _ = std::fs::remove_file(path); + + if output.status.success() { + Ok(String::from_utf8_lossy(&output.stdout).to_string()) + } else { + Err(String::from_utf8_lossy(&output.stderr).to_string()) + } +} + +#[cfg(test)] +mod tests { + use crate::*; + + #[test] + fn test() { + let ok = cppwinrt(["-help"]).unwrap(); + assert!(ok.contains(VERSION), "unexpected version"); + + let err = cppwinrt(["-invalid"]).unwrap_err(); + assert!(err.contains("'-invalid' is not supported")); + } +} diff --git a/crates/tests/readme/Cargo.toml b/crates/tests/readme/Cargo.toml index 1ead2a6a89..2e6dc52009 100644 --- a/crates/tests/readme/Cargo.toml +++ b/crates/tests/readme/Cargo.toml @@ -37,3 +37,6 @@ path = "../../libs/registry" [dev-dependencies.windows-version] path = "../../libs/version" + +[dev-dependencies.cppwinrt] +path = "../../libs/cppwinrt" diff --git a/crates/tests/readme/src/lib.rs b/crates/tests/readme/src/lib.rs index e1d6bf36a6..6a1bd9cb79 100644 --- a/crates/tests/readme/src/lib.rs +++ b/crates/tests/readme/src/lib.rs @@ -6,3 +6,4 @@ #![doc = include_str!("../../../../crates/libs/targets/readme.md")] #![doc = include_str!("../../../../crates/libs/version/readme.md")] #![doc = include_str!("../../../../crates/libs/windows/readme.md")] +#![doc = include_str!("../../../../crates/libs/cppwinrt/readme.md")]