15 个稳定版本
1.11.0 | 2024年6月12日 |
---|---|
1.10.0 | 2024年1月15日 |
1.9.0 | 2023年10月29日 |
1.5.0 | 2022年9月20日 |
0.1.1 |
|
#89 in Cargo 插件
309 每月下载量
48KB
802 行
Rust 库作为 Xcode 项目
从 Cargo.toml
生成 Xcode 项目文件,允许在 Mac 和 iOS 应用程序中使用 Rust 库而无需离开 Xcode。
功能
比仅从脚本中运行 cargo build
更好
- 支持通用二进制文件(lipo)和交叉编译(iOS/tvOS/macOS/watchOS/Simulator/Mac Catalyst,Apple Silicon/Intel)。
- 配置 Cargo 以遵循 Xcode 的调试和发布配置,并使用 Xcode 的标准构建和临时文件夹。
- 让 Xcode 了解依赖项,仅在需要时重新构建 Rust 代码。
- 支持 Cargo 工作区和每个包的多个目标。
- 可以构建具有正确设置安装名称的动态库。
生成的 Xcode 项目文件是自包含的,无需 cargo-xcode
依赖即可工作。您可以分发 .xcodeproj
文件,并使用 Rust 和 Xcode 使用它们。
要求
安装
cargo install cargo-xcode
用法
TL;DR: 运行
cargo xcode
并将生成的项目文件作为其他 Xcode 项目的 子项目 使用。
此工具将为 Cargo 工作区中的所有二进制文件和兼容 C 的库生成具有 Rust 意识的项目文件。您不必直接修改 Mac/iOS 应用程序的项目文件,而是利用 Xcode 能够嵌套和组合多个 xcodeproj
文件的能力。生成的 Xcode 项目不打算独立使用。它们应该仅作为其他常规应用 Xcode 项目的 子项目 使用。
-
如果您还没有现有的ObjC/Swift应用程序项目,请使用您喜欢的Cocoa应用程序模板在Xcode中创建一个。在后续步骤中,这将被称为您的“父项目”。
-
如果您的Rust项目是一个库,请编辑
Cargo.toml
并添加[lib] crate-type = ["lib", "staticlib"] # cdylib is NOT recommended
只有类型为
"staticlib"
或"cdylib"
的Cargo库才适合,其中staticlib
更容易使用(但为了与其它Cargo库和测试兼容,请保持"lib"
crate类型)。如果您不需要处理动态库,请不要使用它们。尽可能使用静态库。 -
在
Cargo.toml
相同的目录下(或Cargo工作区的根目录)运行cargo xcode
这将生成
<rust-project-name>.xcodeproj
。现在不要打开它! -
在Xcode中打开您的父项目(步骤1),并将
<rust-crate-name>.xcodeproj
添加到工作区(将文件拖入父项目的侧边栏)。您应该会在父项目中看到嵌入的Rust-Xcode项目。如果新的Rust-Xcode项目在侧边栏中看起来为空,请关闭所有Xcode窗口,然后仅重新打开父项目。 -
在父项目应用程序的构建阶段中,在链接二进制与库阶段,您现在可以添加工作区中的Rust库。
高级使用
您可以在Xcode目标中配置一些设置,在目标的构建设置中
CARGO_XCODE_FEATURES
对应于--features
标志。命令cargo xcode --no-default-features
将相同的标志传递给cargo build
。RUSTUP_TOOLCHAIN
选择要使用的工具链(nightly
、1.99.0
、stable
、默认工具链为空字符串)。参见rustup toolchain add -h
。命令cargo xcode --nightly
选择nightly。- 根据需要将基本SDK(
SDKROOT
)更改为iOS、DriverKit等。 - 如果您不是交叉编译,请删除
ADDITIONAL_SDKS
选项,或运行cargo xcode --platforms macosx
。
您几乎总是应该使用静态库(.a
)。动态库(.dylib
/cdylib
)构建起来更困难,正确嵌入也更为复杂,并且会增加应用程序包的冗余,包含Rust标准库的重复副本和无效代码。但如果你足够勇敢,仍然要构建一个.dylib
以包含在应用程序包中,请确保在Xcode的设置中将DYLIB_INSTALL_NAME_BASE
设置为@executable_path/../Frameworks/
或你打算复制库到的任何位置。
如果你在应用程序包中放置Rust的二进制文件,你可能需要设置SKIP_INSTALL=YES
或运行cargo xcode --skip-install
。
Xcode支持从文本文件中读取配置,这对于在多个项目中共享设置非常有用。你可以使用--xcconfig debug.xcconfig --xcconfig release.xcconfig
指定这些。
限制
Rust二进制文件被导出为命令行工具。这个工具故意不制作应用程序包。如果你想要构建Mac GUI应用程序,请在Xcode中以ObjC或Swift项目创建一个,并通过Rust静态库调用Rust代码,或者使用Tauri。
DIY-Tier平台
AppleTV、Mac Catalyst、VisionOS和一些其他罕见的平台没有预先构建的rustup目标。cargo xcode
将尝试使用nightly工具链和-Zbuild-std
特性来支持这些平台。如果自动检测不工作
- 将
RUSTUP_TOOLCHAIN
构建设置设置为nightly
(或如果你需要的话,具体nightly版本)。 - 在目标 › 构建阶段标签 › 编译源阶段,编辑
Cargo.toml
的编译器标志列,并在其中追加-Zbuild-std
。
依赖关系
~1.5–2.5MB
~44K SLoC