flowey_lib_hvlite/
init_openvmm_magicpath_openhcl_sysroot.rs1use crate::common::CommonArch;
8use flowey::node::prelude::*;
9use std::collections::BTreeMap;
10
11new_flow_node!(struct Node);
12
13flowey_request! {
14 pub struct Request {
15 pub arch: CommonArch,
16 pub path: WriteVar<PathBuf>,
17 }
18}
19
20impl FlowNode for Node {
21 type Request = Request;
22
23 fn imports(ctx: &mut ImportCtx<'_>) {
24 ctx.import::<crate::cfg_openvmm_magicpath::Node>();
25 ctx.import::<crate::resolve_openvmm_deps::Node>();
26 }
27
28 fn emit(requests: Vec<Self::Request>, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> {
29 let mut sysroot_arch: BTreeMap<_, Vec<_>> = BTreeMap::new();
30
31 for Request { arch, path } in requests {
32 sysroot_arch.entry(arch).or_default().push(path)
33 }
34
35 let sysroot_arch = sysroot_arch;
36
37 if !matches!(ctx.platform(), FlowPlatform::Linux(_)) {
40 anyhow::bail!("step only available on linux systems");
41 }
42
43 let openvmm_magicpath = ctx.reqv(crate::cfg_openvmm_magicpath::Request);
44
45 for (arch, out_vars) in sysroot_arch {
46 let openhcl_sysroot_tar_gz = ctx.reqv(|v| {
47 crate::resolve_openvmm_deps::Request::Get(
48 crate::resolve_openvmm_deps::OpenvmmDepFile::OpenhclSysroot,
49 arch,
50 v,
51 )
52 });
53
54 let openvmm_magicpath = openvmm_magicpath.clone();
55
56 ctx.emit_rust_step(format!("extract {arch:?} sysroot.tar.gz"), move |ctx| {
58 let openhcl_sysroot_tar_gz = openhcl_sysroot_tar_gz.claim(ctx);
59 let openvmm_magicpath = openvmm_magicpath.claim(ctx);
60 let requests = out_vars.claim(ctx);
61
62 move |rt| {
63 let openhcl_sysroot_tar_gz = rt.read(openhcl_sysroot_tar_gz);
64
65 let extracted_sysroot_path =
66 rt.read(openvmm_magicpath)
67 .join("extracted")
68 .join(match arch {
69 CommonArch::Aarch64 => "aarch64-sysroot",
70 CommonArch::X86_64 => "x86_64-sysroot",
71 });
72 fs_err::create_dir_all(&extracted_sysroot_path)?;
73
74 flowey::shell_cmd!(
75 rt,
76 "tar
77 -xf {openhcl_sysroot_tar_gz}
78 -C {extracted_sysroot_path}
79 --no-same-owner
80 --no-same-permissions
81 "
82 )
83 .run()?;
84
85 for var in requests {
86 rt.write(var, &extracted_sysroot_path.absolute()?)
87 }
88
89 Ok(())
90 }
91 });
92 }
93
94 Ok(())
95 }
96}