Skip to main content

flowey_lib_hvlite/
build_sidecar.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Build `sidecar` binaries
5
6use 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            // We use special profiles for boot, convert from the standard ones:
54            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}