flowey_lib_hvlite/
build_tmks.rs1use 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 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}