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
---------------
**NOTE** This project uses `xtask`-style build system. To see help, use `cargo xtask --help`.
Prerequisites:
* 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;
#[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<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 {

View File

@ -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<String> },
#[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(())
}
}
}

View File

@ -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<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(
env: BuildEnv,
qemu: Option<PathBuf>,