#兼容性 #std #alloc #移植 #标准 # #标志

无std compat-no-std

一个#![no_std]兼容层,使将您的crate移植到no_std变得简单

2个版本

0.4.1-patch12021年8月4日

#192 in 无标准库

MIT许可证

26KB
466

no-std-compat

一个#![no_std]兼容层,使将您的crate移植到no_std变得简单

从no-std-compat版本0.2.0开始默认支持稳定版Rust(查看问题#2)。

为什么存在这个项目

在Rust中,您可以选择禁用标准库(请参阅这里)。这样做将移除正常的std标准库,并添加core,同时可以选择添加alloc以支持内存分配。使用core + alloc的结果类似于std,许多使用std的项目已经可以“移植”到使用core + alloc

但是,每个用Rust编写的库都需要更新。这是因为常规做法是使用std。使用core需要有人打破常规,通常只在功能标志之后。与Web Assembly相比,几乎只有少数几个低级crate,如rand需要关注,因为即使某些功能无法工作,一切仍然在std下。

许多今天迁移到#![no_std]的crate都编写了一个名为std的小模块,该模块将libcore和liballoc一起转发。这些努力应该被统一。如果每个人都不需要单独遇到并找出如何修复相同的错误,我们将变得更强大。

使用方法

该库旨在尽量减少代码行数,以便将其复制粘贴到多个不同的库中。我的目标是让更多crate与#![no_std]兼容。它还考虑支持std,以及支持无std,这意味着您可能只需要很少的条件编译属性。

示例可以在example-crates/文件夹中找到。

1. 将此crate添加到Cargo.toml中,并启用您想要的任何功能(见下一节)。

Cargo.toml:

[dependencies]
no-std-compat = { version = "...", features = [ "alloc" ] }

2. 可选地,添加一个std标志,它会引入整个标准库并绕过此兼容性crate。这对于使用标准库进行调试以及为支持标准库的用户提供额外功能非常有用。以下代码可选std功能添加到no-std-compat,这将使其仅链接到标准库。

Cargo.toml:

[features]
default = [ "std" ] # Default to using the std
std = [ "no-std-compat/std" ]

3. 启用no_std,并将此crate重命名为std导入。这确保了所有旧导入在no_std上仍然有效。即使您想要使用std,启用no_std也是可以的 - no-std-compat会在发送正确的功能标志时自动引入std。当然,您也可以在这里使用除"std"之外的其他名称。但我还是建议使用"std"。

src/lib.rs:

#![no_std]

extern crate no_std_compat as std;

4. 在所有文件中导入预定义。这是因为在no_std中,rust会移除std导入,并改用仅导入core预定义。也就是说:目前,它不会单独导入alloc预定义。这也会导入宏和其他所需内容。

src/**.rs:

use std::prelude::v1::*;

可选功能

  • alloc:此功能会引入alloc并将其暴露在所有常规位置。也就是说:std::collection映射为alloc::collections,并将所有分配内容添加到预定义中。
  • std:此功能会引入整个标准库并覆盖所有其他功能。这实际上绕过了此crate。这在这里是为了避免需要功能门:只需将您的可选std功能转发到这里,我们处理其余部分。
  • unstable:此功能还会重新导出所有不稳定模块,除非您使用nightly编译,否则无法这样做。除非您需要不稳定模块,此crate支持稳定的rust。
  • compat_hash:此功能会引入hashbrown(它不是HashDoS-resistant!!但#![no_std])。目的是让您可以继续使用标准库中的安全HashMap,对于有标准库的用户来说,对于没有标准库的用户,则回退到一个不那么理想的选择。但请注意,如果在使用公共函数签名时使用此功能可能会引起混淆,因此可能应避免使用。但这取决于您!
  • compat_sync:此功能会引入spin并提供用于替换在std::sync中使用的一些内容的替代方案。
  • compat_macros:此功能添加了虚拟的printlneprintlndbg等实现,这些实现实际上什么都不做。关键在于,对于库功能不必要的任何调试函数或其他日志记录,在no_std中保持沉默。

贡献

更新粘合剂

你拉取了这个crate,却发现它过时了?幸运的是,这个crate已经准备好了。粘合剂可以通过Python脚本来简单重新生成。

确保你在某个地方下载了rust源代码。对于rustup来说,这不是问题。

rustup component add rust-src

现在你可以运行./generate.py > src/generated.rs。如果它选择了错误的rust版本或者完全崩溃,你可以通过--src手动指定源目录。就这么简单。当然,如果你忘记了参数名称,也可以运行./generate.py --help

更新功能列表

如果rust抱怨某个功能被要求但没有指定,或者可能关于某个功能未使用,这是因为在某些导入后面有功能门,而功能门会改变。大多数情况下,这就像在src/lib.rs中添加或删除指定功能的超长行一样简单。只有在使用unstable功能时才可能成为问题。

依赖关系

~0–355KB