axbuild 0.4.22

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

use anyhow::Context;

use super::StarryAppBoardCase;
use crate::{
    starry::test::{
        PreparedBoardSessionAssets, collect_upload_paths, copy_declared_session_files,
        starry_case_asset_config,
    },
    test::{
        build::prepare_rust_case_overlay_sync,
        case::{TestQemuCase, board_case_asset_layout},
    },
};

pub(in crate::starry) async fn prepare_app_board_session_assets(
    workspace_root: &Path,
    arch: &str,
    target: &str,
    case: &StarryAppBoardCase,
    declared_session_files: &[PathBuf],
) -> anyhow::Result<Option<PreparedBoardSessionAssets>> {
    let rust_manifest = case.case_dir.join("rust/Cargo.toml");
    if !rust_manifest.is_file() {
        return Ok(None);
    }

    let rootfs =
        crate::starry::rootfs::ensure_rootfs_in_tmp_dir(workspace_root, arch, target).await?;
    let workspace_root = workspace_root.to_path_buf();
    let arch = arch.to_string();
    let target = target.to_string();
    let case_name = case.name.clone();
    let case_dir = case.case_dir.clone();
    let board_config_path = case.board_config_path.clone();
    let declared_session_files = declared_session_files.to_vec();

    let assets = tokio::task::spawn_blocking(move || -> anyhow::Result<_> {
        let layout =
            board_case_asset_layout(&workspace_root, &target, &format!("app/{case_name}"))?;
        let build_case = TestQemuCase {
            name: case_name.clone(),
            display_name: case_name,
            case_dir: case_dir.clone(),
            qemu_config_path: board_config_path,
            test_commands: Vec::new(),
            host_symbolize_success_regex: Vec::new(),
            host_http_server: None,
            subcases: Vec::new(),
            grouped_subcase_filter: None,
        };
        prepare_rust_case_overlay_sync(
            &arch,
            &build_case,
            &rootfs,
            &layout,
            &starry_case_asset_config(),
        )?;
        copy_declared_session_files(&case_dir, &layout.overlay_dir, &declared_session_files)?;
        let relative_paths = collect_upload_paths(&layout.overlay_dir)?;
        Ok(PreparedBoardSessionAssets {
            root: layout.overlay_dir,
            relative_paths,
        })
    })
    .await
    .context("Starry app board session asset task failed")??;

    Ok(Some(assets))
}