我在用Rust写一个不依赖于std的crate,并设置target = "x86_64-unknown-uefi"。但是测试脚本(cargo test)需要依赖std,我该如何去配置?

我在用Rust写一个不依赖于std的crate,并设置target = "x86_64-unknown-uefi"。但是测试脚本(cargo test)需要依赖std,我该如何去配置?

.cargo/config代码如下:

[build]
target = "x86_64-unknown-uefi"

[unstable]
build-std = ["core", "alloc"]
build-std-features = ["compiler-builtins-mem"]

example.rs代码如下:

#![cfg_attr(not(test), no_std)]
#![allow(dead_code)]

fn main() {

}

#[cfg(test)]
mod test {
    #[test]
    fn a() {
        println!("Hello, world!");
    }
}

现在需要执行cargo test命令以成功执行测试函数a

先给测试构建一个单独的的目标,这个目标具有std功能。第一步就是:你在.cargo/config文件中添加下下面内容来为你的测试构建一个单独的目标:

[target.'cfg(test)']
rustflags = ["--cfg", "use_std"]

第二步就是:构建完成后你可以使用#[cfg(test)]这个属性来区分一下你的测试和非测试的代码,并在测试代码中使用标准库功能,如下:

#[cfg(test)]
mod tests {
    #[test]
    fn test_something() {
        assert_eq!(2 + 2, 4);
        // 使用std特性
        std::println!("Hello, world!!");
    }
}

如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答由chatgpt基于相关博客总结生成:

    问题解决方案如下:

    由于测试脚本需要依赖std库才能成功运行,所以我们需要对测试脚本进行特殊处理,以确保其依赖的库与我们的crate不冲突。

    首先,在项目目录下创建一个新的目录,命名为tests,并在该目录下创建一个新的文件,命名为example_test.rs

    example_test.rs文件中,我们需要手动引入一些依赖项,以避免与std库冲突。同时,我们还需要为测试函数提供一个入口点来执行测试。

    下面是修改后的example_test.rs代码示例:

    #![no_std]
    
    // 具体根据你的项目依赖进行引入
    extern crate core;
    extern crate alloc;
    
    #[cfg(test)]
    mod test {
        use super::*;
    
        #[test]
        fn a() {
            // 在这里写下你的测试代码
            println!("Hello, world!");
        }
    }
    
    #[no_mangle]
    extern "C" fn efi_main(
        _image_handle: uefi::Handle,
        _system_table: &mut uefi::SystemTable<uefi::Boot>,
    ) -> uefi::Status {
        // 模拟执行测试函数
        test::a();
    
        uefi::Status::SUCCESS
    }
    

    接下来,我们需要修改我们的Cargo.toml文件,以便正确地配置测试。

    [dev-dependencies]部分下添加以下依赖项:

    [juniper.dependencies]
    uefi = "0.9"
    

    最后,执行cargo test命令即可成功执行测试函数a。

    注意:在进行测试时,请确保你已经正确地安装了uefi库,并且你有一个合适的测试环境来运行测试。如果你还没有正确设置测试环境,你可能需要参考相关文档来进行配置。

    请注意,由于Rust在UEFI环境中的支持仍然比较有限,可能会面临一些其他的挑战和限制。如果遇到其他问题,建议参考Rust和UEFI的相关文档,或者咨询相关领域的专家。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^