sys no-std nstd-sys

C语言编写的跨平台通用库,用Rust实现

20个版本 (12个破坏性更新)

0.13.0 2024年2月17日
0.11.0 2023年11月23日
0.8.0 2023年7月20日
0.5.0 2023年3月16日
0.3.3 2022年11月27日

#97 in 无标准库

Download history 91/week @ 2024-03-29 21/week @ 2024-04-05

每月下载量126

MIT 许可证

570KB
7.5K SLoC

NSTD

一个跨平台、快速、安全的通用C库,用Rust编写。

该库组织为一组模块。顶级模块 nstd 包含整个包。每个模块可以有它们自己的子模块(例如 nstd.io.stdoutnstd::io::stdout,使用Rust语法)。

使用C的示例

// Build nstd with features set to "capi core io".
#include <assert.h>
#include <nstd.h>

/// Main entry point of the program.
int main(void) {
    const NSTDOptionalStr output_opt = nstd_core_str_from_raw_cstr("Hello, 🌎!");
    assert(output_opt.status);
    const NSTDStr output = output_opt.value.some;
    const NSTDIOError err = nstd_io_print_line(&output);
    assert(err == NSTD_IO_ERROR_NONE);
    return 0;
}

库模块

  • nstd - 一个用Rust编写的跨平台、快速、安全的通用C库。
    • alloc - 低级内存分配。
    • core - 为 nstd 提供核心功能。
      • alloc - 提供用于内存分配支持的有用类型。
      • cstr - 不拥有的C字符串切片。
        • raw - 原始C字符串处理。
      • cty - 提供用于检查和操作字符类型的功能。
      • def - 包含在 nstd 中使用的一些常见类型。
      • fty - 提供用于检查和操作浮点类型的功能。
      • ity - 提供用于检查和操作整型类型的功能。
      • math - 低级数学运算。
      • mem - 包含与原始内存交互的大多数不安全函数。
      • ops - 为可能引起溢出的类型和运算符提供重载。
      • optional - 表示一个可选(可能未初始化)的值。
      • ptr - 指向任意类型的带大小指针。
      • range - 数值范围。
      • result - 定义一个具有成功和错误变体的 "结果" 类型。
      • slice - 对内存中一系列值的视图。
      • str - 对UTF-8编码的字节字符串的未拥有视图。
      • time - 低级时间实用程序。
      • unichar - Unicode标量值。
    • cstring - 动态大小的、以null结尾的C字符串。
    • env - 进程环境管理。
    • fs - 提供对文件系统的访问。
      • file - 打开文件的句柄。
    • heap_ptr - 单值堆分配的指针类型。
    • io - 提供与标准I/O流交互的功能。
      • stderr - 标准错误流的句柄。
      • stdin - 标准输入流的句柄。
      • stdout - 标准输出流的句柄。
    • math - 高级数学运算。
    • mutex - 一个用于保护共享数据的互斥原语。
    • os - 操作系统特定功能。
      • unix - 低级类Unix操作系统支持。
        • alloc - 类Unix系统的内存分配。
        • io - 提供在Unix平台上处理输入和输出的功能。
        • mutex - 一个用于保护共享数据的互斥原语。
        • shared_lib - 为类Unix系统提供共享库访问。
        • time - Unix时间工具。
      • windows - Windows操作系统支持。
        • alloc - Windows的低级内存分配。
          • heap - Windows进程堆管理。
        • shared_lib - Windows的共享库/模块访问。
        • str - Windows的字符串切片扩展。
    • proc - 调用/子进程管理。
    • shared_lib - 访问已加载的共享库中的符号。
    • shared_ptr - 一个引用计数智能指针。
    • string - 动态大小的UTF-8编码的字节字符串。
    • thread - 线程创建、连接和分离。
    • time - 时间工具。
    • timed_mutex - 带定时锁定机制的互斥原语。
    • vec - 动态大小的值连续序列。

平台支持

nstd.core 应该支持Rust编译器支持的所有功能。此模块对裸机环境有第一类支持。

nstd.os 的子模块只能在它们针对的操作系统上工作。例如,nstd.os.windows 只能在Windows上工作,而 nstd.os.unix 只能在类Unix系统上工作。

其他模块将在大多数平台上工作,主要针对Windows、macOS、Linux、Android和iOS。

语言支持

此库可以从支持调用C代码的任何语言访问。目前,这需要手动完成,因为没有官方的包装器,但是当API变得更加稳定时,计划开始添加官方包装器,以便其他语言的开发者可以轻松使用API。

安全性

请注意,这些安全说明(以及整个框架)都是工作在进度中。

用户安全说明

  • 原始指针访问是不安全的。

  • 假设引用是有效的(对齐的、非空的和非悬挂的),并且是安全的访问。用户可以参考文档以查看哪些API期望或返回有效的引用。

  • 假设C函数指针非空,除非它们被包装在Option中。

  • 私有(非pub)结构体成员不允许用户直接访问。

  • 在访问之前必须检查标记枚举变体(例如NSTDOptionalNSTDResult类型)。

  • 当使用未实现Copy的类型时的值拷贝语义时,数据会被移动

  • 当数据被另一个对象引用时,数据不允许被移动或修改。

  • 未实现Send特征的类型不允许在线程之间发送。

  • 未实现Sync特征的类型不允许在线程之间共享。

贡献者安全注意事项

  • 任何可能导致未定义行为的操作必须标记为不安全。

  • API接受的全部C函数指针都必须标记为不安全。

  • 默认情况下,panic行为设置为终止,因为从Rust代码反解构到外部代码是未定义行为(尽管这可能会改变)。

如何构建

nstd构建为C库需要您手动指定"crate-type"。为此,您必须将--crate-type传递给rustc,可以是cdylibstaticlib。如果需要两者,Rust允许您多次使用此标志。

nstd让您选择想要使用哪些功能。

顶层模块下的任何模块都有一个专用的功能标志,例如nstd.core有功能标志core,而nstd.alloc有功能标志alloc

每个模块可能有额外的功能,例如nstd.os有用于Windows内存分配的附加os_windows_alloc功能,这允许其他模块使用Windows的低级内存分配API,而不必为其他操作系统启用内存分配。

std功能标志将Rust标准库链接到二进制文件中。

capi功能标志用于将nstd构建为C库。

link功能标志将链接到系统上现有的nstd库。此功能被鼓励,但不是必需的,对于使用nstdcapi功能的Rust包。

stdcore默认启用。

示例

cargo rustc --release --crate-type cdylib --crate-type staticlib --features "capi alloc string"

构建时启用所有模块

cargo rustc --release --crate-type cdylib --crate-type staticlib --features "nstd"

使用cargo-c安装

nstd还允许您使用cargo-c构建或安装库。

安装cargo-c

cargo install cargo-c

以下是一个示例,说明如何构建启用所有功能的Unix机器上的库

cargo cinstall --release --all-features --destdir=./install --prefix=/usr --libdir=/usr/lib

这将创建一个新目录install,其中包含安装内容。

现在您可以使用cp将内容复制到根目录

sudo cp -a ./install/* /

更多信息可以在cargo-c仓库以及Luca Barbato的这篇博客文章中找到。

发布

nstd版本遵循语义版本规则。每个版本都有一个主版本号、次版本号和补丁号,这些构成了库的版本(major.minor.patch)。

框架尚未稳定,因此尚未有任何重大版本发布。

每6周发布一个新的小版本,正好在新的小版本Rust发布后一周。

修补版本会不定期发布,包含一些小修复和新增功能。

有关语义版本化的更多信息,请参阅semver.org

依赖项

~0–8.5MB
~66K SLoC