如何用Cargo从项目目录外打包源码?

How to package source code from outside the project directory with Cargo?

我正在尝试为 C++ 库 cryptominisat 创建 Rust 绑定。实际代码有效,但我不确定如何将其与 Cargo 正确打包。

git 存储库看起来像

src/
    c++ code here
.gitignore
readme, etc.

我添加了一个 rust 目录,并像这样在其中创建了我的 Cargo 项目

rust/
    cryptominisat/
        Cargo.toml
        build.rs
            src/
                rust code here
src/
    c++ code here
.gitignore
readme, etc.

不幸的是,cargo package 似乎不想打包 rust/cryptominisat 目录之外的任何东西,这意味着它不包含实际构建库所需的 C++ 代码。我能做什么?如果可以避免的话,我不想将整个存储库移动到 rust 目录中,因为那样将无法合并上游。

一般的解决方式:

  • 使用 git 子模块(或发布前的脚本 运行)将 C++ 存储库的副本嵌入到 Rust 存储库中(例如 rust/cryptominisat/vendor/ ).在开发期间,您可以使用 symlink 来避免拥有两份 C++ 代码。

  • 使用 build.rs 在构建时下载 tarball/clone/rsync 代码。您可以将其转储到 Cargo 指定的 OUT_DIR env var 中,以避免污染用户可见的目录。

  • 使C++代码成为系统级库。 Rust 包不会构建它,但期望它已经安装,并且只搜索它并为它指定 link 标志。这就是大多数 *-sys 板条箱的工作方式。