xtask: print environment command

This commit is contained in:
Mark Poliakov 2024-12-16 16:36:38 +02:00
parent c4b18c3379
commit 300646e8a7
4 changed files with 64 additions and 17 deletions

View File

@ -67,6 +67,8 @@ x86-specific:
Building the OS Building the OS
--------------- ---------------
**NOTE** This project uses `xtask`-style build system. To see help, use `cargo xtask --help`.
Prerequisites: Prerequisites:
* Decent CPU and a sizable amount of RAM * Decent CPU and a sizable amount of RAM

View File

@ -1,14 +1,14 @@
use std::path::PathBuf; use std::{io, path::PathBuf};
use clap::ValueEnum; use clap::ValueEnum;
#[derive(Debug, serde::Deserialize)] #[derive(Debug, serde::Deserialize, serde::Serialize)]
#[serde(default)] #[serde(default)]
pub struct ToolchainConfig { pub struct ToolchainConfig {
pub branch: String, pub branch: String,
} }
#[derive(Debug, serde::Deserialize)] #[derive(Debug, serde::Deserialize, serde::Serialize)]
#[serde(default)] #[serde(default)]
pub struct BuildComponents { pub struct BuildComponents {
pub libc: bool, pub libc: bool,
@ -16,25 +16,25 @@ pub struct BuildComponents {
pub libcxx: bool, pub libcxx: bool,
} }
#[derive(Debug, Default, serde::Deserialize)] #[derive(Debug, Default, serde::Deserialize, serde::Serialize)]
#[serde(default)] #[serde(default)]
pub struct AArch64TargetConfig { pub struct AArch64TargetConfig {
pub components: BuildComponents, pub components: BuildComponents,
} }
#[derive(Debug, Default, serde::Deserialize)] #[derive(Debug, Default, serde::Deserialize, serde::Serialize)]
#[serde(default)] #[serde(default)]
pub struct X86_64TargetConfig { pub struct X86_64TargetConfig {
pub components: BuildComponents, pub components: BuildComponents,
} }
#[derive(Debug, Default, serde::Deserialize)] #[derive(Debug, Default, serde::Deserialize, serde::Serialize)]
#[serde(default)] #[serde(default)]
pub struct I686TargetConfig { pub struct I686TargetConfig {
pub components: BuildComponents, pub components: BuildComponents,
} }
#[derive(Debug, Default, serde::Deserialize)] #[derive(Debug, Default, serde::Deserialize, serde::Serialize)]
#[serde(default)] #[serde(default)]
pub struct TargetConfig { pub struct TargetConfig {
pub aarch64: AArch64TargetConfig, pub aarch64: AArch64TargetConfig,
@ -42,7 +42,7 @@ pub struct TargetConfig {
pub i686: I686TargetConfig, pub i686: I686TargetConfig,
} }
#[derive(Debug, Default, serde::Deserialize)] #[derive(Debug, Default, serde::Deserialize, serde::Serialize)]
#[serde(default)] #[serde(default)]
pub struct XTaskConfig { pub struct XTaskConfig {
pub toolchain: ToolchainConfig, pub toolchain: ToolchainConfig,
@ -174,6 +174,17 @@ impl BuildEnv {
llvm_sysroot, llvm_sysroot,
} }
} }
pub fn dump<W: io::Write>(&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 { impl XTaskConfig {

View File

@ -1,7 +1,7 @@
#![deny(warnings)] #![deny(warnings)]
#![feature(exit_status_error)] #![feature(exit_status_error)]
use std::{fs, path::PathBuf, process::ExitCode}; use std::{fs, io::stdout, path::PathBuf, process::ExitCode};
use build::CheckAction; use build::CheckAction;
use clap::{Parser, Subcommand}; use clap::{Parser, Subcommand};
@ -88,6 +88,8 @@ enum SubArgs {
Toolchain { branch: Option<String> }, Toolchain { branch: Option<String> },
#[clap(about = "Print the host triple")] #[clap(about = "Print the host triple")]
HostTriple, HostTriple,
#[clap(about = "Print information about the build environment and configuration")]
Env,
} }
fn run(args: Args) -> Result<(), Error> { fn run(args: Args) -> Result<(), Error> {
@ -148,6 +150,20 @@ fn run(args: Args) -> Result<(), Error> {
println!("{}", env.host_triple); println!("{}", env.host_triple);
Ok(()) 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(())
}
} }
} }

View File

@ -1,4 +1,5 @@
use std::{ use std::{
io,
path::{Path, PathBuf}, path::{Path, PathBuf},
process::Command, process::Command,
}; };
@ -18,7 +19,7 @@ use crate::{
const X86_64_UEFI_PATH: &str = "/usr/share/edk2-ovmf/x64/OVMF_CODE.fd"; 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)] #[serde(rename_all = "kebab-case", default)]
struct QemuNetworkConfig { struct QemuNetworkConfig {
enable: bool, enable: bool,
@ -26,7 +27,7 @@ struct QemuNetworkConfig {
mac: String, mac: String,
} }
#[derive(Debug, Default, Clone, Copy, serde::Deserialize)] #[derive(Debug, Default, Clone, Copy, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "kebab-case")] #[serde(rename_all = "kebab-case")]
enum QemuDiskInterface { enum QemuDiskInterface {
#[default] #[default]
@ -34,33 +35,33 @@ enum QemuDiskInterface {
Ahci, Ahci,
} }
#[derive(Debug, Default, serde::Deserialize)] #[derive(Debug, Default, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "kebab-case", default)] #[serde(rename_all = "kebab-case", default)]
struct QemuDiskConfig { struct QemuDiskConfig {
interface: QemuDiskInterface, interface: QemuDiskInterface,
} }
#[derive(Debug, serde::Deserialize)] #[derive(Debug, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "kebab-case", default)] #[serde(rename_all = "kebab-case", default)]
struct QemuX86_64MachineConfig { struct QemuX86_64MachineConfig {
enable_kvm: bool, enable_kvm: bool,
memory: usize, memory: usize,
} }
#[derive(Debug, serde::Deserialize)] #[derive(Debug, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "kebab-case", default)] #[serde(rename_all = "kebab-case", default)]
struct QemuAArch64MachineConfig { struct QemuAArch64MachineConfig {
memory: usize, memory: usize,
} }
#[derive(Debug, serde::Deserialize)] #[derive(Debug, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "kebab-case", default)] #[serde(rename_all = "kebab-case", default)]
struct QemuI686MachineConfig { struct QemuI686MachineConfig {
enable_kvm: bool, enable_kvm: bool,
memory: usize, memory: usize,
} }
#[derive(Debug, serde::Deserialize)] #[derive(Debug, serde::Deserialize, serde::Serialize)]
#[serde(default)] #[serde(default)]
struct QemuMachineConfig { struct QemuMachineConfig {
x86_64: QemuX86_64MachineConfig, x86_64: QemuX86_64MachineConfig,
@ -69,7 +70,7 @@ struct QemuMachineConfig {
smp: usize, smp: usize,
} }
#[derive(Debug, Default, serde::Deserialize)] #[derive(Debug, Default, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "kebab-case", default)] #[serde(rename_all = "kebab-case", default)]
struct QemuConfig { struct QemuConfig {
network: QemuNetworkConfig, network: QemuNetworkConfig,
@ -291,6 +292,23 @@ fn add_devices_from_config(
Ok(()) Ok(())
} }
pub fn dump_config<W: io::Write>(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, "<Serialization error: {error}>").ok(),
Err(error) => writeln!(output, "<Load error: {error}>").ok(),
};
}
pub fn run( pub fn run(
env: BuildEnv, env: BuildEnv,
qemu: Option<PathBuf>, qemu: Option<PathBuf>,