#macos-ios #blocks #objective-c #ios #block #macos #sys

sys no-std block-sys

对Apple C语言块扩展的原始绑定

9个版本

0.2.1 2024年1月7日
0.2.0 2023年2月7日
0.1.0-beta.22022年12月24日
0.1.0-beta.12022年8月28日
0.0.1 2021年11月22日

#40 in macOS和iOS API

Download history 52938/week @ 2024-04-23 45912/week @ 2024-04-30 45944/week @ 2024-05-07 46251/week @ 2024-05-14 45931/week @ 2024-05-21 51613/week @ 2024-05-28 54561/week @ 2024-06-04 60035/week @ 2024-06-11 59615/week @ 2024-06-18 59706/week @ 2024-06-25 52809/week @ 2024-07-02 51158/week @ 2024-07-09 46417/week @ 2024-07-16 45781/week @ 2024-07-23 41971/week @ 2024-07-30 39930/week @ 2024-08-06

每月下载量 183,688

MIT 许可证

47KB
459

block-sys

Latest version License Documentation CI

此crate已弃用。请使用 block2::ffi 代替。

对Apple C语言块扩展的原始Rust绑定。

此crate是objc2 项目的一部分,有关相关crate的信息请参阅该项目。

运行时支持

此库是对明确指定的Blocks ABI的原始接口。然而,存在不同的运行时实现,它们以略有不同的方式(并具有多个不同的辅助函数)操作,最重要的方面是库的命名不同,因此链接必须考虑这一点。

您可以通过使用相关的cargo功能标志来选择所需的运行时,参见以下章节(您可能需要先禁用默认的 apple 功能)。注意,如果 objc-sys crate存在于模块树中,则应启用与该crate相同的特征标志。

Apple的 libclosure

  • 功能标志: apple

这是最复杂的运行时,它比规范所要求的具有更多的功能。默认情况下使用。

最低所需的操作系统版本如下

  • macOS: 10.6
  • iOS: 3.2
  • tvOS: 未知
  • watchOS: 未知

尽管实际上Rust本身需要更高版本的操作系统。

LLVM compiler-rtlibBlocksRuntime

  • 功能标志: compiler-rt

这是苹果公司较旧的(大约是 macOS 10.6)运行时的副本,现在也用于 Swift 的 libdispatchFoundation

运行时和相关头文件可以使用 libblocksruntime-dev 包安装到许多 Linux 系统上。

使用此运行时可能无法与 objc-sys 砖一起工作。

GNUStep 的 libobjc2

  • 功能标志: gnustep-1-7gnustep-1-8gnustep-1-9gnustep-2-0gnustep-2-1,具体取决于您使用的版本。

GNUStep 有点奇怪,因为它将其块支持捆绑到其 Objective-C 运行时中。这意味着我们必须链接到 libobjc,这是通过依赖于 objc-sys 砖来实现的。虽然有点不规范,但它是可行的。

源代码

微软的 WinObjC

  • 功能标志: unstable-winobjc

不稳定:尚未在 Windows 上测试!

基于 GNUStep 的 libobjc2 1.8 版本的 分支

ObjFW

  • 功能标志: unstable-objfw

不稳定:尚未工作!

待办事项。

C 编译器配置

据我们所知,目前只有 clang 支持 块语言规范。为了帮助编译使用这些功能的 C(或 Objective-C)源代码,此砖的构建脚本将 DEP_BLOCK_0_2_CC_ARGS 环境变量暴露给下游构建脚本。

在您的 build.rs 中的示例用法(使用 cc 砖)如下所示

fn main() {
    let mut builder = cc::Build::new();
    builder.compiler("clang");
    builder.file("my_script_using_blocks.c");

    for flag in std::env::var("DEP_BLOCK_0_2_CC_ARGS").unwrap().split(' ') {
        builder.flag(flag);
    }

    builder.compile("libmy_script_using_blocks.a");
}

依赖项