From 300646e8a7af785365823313c9040c0517b66ec4 Mon Sep 17 00:00:00 2001 From: Mark Poliakov Date: Mon, 16 Dec 2024 16:36:38 +0200 Subject: [PATCH] xtask: print environment command --- README.md | 2 ++ xtask/src/env.rs | 27 +++++++++++++++++++-------- xtask/src/main.rs | 18 +++++++++++++++++- xtask/src/qemu.rs | 34 ++++++++++++++++++++++++++-------- 4 files changed, 64 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index eb3c62ff..85545751 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,8 @@ x86-specific: Building the OS --------------- +**NOTE** This project uses `xtask`-style build system. To see help, use `cargo xtask --help`. + Prerequisites: * Decent CPU and a sizable amount of RAM diff --git a/xtask/src/env.rs b/xtask/src/env.rs index 394ad058..6b404689 100644 --- a/xtask/src/env.rs +++ b/xtask/src/env.rs @@ -1,14 +1,14 @@ -use std::path::PathBuf; +use std::{io, path::PathBuf}; use clap::ValueEnum; -#[derive(Debug, serde::Deserialize)] +#[derive(Debug, serde::Deserialize, serde::Serialize)] #[serde(default)] pub struct ToolchainConfig { pub branch: String, } -#[derive(Debug, serde::Deserialize)] +#[derive(Debug, serde::Deserialize, serde::Serialize)] #[serde(default)] pub struct BuildComponents { pub libc: bool, @@ -16,25 +16,25 @@ pub struct BuildComponents { pub libcxx: bool, } -#[derive(Debug, Default, serde::Deserialize)] +#[derive(Debug, Default, serde::Deserialize, serde::Serialize)] #[serde(default)] pub struct AArch64TargetConfig { pub components: BuildComponents, } -#[derive(Debug, Default, serde::Deserialize)] +#[derive(Debug, Default, serde::Deserialize, serde::Serialize)] #[serde(default)] pub struct X86_64TargetConfig { pub components: BuildComponents, } -#[derive(Debug, Default, serde::Deserialize)] +#[derive(Debug, Default, serde::Deserialize, serde::Serialize)] #[serde(default)] pub struct I686TargetConfig { pub components: BuildComponents, } -#[derive(Debug, Default, serde::Deserialize)] +#[derive(Debug, Default, serde::Deserialize, serde::Serialize)] #[serde(default)] pub struct TargetConfig { pub aarch64: AArch64TargetConfig, @@ -42,7 +42,7 @@ pub struct TargetConfig { pub i686: I686TargetConfig, } -#[derive(Debug, Default, serde::Deserialize)] +#[derive(Debug, Default, serde::Deserialize, serde::Serialize)] #[serde(default)] pub struct XTaskConfig { pub toolchain: ToolchainConfig, @@ -174,6 +174,17 @@ impl BuildEnv { llvm_sysroot, } } + + pub fn dump(&self, output: &mut W) { + match toml::to_string_pretty(&self.config) { + Ok(string) => { + writeln!(output, "{string}").ok(); + } + Err(error) => { + log::error!("Config serialization error: {error}"); + } + } + } } impl XTaskConfig { diff --git a/xtask/src/main.rs b/xtask/src/main.rs index 6d85ab11..eb24bad1 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -1,7 +1,7 @@ #![deny(warnings)] #![feature(exit_status_error)] -use std::{fs, path::PathBuf, process::ExitCode}; +use std::{fs, io::stdout, path::PathBuf, process::ExitCode}; use build::CheckAction; use clap::{Parser, Subcommand}; @@ -88,6 +88,8 @@ enum SubArgs { Toolchain { branch: Option }, #[clap(about = "Print the host triple")] HostTriple, + #[clap(about = "Print information about the build environment and configuration")] + Env, } fn run(args: Args) -> Result<(), Error> { @@ -148,6 +150,20 @@ fn run(args: Args) -> Result<(), Error> { println!("{}", env.host_triple); Ok(()) } + SubArgs::Env => { + println!("--- Build information ---"); + println!(); + match config_path { + Some(path) => println!(" * Using {}:", path.display()), + None => println!(" * Using default xtask config:"), + } + println!(); + env.dump(&mut stdout()); + qemu::dump_config(&env, &mut stdout()); + println!("--- End build information ---"); + + Ok(()) + } } } diff --git a/xtask/src/qemu.rs b/xtask/src/qemu.rs index 9123e614..94cbde7a 100644 --- a/xtask/src/qemu.rs +++ b/xtask/src/qemu.rs @@ -1,4 +1,5 @@ use std::{ + io, path::{Path, PathBuf}, process::Command, }; @@ -18,7 +19,7 @@ use crate::{ const X86_64_UEFI_PATH: &str = "/usr/share/edk2-ovmf/x64/OVMF_CODE.fd"; -#[derive(Debug, serde::Deserialize)] +#[derive(Debug, serde::Deserialize, serde::Serialize)] #[serde(rename_all = "kebab-case", default)] struct QemuNetworkConfig { enable: bool, @@ -26,7 +27,7 @@ struct QemuNetworkConfig { mac: String, } -#[derive(Debug, Default, Clone, Copy, serde::Deserialize)] +#[derive(Debug, Default, Clone, Copy, serde::Deserialize, serde::Serialize)] #[serde(rename_all = "kebab-case")] enum QemuDiskInterface { #[default] @@ -34,33 +35,33 @@ enum QemuDiskInterface { Ahci, } -#[derive(Debug, Default, serde::Deserialize)] +#[derive(Debug, Default, serde::Deserialize, serde::Serialize)] #[serde(rename_all = "kebab-case", default)] struct QemuDiskConfig { interface: QemuDiskInterface, } -#[derive(Debug, serde::Deserialize)] +#[derive(Debug, serde::Deserialize, serde::Serialize)] #[serde(rename_all = "kebab-case", default)] struct QemuX86_64MachineConfig { enable_kvm: bool, memory: usize, } -#[derive(Debug, serde::Deserialize)] +#[derive(Debug, serde::Deserialize, serde::Serialize)] #[serde(rename_all = "kebab-case", default)] struct QemuAArch64MachineConfig { memory: usize, } -#[derive(Debug, serde::Deserialize)] +#[derive(Debug, serde::Deserialize, serde::Serialize)] #[serde(rename_all = "kebab-case", default)] struct QemuI686MachineConfig { enable_kvm: bool, memory: usize, } -#[derive(Debug, serde::Deserialize)] +#[derive(Debug, serde::Deserialize, serde::Serialize)] #[serde(default)] struct QemuMachineConfig { x86_64: QemuX86_64MachineConfig, @@ -69,7 +70,7 @@ struct QemuMachineConfig { smp: usize, } -#[derive(Debug, Default, serde::Deserialize)] +#[derive(Debug, Default, serde::Deserialize, serde::Serialize)] #[serde(rename_all = "kebab-case", default)] struct QemuConfig { network: QemuNetworkConfig, @@ -291,6 +292,23 @@ fn add_devices_from_config( Ok(()) } +pub fn dump_config(env: &BuildEnv, output: &mut W) { + let config_path = env.workspace_root.join("qemu.toml"); + if config_path.exists() { + writeln!(output, " * Using qemu.toml:").ok(); + } else { + writeln!(output, " * Using default qemu config:").ok(); + } + let config = load_qemu_config(config_path); + + writeln!(output).ok(); + match config.as_ref().map(toml::to_string_pretty) { + Ok(Ok(string)) => writeln!(output, "{string}").ok(), + Ok(Err(error)) => writeln!(output, "").ok(), + Err(error) => writeln!(output, "").ok(), + }; +} + pub fn run( env: BuildEnv, qemu: Option,