【问题标题】:How can I run a command::new(...) during cargo clean?如何在货物清洁期间运行命令::new(...)?
【发布时间】:2021-06-03 02:48:53
【问题描述】:

在学习 rust 时,我有一种粗略的方法来构建一个非 rust 的 c/c++ 库,该库位于子模块中。我的构建脚本 (build.rs) 现在看起来像:

use std::process::Command;

fn main() {

    // EXTERN_C
    // Build the c-library
    Command::new("make").args(&["-C", "cadd"]).status().unwrap();
    // The name of the library to link to, i.e. like: -l<lib>
    println!("cargo:rustc-link-lib=dylib=add_x64Linuxd");
    // The library search path for linking, i.e. like -L<path>
    println!("cargo:rustc-link-search=native=cadd/lib");
    // The run-time library search path (LD_LIBRARY_PATH)
    println!("cargo:rustc-env=LD_LIBRARY_PATH=cadd/lib");
}

这运行得很好,cadd/ 中的 makefile 可以整理出任何构建/重新构建的 deps 等。目前我唯一不能做的就是在运行 cargo clean 时挂钩 make -C cadd clean。理想情况下,我希望它同时运行 clean make 目标。该命令如下所示:

    Command::new("make").args(&["-C", "cadd", "clean"]).status().unwrap();

但我不知道如何在cargo clean 期间运行这样的命令。是否有像“构建脚本”一样的“干净脚本”或其他方法?

最终我将开始学习如何将我的 makefile 项目包装到一个货物箱中(我认为这是正确的术语) - 所以我知道这不是做到这一点的最佳方式,但我想让它工作首先是基本的方式(所以我的头不会爆炸!)。

【问题讨论】:

标签: rust rust-cargo


【解决方案1】:

cargo clean 命令只是删除 cargo 目标目录。

一种解决方案是让您的 Makefile 将其编译工件(它生成的所有文件)输出到目标目录中。

您还可以通过--target-dir CLI 选项或将以下内容添加到.cargo/config 来更改目录货物输出其工件:

[build]
target-dir = "some/path"

【讨论】:

  • 很有趣-我没有意识到它只是删除目标目录那么简单。这增加了将我的 c/c++ 库包装在货物箱中的重量 - 然后我可以使用 cagro clean-recursive。谢谢 - 不是我希望的答案,但很清楚我必须做什么。
猜你喜欢
  • 2011-11-12
  • 2012-01-10
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 2013-06-29
相关资源
最近更新 更多