flowey_lib_hvlite/
build_tmks.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Build TMK binaries
5
6use crate::run_cargo_build::common::CommonArch;
7use crate::run_cargo_build::common::CommonProfile;
8use flowey::node::prelude::*;
9use std::collections::BTreeMap;
10
11#[derive(Serialize, Deserialize)]
12pub struct TmksOutput {
13    #[serde(rename = "simple_tmk")]
14    pub bin: PathBuf,
15    #[serde(rename = "simple_tmk.dbg")]
16    pub dbg: PathBuf,
17}
18
19impl Artifact for TmksOutput {}
20
21flowey_request! {
22    pub struct Request {
23        pub arch: CommonArch,
24        pub profile: CommonProfile,
25        pub tmks: WriteVar<TmksOutput>,
26    }
27}
28
29new_flow_node!(struct Node);
30
31impl FlowNode for Node {
32    type Request = Request;
33
34    fn imports(ctx: &mut ImportCtx<'_>) {
35        ctx.import::<crate::run_cargo_build::Node>();
36    }
37
38    fn emit(requests: Vec<Self::Request>, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> {
39        // de-dupe incoming requests
40        let requests = requests
41            .into_iter()
42            .fold(BTreeMap::<_, Vec<_>>::new(), |mut m, r| {
43                let Request {
44                    arch,
45                    profile,
46                    tmks,
47                } = r;
48                m.entry((arch, profile)).or_default().push(tmks);
49                m
50            });
51
52        for ((arch, profile), tmks) in requests {
53            let target = target_lexicon::Triple {
54                architecture: arch.as_arch(),
55                operating_system: target_lexicon::OperatingSystem::None_,
56                environment: target_lexicon::Environment::Unknown,
57                vendor: target_lexicon::Vendor::Custom(target_lexicon::CustomVendor::Static(
58                    "minimal_rt",
59                )),
60                binary_format: target_lexicon::BinaryFormat::Unknown,
61            };
62
63            let output = ctx.reqv(|v| crate::run_cargo_build::Request {
64                crate_name: "simple_tmk".into(),
65                out_name: "simple_tmk".into(),
66                crate_type: flowey_lib_common::run_cargo_build::CargoCrateType::Bin,
67                profile: profile.into(),
68                features: Default::default(),
69                target,
70                no_split_dbg_info: false,
71                extra_env: Some(ReadVar::from_static(
72                    [("RUSTC_BOOTSTRAP".to_string(), "1".to_string())]
73                        .into_iter()
74                        .collect(),
75                )),
76                pre_build_deps: Vec::new(),
77                output: v,
78            });
79
80            ctx.emit_minor_rust_step("report built tmks", |ctx| {
81                let tmks = tmks.claim(ctx);
82                let output = output.claim(ctx);
83                move |rt| {
84                    let output = match rt.read(output) {
85                        crate::run_cargo_build::CargoBuildOutput::ElfBin { bin, dbg } => {
86                            TmksOutput {
87                                bin,
88                                dbg: dbg.unwrap(),
89                            }
90                        }
91                        _ => unreachable!(),
92                    };
93
94                    for var in tmks {
95                        rt.write(var, &output);
96                    }
97                }
98            });
99        }
100
101        Ok(())
102    }
103}