flowey_lib_hvlite/
init_openvmm_magicpath_openhcl_sysroot.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Ensure the OpenHCL sysroot is extracted into the correct "magic directory"
5//! set by the project-level `[env]` table in `.cargo/config.toml`
6
7use 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        // -- end of req processing -- //
44
45        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            // TODO: Refactor this into using a `flowey_lib_common::_util::extract` helper
65            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}