microsoft/openvmm
Publicmirrored fromhttps://github.com/microsoft/openvmmAvailable
flowey/flowey_lib_hvlite/src/build_guide.rs
86lines · modecode
| 1 | // Copyright (c) Microsoft Corporation. |
| 2 | // Licensed under the MIT License. |
| 3 | |
| 4 | //! Build the OpenVMM Guide. |
| 5 | |
| 6 | use flowey::node::prelude::*; |
| 7 | |
| 8 | flowey_request! { |
| 9 | pub struct Request { |
| 10 | pub built_guide: WriteVar<GuideOutput>, |
| 11 | } |
| 12 | } |
| 13 | |
| 14 | #[derive(Serialize, Deserialize)] |
| 15 | pub struct GuideOutput { |
| 16 | #[serde(rename = "Guide")] |
| 17 | pub guide: PathBuf, |
| 18 | } |
| 19 | |
| 20 | impl Artifact for GuideOutput {} |
| 21 | |
| 22 | new_flow_node!(struct Node); |
| 23 | |
| 24 | impl FlowNode for Node { |
| 25 | type Request = Request; |
| 26 | |
| 27 | fn imports(ctx: &mut ImportCtx<'_>) { |
| 28 | ctx.import::<crate::git_checkout_openvmm_repo::Node>(); |
| 29 | ctx.import::<flowey_lib_common::download_mdbook_admonish::Node>(); |
| 30 | ctx.import::<flowey_lib_common::download_mdbook_mermaid::Node>(); |
| 31 | ctx.import::<flowey_lib_common::download_mdbook::Node>(); |
| 32 | ctx.import::<flowey_lib_common::install_rust::Node>(); |
| 33 | } |
| 34 | |
| 35 | fn emit(requests: Vec<Self::Request>, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> { |
| 36 | let mdbook_bin = ctx.reqv(flowey_lib_common::download_mdbook::Request::GetMdbook); |
| 37 | let mdbook_admonish_bin = |
| 38 | ctx.reqv(flowey_lib_common::download_mdbook_admonish::Request::GetMdbookAdmonish); |
| 39 | let mdbook_mermaid_bin = |
| 40 | ctx.reqv(flowey_lib_common::download_mdbook_mermaid::Request::GetMdbookMermaid); |
| 41 | |
| 42 | let guide_source = ctx |
| 43 | .reqv(crate::git_checkout_openvmm_repo::req::GetRepoDir) |
| 44 | .map(ctx, |p| p.join("Guide")); |
| 45 | |
| 46 | let rust_is_installed = ctx.reqv(flowey_lib_common::install_rust::Request::EnsureInstalled); |
| 47 | |
| 48 | for Request { built_guide } in requests { |
| 49 | ctx.emit_rust_step("build OpenVMM guide (mdbook)", |ctx| { |
| 50 | // rust must be installed to build the `mdbook-openvmm-shim` |
| 51 | rust_is_installed.clone().claim(ctx); |
| 52 | let mdbook_bin = mdbook_bin.clone().claim(ctx); |
| 53 | let mdbook_admonish_bin = mdbook_admonish_bin.clone().claim(ctx); |
| 54 | let mdbook_mermaid_bin = mdbook_mermaid_bin.clone().claim(ctx); |
| 55 | let built_guide = built_guide.claim(ctx); |
| 56 | let guide_source = guide_source.clone().claim(ctx); |
| 57 | |rt| { |
| 58 | let mdbook_bin = rt.read(mdbook_bin); |
| 59 | let mdbook_admonish_bin = rt.read(mdbook_admonish_bin); |
| 60 | let mdbook_mermaid_bin = rt.read(mdbook_mermaid_bin); |
| 61 | |
| 62 | let sh = xshell::Shell::new()?; |
| 63 | |
| 64 | let out_path: PathBuf = sh.current_dir().absolute()?.join("book"); |
| 65 | let guide_source: PathBuf = rt.read(guide_source); |
| 66 | |
| 67 | sh.change_dir(&guide_source); |
| 68 | xshell::cmd!( |
| 69 | sh, |
| 70 | "{mdbook_bin} build {guide_source} --dest-dir {out_path}" |
| 71 | ) |
| 72 | // intercepted by the `mdbook-openvmm-shim` |
| 73 | .env("SHIM_MDBOOK_ADMONISH", mdbook_admonish_bin) |
| 74 | .env("SHIM_MDBOOK_MERMAID", mdbook_mermaid_bin) |
| 75 | .run()?; |
| 76 | |
| 77 | rt.write(built_guide, &GuideOutput { guide: out_path }); |
| 78 | |
| 79 | Ok(()) |
| 80 | } |
| 81 | }); |
| 82 | } |
| 83 | |
| 84 | Ok(()) |
| 85 | } |
| 86 | } |
| 87 | |