From 202170951dbbdc12348f6f70ae7bf280ede7a7ff Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Wed, 24 Aug 2022 10:15:41 +0200 Subject: [PATCH] Link C/C++ operators using `LINK.EXE` on Windows --- examples/c++-dataflow/run.rs | 34 +++++++++++++++++++++++++--------- examples/c-dataflow/run.rs | 28 ++++++++++++++++++++-------- 2 files changed, 45 insertions(+), 17 deletions(-) diff --git a/examples/c++-dataflow/run.rs b/examples/c++-dataflow/run.rs index 7bdf71a5..e374b1ef 100644 --- a/examples/c++-dataflow/run.rs +++ b/examples/c++-dataflow/run.rs @@ -137,16 +137,32 @@ async fn build_cxx_operator(path: &Path, out_name: &str) -> eyre::Result<()> { bail!("failed to compile cxx operator"); }; - let mut link = tokio::process::Command::new("clang++"); - link.arg("-shared").arg(&object_file_path); - link.arg("-o") - .arg(Path::new("../build").join(library_filename(out_name))); - if let Some(parent) = path.parent() { - link.current_dir(parent); + let out_path = Path::new("../build").join(library_filename(out_name)); + #[cfg(unix)] + { + let mut link = tokio::process::Command::new("clang++"); + link.arg("-shared").arg(&object_file_path); + link.arg("-o").arg(out_path); + if let Some(parent) = path.parent() { + link.current_dir(parent); + } + if !link.status().await?.success() { + bail!("failed to create shared library from cxx operator (c api)"); + }; + } + #[cfg(windows)] + { + let mut link = tokio::process::Command::new("LINK.EXE"); + link.arg("/DLL"); + link.arg(format!("/OUT:{}", out_path.display())); + link.arg(&object_file_path); + if let Some(parent) = path.parent() { + link.current_dir(parent); + } + if !link.status().await?.success() { + bail!("failed to link c++ operator (c api)"); + }; } - if !link.status().await?.success() { - bail!("failed to create shared library from cxx operator (c api)"); - }; Ok(()) } diff --git a/examples/c-dataflow/run.rs b/examples/c-dataflow/run.rs index 2e195e42..a51c3b51 100644 --- a/examples/c-dataflow/run.rs +++ b/examples/c-dataflow/run.rs @@ -129,14 +129,26 @@ async fn build_c_operator(root: &Path) -> eyre::Result<()> { bail!("failed to compile c operator"); }; - let mut link = tokio::process::Command::new("clang"); - link.arg("-shared").arg("build/operator.o"); - link.arg("-o") - .arg(Path::new("build").join(library_filename("operator"))); - if !link.status().await?.success() { - bail!("failed to link c operator"); - }; - + let out_path = Path::new("build").join(library_filename("operator")); + #[cfg(unix)] + { + let mut link = tokio::process::Command::new("clang"); + link.arg("-shared").arg("build/operator.o"); + link.arg("-o").arg(out_path); + if !link.status().await?.success() { + bail!("failed to link c operator"); + }; + } + #[cfg(windows)] + { + let mut link = tokio::process::Command::new("LINK.EXE"); + link.arg("/DLL"); + link.arg(format!("/OUT:{}", out_path.display())); + link.arg("build/operator.o"); + if !link.status().await?.success() { + bail!("failed to link c operator"); + }; + } Ok(()) }