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 2017年12月18日

#89 in Cargo 插件

Download history 36/week @ 2024-05-02 36/week @ 2024-05-09 40/week @ 2024-05-16 12/week @ 2024-05-23 59/week @ 2024-05-30 144/week @ 2024-06-06 150/week @ 2024-06-13 112/week @ 2024-06-20 116/week @ 2024-06-27 89/week @ 2024-07-04 57/week @ 2024-07-11 75/week @ 2024-07-18 88/week @ 2024-07-25 74/week @ 2024-08-01 74/week @ 2024-08-08 58/week @ 2024-08-15

309 每月下载量

MIT 许可证

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 使用它们。

要求

  • Rust,最好通过 rustup 安装(已测试 1.73)
  • Xcode(已测试 15.1)
  • Bash

安装

cargo install cargo-xcode

用法

TL;DR: 运行 cargo xcode 并将生成的项目文件作为其他 Xcode 项目的 子项目 使用。

此工具将为 Cargo 工作区中的所有二进制文件和兼容 C 的库生成具有 Rust 意识的项目文件。您不必直接修改 Mac/iOS 应用程序的项目文件,而是利用 Xcode 能够嵌套和组合多个 xcodeproj 文件的能力。生成的 Xcode 项目不打算独立使用。它们应该仅作为其他常规应用 Xcode 项目的 子项目 使用。

  1. 如果您还没有现有的ObjC/Swift应用程序项目,请使用您喜欢的Cocoa应用程序模板在Xcode中创建一个。在后续步骤中,这将被称为您的“父项目”。

  2. 如果您的Rust项目是一个库,请编辑Cargo.toml并添加

    [lib]
    crate-type = ["lib", "staticlib"] # cdylib is NOT recommended
    

    只有类型为"staticlib""cdylib"的Cargo库才适合,其中staticlib更容易使用(但为了与其它Cargo库和测试兼容,请保持"lib"crate类型)。如果您不需要处理动态库,请不要使用它们。尽可能使用静态库。

  3. Cargo.toml相同的目录下(或Cargo工作区的根目录)运行

    cargo xcode
    

    这将生成<rust-project-name>.xcodeproj。现在不要打开它!

  4. 在Xcode中打开您的父项目(步骤1),并将<rust-crate-name>.xcodeproj添加到工作区(将文件拖入父项目的侧边栏)。您应该会在父项目中看到嵌入的Rust-Xcode项目。如果新的Rust-Xcode项目在侧边栏中看起来为空,请关闭所有Xcode窗口,然后仅重新打开父项目。

  5. 在父项目应用程序的构建阶段中,在链接二进制与库阶段,您现在可以添加工作区中的Rust库。

此类使用的真实世界示例.

高级使用

您可以在Xcode目标中配置一些设置,在目标的构建设置

  • CARGO_XCODE_FEATURES对应于--features标志。命令cargo xcode --no-default-features将相同的标志传递给cargo build
  • RUSTUP_TOOLCHAIN选择要使用的工具链(nightly1.99.0stable、默认工具链为空字符串)。参见rustup toolchain add -h。命令cargo xcode --nightly选择nightly。
  • 根据需要将基本SDKSDKROOT)更改为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特性来支持这些平台。如果自动检测不工作

  1. RUSTUP_TOOLCHAIN构建设置设置为nightly(或如果你需要的话,具体nightly版本)。
  2. 在目标 › 构建阶段标签 › 编译源阶段,编辑Cargo.toml编译器标志列,并在其中追加-Zbuild-std

依赖关系

~1.5–2.5MB
~44K SLoC