axbuild 0.4.14

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

#[test]
fn std_cargo_config_uses_linux_musl_wrapper_with_plain_std_build() {
    let fake_dir = std_fake_lib_dir("x86_64-unknown-linux-musl").unwrap();
    let wrapper = std_linker_wrapper_path("x86_64-unknown-linux-musl", &fake_dir, false).unwrap();
    let config = std_cargo_config_path("x86_64-unknown-linux-musl", &wrapper, false, &[]).unwrap();
    let config = fs::read_to_string(config).unwrap();

    assert!(config.contains("build-std = [\"std\", \"panic_abort\"]"));
    assert!(config.contains("build-std-features = []"));
    assert!(config.contains("[target.x86_64-unknown-linux-musl]"));
    assert!(!config.contains("--cfg"));
    assert!(!config.contains("--check-cfg"));
    assert!(config.contains(&wrapper.display().to_string()));
    assert!(!config.contains("relocation-model"));
    assert!(!config.contains("code-model"));
    assert!(!config.contains("--cfg"));
    assert!(!config.contains("--check-cfg"));
}

#[test]
fn std_cargo_config_leaves_kernel_codegen_to_target_spec() {
    let fake_dir = std_fake_lib_dir("loongarch64-unknown-linux-musl").unwrap();
    let wrapper =
        std_linker_wrapper_path("loongarch64-unknown-linux-musl", &fake_dir, false).unwrap();
    let config =
        std_cargo_config_path("loongarch64-unknown-linux-musl", &wrapper, false, &[]).unwrap();
    let config = fs::read_to_string(config).unwrap();

    assert!(!config.contains("--cfg"));
    assert!(!config.contains("--check-cfg"));
    assert!(!config.contains("relocation-model"));
    assert!(!config.contains("code-model"));
}

#[test]
fn std_cargo_config_uses_static_link_mode_without_codegen_override() {
    let fake_dir = std_fake_lib_dir("aarch64-unknown-linux-musl").unwrap();
    let wrapper = std_linker_wrapper_path("aarch64-unknown-linux-musl", &fake_dir, false).unwrap();
    let app_config =
        std_cargo_config_path("aarch64-unknown-linux-musl", &wrapper, false, &[]).unwrap();

    let config = fs::read_to_string(app_config).unwrap();
    assert!(!config.contains("--cfg"));
    assert!(!config.contains("--check-cfg"));
    assert!(!config.contains("relocation-model"));
    assert!(!config.contains("code-model"));
}

#[test]
fn std_cargo_config_uses_dynamic_link_mode_without_codegen_override() {
    let fake_dir = std_fake_lib_dir("aarch64-unknown-linux-musl").unwrap();
    let wrapper = std_linker_wrapper_path("aarch64-unknown-linux-musl", &fake_dir, true).unwrap();
    let app_config =
        std_cargo_config_path("aarch64-unknown-linux-musl", &wrapper, true, &[]).unwrap();

    let config = fs::read_to_string(app_config).unwrap();
    assert!(!config.contains("--cfg"));
    assert!(!config.contains("--check-cfg"));
    assert!(!config.contains("relocation-model"));
    assert!(!config.contains("code-model"));
}

#[test]
fn std_cargo_config_and_wrapper_paths_are_partitioned_by_link_mode() {
    let fake_dir = std_fake_lib_dir("aarch64-unknown-linux-musl").unwrap();
    let static_wrapper =
        std_linker_wrapper_path("aarch64-unknown-linux-musl", &fake_dir, false).unwrap();
    let dynamic_wrapper =
        std_linker_wrapper_path("aarch64-unknown-linux-musl", &fake_dir, true).unwrap();
    let static_config =
        std_cargo_config_path("aarch64-unknown-linux-musl", &static_wrapper, false, &[]).unwrap();
    let dynamic_config =
        std_cargo_config_path("aarch64-unknown-linux-musl", &dynamic_wrapper, true, &[]).unwrap();

    assert_ne!(static_wrapper, dynamic_wrapper);
    assert_ne!(static_config, dynamic_config);
    assert!(
        static_wrapper
            .display()
            .to_string()
            .ends_with("linker-aarch64-unknown-linux-musl-static.sh")
    );
    assert!(
        dynamic_wrapper
            .display()
            .to_string()
            .ends_with("linker-aarch64-unknown-linux-musl-dynamic.sh")
    );
    assert!(
        static_config
            .display()
            .to_string()
            .ends_with("config-aarch64-unknown-linux-musl-static.toml")
    );
    assert!(
        dynamic_config
            .display()
            .to_string()
            .ends_with("config-aarch64-unknown-linux-musl-dynamic.toml")
    );
}

#[test]
fn std_linker_wrapper_filters_crt_and_replaces_fixed_libs() {
    let fake_dir = std_fake_lib_dir("x86_64-unknown-linux-musl").unwrap();
    let wrapper = std_linker_wrapper_path("x86_64-unknown-linux-musl", &fake_dir, false).unwrap();
    let wrapper = fs::read_to_string(wrapper).unwrap();

    assert!(wrapper.contains("rust-lld"));
    assert!(wrapper.contains("link_search_dirs=()"));
    assert!(wrapper.contains("archive_args=()"));
    assert!(wrapper.contains("add_link_search_dir"));
    assert!(wrapper.contains("append_lld_arg"));
    assert!(wrapper.contains("flush_archive_group"));
    assert!(wrapper.contains("--start-group"));
    assert!(wrapper.contains("--end-group"));
    assert!(wrapper.contains("find_linker_script"));
    assert!(wrapper.contains("failed to find linker.x in current linker search dirs"));
    assert!(!wrapper.contains("entry_symbol="));
    assert!(!wrapper.contains("link_mode_args="));
    assert!(wrapper.contains("dynamic_platform=0"));
    assert!(wrapper.contains("crtbegin"));
    assert!(wrapper.contains("static-pie"));
    assert!(wrapper.contains("-flavor"));
    assert!(wrapper.contains("-T*"));
    assert!(wrapper.contains("--eh-frame-hdr"));
    assert!(wrapper.contains("relro"));
    assert!(wrapper.contains("noexecstack"));
    assert!(!wrapper.contains("-znorelro"));
    assert!(!wrapper.contains("--gc-sections"));
    assert!(!wrapper.contains("-znostart-stop-gc"));
    assert!(wrapper.contains("libc.a"));
    assert!(wrapper.contains("libunwind.a"));
    assert!(wrapper.contains("-lgcc_s|-lgcc"));
    assert!(!wrapper.contains("--whole-archive"));
    assert!(!wrapper.contains("\"-u\""));
    assert!(!wrapper.contains("_start"));
}

#[test]
fn std_linker_wrapper_uses_explicit_dynamic_platform_mode() {
    let fake_dir = std_fake_lib_dir("aarch64-unknown-linux-musl").unwrap();
    let wrapper = std_linker_wrapper_path("aarch64-unknown-linux-musl", &fake_dir, true).unwrap();
    let wrapper = fs::read_to_string(wrapper).unwrap();

    assert!(wrapper.contains("find_linker_script"));
    assert!(!wrapper.contains("latest_build_output_script axplat.x"));
    assert!(!wrapper.contains("entry_symbol="));
    assert!(!wrapper.contains("link_mode_args="));
    assert!(wrapper.contains("dynamic_platform=1"));
    assert!(!wrapper.contains("_head"));
}

#[test]
fn std_build_dynamic_x86_64_prepares_binary_artifact() {
    let metadata = repo_metadata();
    let cargo = BuildInfo {
        ..BuildInfo::default()
    }
    .into_prepared_base_cargo_config_with_metadata(
        "arceos-helloworld",
        "x86_64-unknown-none",
        None,
        &metadata,
    )
    .unwrap();

    assert!(
        cargo
            .target
            .ends_with("scripts/targets/std/pie/x86_64-unknown-linux-musl.json")
    );
    assert!(cargo.to_bin);
    assert!(cargo.features.contains(&"ax-std/plat-dyn".to_string()));
    assert!(cargo.features.contains(&"ax-std/smp".to_string()));
    assert_eq!(
        cargo.env.get("AX_TARGET"),
        Some(&"x86_64-unknown-none".to_string())
    );
}