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