axbuild 0.4.21

An OS build lib toolkit used by arceos
use std::path::{Path, PathBuf};

#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct ArceosCArtifactPaths {
    pub(crate) target_dir: PathBuf,
    pub(crate) out_dir: PathBuf,
}

#[derive(Debug, Clone)]
pub(crate) struct ArceosCBuildInput {
    pub(crate) app_dir: PathBuf,
    pub(crate) app_name: String,
    pub(crate) target_dir: PathBuf,
    pub(crate) out_dir: PathBuf,
    pub(crate) features: Vec<String>,
}

#[derive(Debug, Clone)]
pub(crate) struct ArceosCBuildOutput {
    pub(crate) elf_path: PathBuf,
}

pub(crate) fn default_c_app_artifact_paths(
    workspace_root: &Path,
    app_name: &str,
) -> ArceosCArtifactPaths {
    let target_dir = crate::context::axbuild_tmp_dir(workspace_root)
        .join("arceos-c")
        .join("cargo");
    let out_dir = crate::context::axbuild_tmp_dir(workspace_root)
        .join("arceos-c")
        .join("apps")
        .join(sanitize_name(app_name))
        .join("out");

    ArceosCArtifactPaths {
        target_dir,
        out_dir,
    }
}

pub(super) fn sanitize_name(name: &str) -> String {
    name.chars()
        .map(|ch| if ch.is_ascii_alphanumeric() { ch } else { '-' })
        .collect()
}