axbuild 0.4.16

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

pub(crate) fn build_cmake_configure_command(
    case: &TestQemuCase,
    layout: &case_assets::CaseAssetLayout,
    build_env: &HostCrossBuildEnv,
    config: &CaseAssetConfig,
) -> Command {
    build_cmake_configure_command_with_source_dir(
        &case_c_source_dir(case),
        layout,
        build_env,
        config,
    )
}

pub(super) fn build_cmake_configure_command_with_source_dir(
    source_dir: &Path,
    layout: &case_assets::CaseAssetLayout,
    build_env: &HostCrossBuildEnv,
    config: &CaseAssetConfig,
) -> Command {
    let mut command = Command::new(&build_env.cmake);
    command
        .arg("-S")
        .arg(source_dir)
        .arg("-B")
        .arg(&layout.build_dir)
        .arg("-G")
        .arg("Unix Makefiles")
        .arg("-DCMAKE_BUILD_TYPE=Release")
        .arg("-DCMAKE_INSTALL_PREFIX=/")
        .arg("-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY")
        .arg(format!(
            "-DCMAKE_TOOLCHAIN_FILE={}",
            build_env.cmake_toolchain_file.display()
        ))
        .arg(format!(
            "-DCMAKE_MAKE_PROGRAM={}",
            build_env.make_program.display()
        ))
        .arg(format!(
            "-DPKG_CONFIG_EXECUTABLE={}",
            build_env.pkg_config.display()
        ))
        .arg(format!(
            "-D{}={}",
            config.script_env.staging_root,
            layout.staging_root.display()
        ));

    for (key, value) in &build_env.command_envs {
        command.env(key, value);
    }

    command
}

pub(super) fn build_grouped_c_root_project_configure_command(
    case: &TestQemuCase,
    selected_subcases: &[&TestQemuSubcase],
    all_c_subcase_count: usize,
    layout: &case_assets::CaseAssetLayout,
    build_env: &HostCrossBuildEnv,
    config: &CaseAssetConfig,
) -> Command {
    let mut command =
        build_cmake_configure_command_with_source_dir(&case.case_dir, layout, build_env, config);
    if let Some(subcases) =
        grouped_c_root_project_selected_subcase_define(case, selected_subcases, all_c_subcase_count)
    {
        command.arg(format!("-DSTARRY_GROUPED_C_SUBCASES={subcases}"));
    }
    command
}

pub(super) fn grouped_c_root_project_selected_subcase_define(
    case: &TestQemuCase,
    selected_subcases: &[&TestQemuSubcase],
    all_c_subcase_count: usize,
) -> Option<String> {
    let filter_nonempty = case
        .grouped_subcase_filter
        .as_ref()
        .is_some_and(|filter| !filter.is_empty());
    if selected_subcases.len() >= all_c_subcase_count && !filter_nonempty {
        return None;
    }

    let mut names = selected_subcases
        .iter()
        .map(|subcase| subcase.name.as_str())
        .collect::<Vec<_>>();
    names.sort_unstable();
    Some(names.join(";"))
}

pub(super) fn build_cmake_build_command(
    layout: &case_assets::CaseAssetLayout,
    build_env: &HostCrossBuildEnv,
) -> Command {
    let mut command = Command::new(&build_env.cmake);
    command
        .arg("--build")
        .arg(&layout.build_dir)
        .arg("--parallel");

    for (key, value) in &build_env.command_envs {
        command.env(key, value);
    }

    command
}

pub(super) fn build_cmake_install_command(
    layout: &case_assets::CaseAssetLayout,
    build_env: &HostCrossBuildEnv,
) -> Command {
    let mut command = Command::new(&build_env.cmake);
    command.arg("--install").arg(&layout.build_dir);
    command.env("DESTDIR", &layout.overlay_dir);

    for (key, value) in &build_env.command_envs {
        command.env(key, value);
    }

    command
}