You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. use dora_tracing::set_up_tracing;
  2. use eyre::{bail, Context};
  3. use std::{
  4. env::consts::{DLL_PREFIX, DLL_SUFFIX, EXE_SUFFIX},
  5. path::Path,
  6. };
  7. #[tokio::main]
  8. async fn main() -> eyre::Result<()> {
  9. set_up_tracing("c-dataflow-runner").wrap_err("failed to set up tracing")?;
  10. let root = Path::new(env!("CARGO_MANIFEST_DIR"));
  11. std::env::set_current_dir(root.join(file!()).parent().unwrap())
  12. .wrap_err("failed to set working dir")?;
  13. tokio::fs::create_dir_all("build").await?;
  14. build_package("dora-node-api-c").await?;
  15. build_c_node(root, "node.c", "c_node").await?;
  16. build_c_node(root, "sink.c", "c_sink").await?;
  17. build_package("dora-operator-api-c").await?;
  18. build_c_operator(root).await?;
  19. let dataflow = Path::new("dataflow.yml").to_owned();
  20. run_dataflow(&dataflow).await?;
  21. Ok(())
  22. }
  23. async fn build_package(package: &str) -> eyre::Result<()> {
  24. let cargo = std::env::var("CARGO").unwrap();
  25. let mut cmd = tokio::process::Command::new(&cargo);
  26. cmd.arg("build");
  27. cmd.arg("--package").arg(package);
  28. if !cmd.status().await?.success() {
  29. bail!("failed to build {package}");
  30. };
  31. Ok(())
  32. }
  33. async fn run_dataflow(dataflow: &Path) -> eyre::Result<()> {
  34. let cargo = std::env::var("CARGO").unwrap();
  35. let mut cmd = tokio::process::Command::new(&cargo);
  36. cmd.arg("run");
  37. cmd.arg("--package").arg("dora-cli");
  38. cmd.arg("--")
  39. .arg("daemon")
  40. .arg("--run-dataflow")
  41. .arg(dataflow);
  42. if !cmd.status().await?.success() {
  43. bail!("failed to run dataflow");
  44. };
  45. Ok(())
  46. }
  47. async fn build_c_node(root: &Path, name: &str, out_name: &str) -> eyre::Result<()> {
  48. let mut clang = tokio::process::Command::new("clang");
  49. clang.arg(name);
  50. clang.arg("-l").arg("dora_node_api_c");
  51. #[cfg(target_os = "linux")]
  52. {
  53. clang.arg("-l").arg("m");
  54. clang.arg("-l").arg("rt");
  55. clang.arg("-l").arg("dl");
  56. clang.arg("-pthread");
  57. }
  58. #[cfg(target_os = "windows")]
  59. {
  60. clang.arg("-ladvapi32");
  61. clang.arg("-luserenv");
  62. clang.arg("-lkernel32");
  63. clang.arg("-lws2_32");
  64. clang.arg("-lbcrypt");
  65. clang.arg("-lncrypt");
  66. clang.arg("-lschannel");
  67. clang.arg("-lntdll");
  68. clang.arg("-liphlpapi");
  69. clang.arg("-lcfgmgr32");
  70. clang.arg("-lcredui");
  71. clang.arg("-lcrypt32");
  72. clang.arg("-lcryptnet");
  73. clang.arg("-lfwpuclnt");
  74. clang.arg("-lgdi32");
  75. clang.arg("-lmsimg32");
  76. clang.arg("-lmswsock");
  77. clang.arg("-lole32");
  78. clang.arg("-loleaut32");
  79. clang.arg("-lopengl32");
  80. clang.arg("-lsecur32");
  81. clang.arg("-lshell32");
  82. clang.arg("-lsynchronization");
  83. clang.arg("-luser32");
  84. clang.arg("-lwinspool");
  85. clang.arg("-Wl,-nodefaultlib:libcmt");
  86. clang.arg("-D_DLL");
  87. clang.arg("-lmsvcrt");
  88. }
  89. #[cfg(target_os = "macos")]
  90. {
  91. clang.arg("-framework").arg("CoreServices");
  92. clang.arg("-framework").arg("Security");
  93. clang.arg("-l").arg("System");
  94. clang.arg("-l").arg("resolv");
  95. clang.arg("-l").arg("pthread");
  96. clang.arg("-l").arg("c");
  97. clang.arg("-l").arg("m");
  98. }
  99. clang.arg("-L").arg(root.join("target").join("debug"));
  100. clang
  101. .arg("--output")
  102. .arg(Path::new("build").join(format!("{out_name}{EXE_SUFFIX}")));
  103. if !clang.status().await?.success() {
  104. bail!("failed to compile c node");
  105. };
  106. Ok(())
  107. }
  108. async fn build_c_operator(root: &Path) -> eyre::Result<()> {
  109. let mut compile = tokio::process::Command::new("clang");
  110. compile.arg("-c").arg("operator.c");
  111. compile.arg("-o").arg("build/operator.o");
  112. compile.arg("-fdeclspec");
  113. #[cfg(unix)]
  114. compile.arg("-fPIC");
  115. if !compile.status().await?.success() {
  116. bail!("failed to compile c operator");
  117. };
  118. let mut link = tokio::process::Command::new("clang");
  119. link.arg("-shared").arg("build/operator.o");
  120. link.arg("-L").arg(root.join("target").join("debug"));
  121. link.arg("-l").arg("dora_operator_api_c");
  122. #[cfg(target_os = "windows")]
  123. {
  124. link.arg("-ladvapi32");
  125. link.arg("-luserenv");
  126. link.arg("-lkernel32");
  127. link.arg("-lws2_32");
  128. link.arg("-lbcrypt");
  129. link.arg("-lncrypt");
  130. link.arg("-lschannel");
  131. link.arg("-lntdll");
  132. link.arg("-liphlpapi");
  133. link.arg("-lcfgmgr32");
  134. link.arg("-lcredui");
  135. link.arg("-lcrypt32");
  136. link.arg("-lcryptnet");
  137. link.arg("-lfwpuclnt");
  138. link.arg("-lgdi32");
  139. link.arg("-lmsimg32");
  140. link.arg("-lmswsock");
  141. link.arg("-lole32");
  142. link.arg("-loleaut32");
  143. link.arg("-lopengl32");
  144. link.arg("-lsecur32");
  145. link.arg("-lshell32");
  146. link.arg("-lsynchronization");
  147. link.arg("-luser32");
  148. link.arg("-lwinspool");
  149. link.arg("-Wl,-nodefaultlib:libcmt");
  150. link.arg("-D_DLL");
  151. link.arg("-lmsvcrt");
  152. }
  153. #[cfg(target_os = "macos")]
  154. {
  155. link.arg("-framework").arg("CoreServices");
  156. link.arg("-framework").arg("Security");
  157. link.arg("-l").arg("System");
  158. link.arg("-l").arg("resolv");
  159. link.arg("-l").arg("pthread");
  160. link.arg("-l").arg("c");
  161. link.arg("-l").arg("m");
  162. }
  163. link.arg("-o")
  164. .arg(Path::new("build").join(format!("{DLL_PREFIX}operator{DLL_SUFFIX}")));
  165. if !link.status().await?.success() {
  166. bail!("failed to link c operator");
  167. };
  168. Ok(())
  169. }