axbuild 0.4.14

An OS build lib toolkit used by arceos
Documentation
use super::*;

pub(crate) fn ensure_build_info<T>(path: &Path, default: impl FnOnce() -> T) -> anyhow::Result<()>
where
    T: Serialize,
{
    println!("Using build config: {}", path.display());

    if path.exists() {
        info!("Found build config at {}", path.display());
        return Ok(());
    }

    info!(
        "Build config not found at {}, writing default config",
        path.display()
    );
    if let Some(parent) = path.parent() {
        fs::create_dir_all(parent)?;
    }
    let default = default();
    std::fs::write(path, toml::to_string_pretty(&default)?)?;
    Ok(())
}

pub(crate) fn load_build_info<T>(path: &Path) -> anyhow::Result<T>
where
    T: DeserializeOwned,
{
    let contents = std::fs::read_to_string(path)?;
    reject_removed_std_field(path, &contents)?;
    toml::from_str::<T>(&contents)
        .with_context(|| format!("failed to parse build info {}", path.display()))
}

pub(crate) fn reject_removed_std_field(path: &Path, contents: &str) -> anyhow::Result<()> {
    if let Ok(table) = toml::from_str::<toml::Table>(contents)
        && table.contains_key("std")
    {
        bail!(
            "build config {} uses removed `std` field; std-aware Rust builds are now the default, \
             remove `std = ...`",
            path.display()
        );
    }

    Ok(())
}

pub(crate) fn reject_arceos_app_c_field(path: &Path, contents: &str) -> anyhow::Result<()> {
    if let Ok(table) = toml::from_str::<toml::Table>(contents)
        && table.contains_key("app-c")
    {
        bail!(
            "build config {} uses ArceOS-only `app-c` field; remove it or use an ArceOS build \
             command",
            path.display()
        );
    }

    Ok(())
}