我在用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!!");
}
}
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
不知道你这个问题是否已经解决, 如果还没有解决的话:问题解决方案如下:
由于测试脚本需要依赖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的相关文档,或者咨询相关领域的专家。