Skip to main content

flowey_lib_hvlite/
build_flowey_hvlite.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Flowey building itself
5
6use crate::common::CommonTriple;
7use flowey::node::prelude::*;
8use flowey_lib_common::_util::group_by;
9
10#[derive(Serialize, Deserialize)]
11#[serde(untagged)]
12pub enum FloweyHvliteOutput {
13    LinuxBin {
14        #[serde(rename = "flowey_hvlite")]
15        bin: PathBuf,
16        #[serde(rename = "flowey_hvlite.dbg")]
17        dbg: Option<PathBuf>,
18    },
19    WindowsBin {
20        #[serde(rename = "flowey_hvlite.exe")]
21        exe: PathBuf,
22        #[serde(rename = "flowey_hvlite.pdb")]
23        #[serde(default, skip_serializing_if = "Option::is_none")]
24        pdb: Option<PathBuf>,
25    },
26}
27
28impl Artifact for FloweyHvliteOutput {}
29
30flowey_request! {
31    pub struct Request {
32        pub target: CommonTriple,
33        pub flowey_hvlite: WriteVar<FloweyHvliteOutput>,
34    }
35}
36
37new_flow_node!(struct Node);
38
39impl FlowNode for Node {
40    type Request = Request;
41
42    fn imports(ctx: &mut ImportCtx<'_>) {
43        ctx.import::<crate::run_cargo_build::Node>();
44    }
45
46    fn emit(requests: Vec<Self::Request>, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> {
47        let requests = group_by(requests.into_iter().map(|r| (r.target, r.flowey_hvlite)));
48        for (target, flowey_hvlite) in requests {
49            let output = ctx.reqv(|v| crate::run_cargo_build::Request {
50                crate_name: "flowey_hvlite".into(),
51                out_name: "flowey_hvlite".into(),
52                profile: crate::run_cargo_build::BuildProfile::Light,
53                features: Default::default(),
54                crate_type: flowey_lib_common::run_cargo_build::CargoCrateType::Bin,
55                target: target.as_triple(),
56                no_split_dbg_info: false,
57                extra_env: None,
58                pre_build_deps: Vec::new(),
59                output: v,
60            });
61
62            ctx.emit_minor_rust_step("report built flowey_hvlite", |ctx| {
63                let flowey_hvlite = flowey_hvlite.claim(ctx);
64                let output = output.claim(ctx);
65                move |rt| {
66                    let output = match rt.read(output) {
67                        crate::run_cargo_build::CargoBuildOutput::WindowsBin { exe, pdb } => {
68                            FloweyHvliteOutput::WindowsBin { exe, pdb }
69                        }
70                        crate::run_cargo_build::CargoBuildOutput::ElfBin { bin, dbg } => {
71                            FloweyHvliteOutput::LinuxBin { bin, dbg }
72                        }
73                        _ => unreachable!(),
74                    };
75
76                    rt.write_all(flowey_hvlite, &output);
77                }
78            });
79        }
80
81        Ok(())
82    }
83}