Skip to main content

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::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        // -- end of req processing -- //
38
39        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            // TODO: Refactor this into using a `flowey_lib_common::_util::extract` helper
57            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}