axbuild 0.4.14

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

pub(crate) fn group_cases_by_build_config<T: BuildConfigRef>(
    cases: &[T],
) -> Vec<QemuCaseGroup<'_, T>> {
    let mut groups: Vec<QemuCaseGroup<'_, T>> = Vec::new();
    let mut indexes = BTreeMap::<&Path, usize>::new();
    for case in cases {
        if let Some(index) = indexes.get(case.build_config_path()).copied() {
            groups[index].cases.push(case);
            continue;
        }

        let index = groups.len();
        indexes.insert(case.build_config_path(), index);
        groups.push(QemuCaseGroup {
            build_group: case.build_group(),
            build_config_path: case.build_config_path(),
            cases: vec![case],
        });
    }

    groups
}

pub(crate) fn prepare_case_build_groups<T, R>(
    cases: &[T],
    mut prepare_context: impl FnMut(&Path) -> anyhow::Result<(R, Cargo)>,
) -> anyhow::Result<Vec<QemuCaseBuildGroup<'_, T, R>>>
where
    T: BuildConfigRef,
{
    group_cases_by_build_config(cases)
        .into_iter()
        .map(|group| {
            let (request, cargo) = prepare_context(group.build_config_path)?;
            Ok(QemuCaseBuildGroup {
                group,
                request,
                cargo,
            })
        })
        .collect()
}