覆盖依赖项的构建脚本

kpo*_*zin 4 rust rust-cargo

我正在构建一个 Rust crate,它对一些*-sys包装本机库的crate 具有传递依赖关系。该*-sys包装箱采用build.rs建立与CMake的,这是不是我的环境中支持的机库。

我已经在我的项目树的其他地方预建了这些本地库。我想覆盖构建脚本以使其不运行,而是使用现有的本机库。

如果清单包含 links 键,则 Cargo 支持覆盖使用自定义库指定的构建脚本。此功能的目的是防止完全运行有问题的构建脚本,而是提前提供元数据。

要覆盖构建脚本,请将以下配置放置在任何可接受的 Cargo 配置位置。

[target.x86_64-unknown-linux-gnu.foo]
rustc-link-search = ["/path/to/foo"]
rustc-link-lib = ["foo"]
root = "/path/to/foo"
key = "value"
Run Code Online (Sandbox Code Playgroud)

来源:货物参考 > 构建脚本

我基于该文档的初步猜测是,我只需要rustc-link-lib在声明依赖项时添加,但这似乎不起作用。

[package]
# ...

[dependencies]
# ...
harfbuzz-sys = { version = "0.3", rustc-link-lib = ["harfbuzz"] }
# ...
Run Code Online (Sandbox Code Playgroud)

Cargo 仍然尝试调用build.rs并失败。

是否有正确的方法来覆盖我项目中所有可传递依赖项的harfbuzz-sys's build.rs

Jmb*_*Jmb 5

您需要将覆盖信息放入Cargo 配置文件之一。例如harfbuzz-sys,您可以将其放入.cargo/config您的工作区中:

[target.machine-vendor-os.harfbuzz]
rustc-link-search = ["/path/to/staging/usr/lib"]
rustc-link-lib = ["harfbuzz"]
Run Code Online (Sandbox Code Playgroud)

注意第一行:

  • machine-vendor-os必须与您使用--target选项赋予货物的价值相同。
  • harfbuzz必须与您的依赖links项中定义的键相同。Cargo.toml

第二行/path/to/staging/usr/lib是预编译依赖项在构建系统上的路径。