#std #porting #standard #compatibility #layer #alloc #options

无标准库 no-std-compat

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

6个版本 (3个破坏性版本)

0.4.1 2020年8月9日
0.4.0 2020年4月4日
0.3.0 2020年2月5日
0.2.0 2019年8月24日
0.1.0 2019年4月20日

16无标准库 中排名

Download history 158091/week @ 2024-03-14 158623/week @ 2024-03-21 185039/week @ 2024-03-28 178504/week @ 2024-04-04 181853/week @ 2024-04-11 184769/week @ 2024-04-18 173810/week @ 2024-04-25 171639/week @ 2024-05-02 180427/week @ 2024-05-09 188847/week @ 2024-05-16 199636/week @ 2024-05-23 214237/week @ 2024-05-30 212850/week @ 2024-06-06 197419/week @ 2024-06-13 192315/week @ 2024-06-20 187904/week @ 2024-06-27

837,342 每月下载量
用于 373 个crate (64 个直接使用)

MIT 许可证

22KB
408

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,以及支持no 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”之外的其他名称。但我推荐这样做。

src/lib.rs:

#![no_std]

extern crate no_std_compat as std;

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

src/**.rs:

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

可选功能

  • alloc:此功能会引入alloc并将其暴露在所有常规位置。也就是说,std::collection被映射到alloc::collections,并将所有分配内容添加到预lude中。
  • 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–250KB