【问题标题】:How to package source code from outside the project directory with Cargo?如何使用 Cargo 从项目目录之外打包源代码?
【发布时间】:2016-07-21 03:18:50
【问题描述】:

我正在尝试为 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 目录中,因为那样会导致无法合并上游。

【问题讨论】:

  • 符号链接怎么样?或者,Rust 绑定应该在一个单独的项目中,您可以使用 git 子模块来引用 C++ 代码。
  • git 工具(git submodulegit subtee)可以更轻松地管理您自己的远程存储库。如果这对您有用,我可以详细说明。
  • rust-lua53 项目采用了不同的方法,在构建时从build.rs 下载 Lua 源代码。

标签: rust rust-cargo


【解决方案1】:

一般解决方法:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    相关资源
    最近更新 更多