rust - 当我没有对它进行任何更改时,是否可以避免重新编译一个板条箱?
问题描述
我有一个 Rust crate,它是一个大型 C API 的包装器,编译需要几分钟。在目录中运行cargo build
而不进行任何更改总是会导致重新编译。除非我做出改变,否则 Cargo 似乎不应该重新编译这个 crate,而我没有这样做。
我想编译一次 crate 并避免重新编译 crate,除非我进行更改。我有什么办法可以避免不断地重新编译这个脚本?
在我的 crate 的构建脚本中似乎有些地方不正确。我将尝试创建一个最小的可重现示例,但同时我提供了以下构建脚本:
use std::env;
use std::fs::copy;
use std::path::Path;
use std::process::Command;
fn main() {
let out_dir = env::var("OUT_DIR").unwrap();
let c_src_path = Path::new("parasail_c");
// configure the build
Command::new("cmake")
.arg(".")
.current_dir(&c_src_path)
.output()
.expect("Failed to configure parasail.");
// build the library
Command::new("make")
.current_dir(&c_src_path)
.output()
.expect("Failed to build parasail.");
// put the static library in the right directory so we can clean up
let target_file = format!("{}/libparasail.so", out_dir);
copy("parasail_c/libparasail.so", target_file)
.expect("Problem copying library to target directoy.");
let target_file = format!("{}/parasail.h", out_dir);
copy("parasail_c/parasail.h", target_file)
.expect("Problem copying header to target directoy.");
// clean up the temporary build files
Command::new("make")
.current_dir(&c_src_path)
.arg("clean")
.output()
.expect("Failed to clean up build files.");
// clean up the configuration files
Command::new("make")
.arg("distclean")
.current_dir(&c_src_path)
.output()
.expect("Failed to clean up configuration files.");
// let cargo know that it can find the file in the out directory
println!("cargo:rustc-link-search=native={}", out_dir);
println!("cargo:rustc-link-lib=dylib=parasail");
}
这是来自的输出cargo build --verbose
cargo build --verbose
Compiling parasail-sys v0.1.0 (/home/fortier/testcode/rust/pairhmm/parasail-sys)
Fresh libc v0.2.51
Running `/home/fortier/testcode/rust/pairhmm/parasail-sys/target/debug/build/parasail-sys-f2d2d1f27a70b4d4/build-script-build`
Running `rustc --edition=2018 --crate-name parasail_sys src/lib.rs --color always --crate-type lib --emit=dep-info,link -C debuginfo=2 -C metadata=8879665b3d9bf7e1 -C extra-filename=-8879665b3d9bf7e1 --out-dir /home/fortier/testcode/rust/pairhmm/parasail-sys/target/debug/deps -C incremental=/home/fortier/testcode/rust/pairhmm/parasail-sys/target/debug/incremental -L dependency=/home/fortier/testcode/rust/pairhmm/parasail-sys/target/debug/deps --extern libc=/home/fortier/testcode/rust/pairhmm/parasail-sys/target/debug/deps/liblibc-bc949bf21f4fe772.rlib -L native=/home/fortier/testcode/rust/pairhmm/parasail-sys/target/debug/build/parasail-sys-2ac393455c1f3545/out -l dylib=parasail`
Finished dev [unoptimized + debuginfo] target(s) in 1m 58s
经过进一步检查,我发现问题出在子箱包装的 C 代码中。我用旧版本替换了当前的 C 代码,而没有更改任何 Rust 代码,问题就消失了。我会继续做一些进一步的调查,看看究竟是什么导致了这个问题,一旦我缩小范围,我会更新这篇文章。
解决方案
println!("cargo:rerun-if-changed={}", &file);
为每个文件和每个目录添加到构建脚本行。
推荐阅读
- c# - 在其他应用程序中获得控制焦点
- c# - Razor Pages POST 处理程序在 IIS 上返回 404
- python-3.x - 将 Python 版本降级到 3.6 后 conda_env 包不可用
- python - 上游跳过时气流“none_failed”跳过
- go - Kubernetes Helm 图表:使用 _helpers.tpl 连接值并反馈到 Values.yaml
- android - 所有活动中的Android导航抽屉/
- css - Bootstrap / CSS 未在我的 ASP 应用程序中加载
- javascript - 如何解决 Vue.js 中的“TypeError:不是函数”错误?
- java -
- r - 编写一个函数,使用 for 循环根据字符向量替换数据集中一列的报告值