flowey_lib_hvlite/
build_sidecar.rs1use crate::common::CommonArch;
7use crate::run_cargo_build::BuildProfile;
8use flowey::node::prelude::*;
9use flowey_lib_common::_util::group_by;
10
11#[derive(Serialize, Deserialize)]
12pub struct SidecarOutput {
13 #[serde(rename = "sidecar")]
14 pub bin: PathBuf,
15 #[serde(rename = "sidecar.dbg")]
16 pub dbg: PathBuf,
17}
18
19#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
20pub enum SidecarBuildProfile {
21 Debug,
22 Release,
23}
24
25#[derive(Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
26pub struct SidecarBuildParams {
27 pub arch: CommonArch,
28 pub profile: SidecarBuildProfile,
29}
30
31flowey_request! {
32 pub struct Request {
33 pub build_params: SidecarBuildParams,
34 pub sidecar: WriteVar<SidecarOutput>,
35 }
36}
37
38new_flow_node!(struct Node);
39
40impl FlowNode for Node {
41 type Request = Request;
42
43 fn imports(ctx: &mut ImportCtx<'_>) {
44 ctx.import::<crate::run_cargo_build::Node>();
45 }
46
47 fn emit(requests: Vec<Self::Request>, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> {
48 let requests = group_by(requests.into_iter().map(|r| (r.build_params, r.sidecar)));
49
50 for (SidecarBuildParams { arch, profile }, sidecar) in requests {
51 let target = arch.minimal_rt_triple();
52
53 let profile = match profile {
55 SidecarBuildProfile::Debug => BuildProfile::BootDev,
56 SidecarBuildProfile::Release => BuildProfile::BootRelease,
57 };
58
59 let mut extra_env = crate::common::openhcl_build_env();
60 extra_env.insert("RUSTC_BOOTSTRAP".into(), "1".into());
61
62 let output = ctx.reqv(|v| crate::run_cargo_build::Request {
63 crate_name: "sidecar".into(),
64 out_name: "sidecar".into(),
65 crate_type: flowey_lib_common::run_cargo_build::CargoCrateType::Bin,
66 profile,
67 features: Default::default(),
68 target,
69 no_split_dbg_info: false,
70 extra_env: Some(ReadVar::from_static(extra_env)),
71 pre_build_deps: Vec::new(),
72 output: v,
73 });
74
75 ctx.emit_minor_rust_step("report built sidecar", |ctx| {
76 let sidecar = sidecar.claim(ctx);
77 let output = output.claim(ctx);
78 move |rt| {
79 let output = match rt.read(output) {
80 crate::run_cargo_build::CargoBuildOutput::ElfBin { bin, dbg } => {
81 SidecarOutput {
82 bin,
83 dbg: dbg.unwrap(),
84 }
85 }
86 _ => unreachable!(),
87 };
88
89 rt.write_all(sidecar, &output);
90 }
91 });
92 }
93
94 Ok(())
95 }
96}