Rust Cargo 和 Conan C/C++ 包管理器集成
Cargo 和 Conan 都生成跨平台、C 兼容的二进制文件,并且具有类似的易用性目标。互操作性是一个明显的步骤。
让我们看一下 Rust、Cargo 和 Conan C/C++ 包管理器,以及它们如何协同工作,以简化使用嵌入式 C 代码创建更好的 Rust 代码的过程。
Rust 包,总是可重复构建吗?
摘自其网站
«Cargo 是一种工具,允许 Rust 项目声明其各种依赖项,并确保您始终获得可重复构建的结果。»
但是,当您谈论 C 库依赖项和跨平台支持时……您可能需要一些帮助来处理“始终可重复”的问题并保持其整洁。
Cargo 集成 C 代码的解决方案是
«允许包指定一个(用 Rust 编写的)脚本,在调用 rustc 之前运行。Rust 被用来实现特定于平台的配置,并在包之间重构常见的构建功能。»
我们确实认为这是一种很好的方法,但如果我们希望保持 Rust 代码跨平台,这也是一个很大的问题。
Conan 来救援!
Cargo 只需要知道以下关于 C 库的信息
- 我们需要链接哪些库。
- 这些库在哪里。
- 这些库的头文件在哪里。
Cargo 要求构建脚本输出将某些变量赋值给您要构建的 C 库的适当值,类似于这样
fn main() {
println!("cargo:rustc-link-search=native=/path/to/my/lib");
println!("cargo:rustc-link-lib=mylibname");
println!("cargo:include=/path/to/my/lib/headers");
}
因此,问题是如何以跨平台的方式检索计算机所需的 C 库、根据需要构建二进制文件并自动获取包含目录、库名称和库目录。Conan 包管理器可以完成这些任务,并且它非常了解所有这些路径和库的位置以及它们的链接顺序(如果您有传递依赖项,这一点非常重要)
此外,Cargo 需要的文件格式非常简单,因此可以使用 Conan 生成器轻松自动化。Conan 生成器会生成一个可以被特定工具使用的输出文件。例如,Conan 已经内置了用于 cmake、visual studio、xcode 等的生成器。
通过最近引入的生成器包,我们可以像要求 Conan 包一样创建和要求生成器。因此,我们可以使用所需的依赖项和 Cargo 生成器编写我们的 conanfile.txt 文件
conanfile.txt:
[requires]
ConanCargoWrapper/0.1@lasote/testing
OpenSSL/1.0.2h@lasote/stable
[generators]
ConanCargoWrapper
并执行 conan install
$ conan install
Conan 自动生成了一个 **conan_cargo_build.rs** 文件。此文件应在 git(或任何其他版本控制系统)中忽略,因为它将在每个干净的项目中使用“conan install”命令重新生成。
编辑您的 **Cargo.toml** 文件并指定构建脚本
[package]
name = "mypackage"
version = "0.1.0"
build = "conan_cargo_build.rs"
现在构建您的 Cargo 项目
$ cargo clean
$ cargo build
需要添加新的 C 或 C++(带有 C API)依赖项?将其添加到 conanfile.txt 并执行 conan install
现在,我们可以说 Rust 包 Cargo 构建(也使用 C/C++ 代码)是始终可重复构建的。
您可以在此处找到 conan-cargo 生成器及其文档。