1 个不稳定版本
0.1.0 | 2024年4月26日 |
---|
#1411 in 开发工具
14KB
270 行
在 build.rs 中加载 vcxproj 的信息
我正在使用 Rust 和 C++ 一起工作。工作线程使用 Visual Studio 编译 C++ 代码为静态库,并将其链接到 Rust 程序。但是存在一个问题。为了允许 Rust 程序独立编译,我需要在 build.rs 中指定大量信息,如编译选项和源文件列表。为了使 build.rs 更容易编写,我实现了这个库。
它可以读取文件列表和其他信息从 vcxproj,并根据版本配置提供常用的编译选项。这使得 build.rs 更短,更容易实现,因此源文件列表不需要在两个地方更新。
示例 build.rs
fn main() {
env::set_var("VSLANG", "1033");
let from_vs = env::var("VisualStudioDir").map(|x| !x.is_empty()).unwrap_or(false);
let is_debug = env::var("PROFILE").map(|x| x == "debug").unwrap_or(false);
let mut proj = Vcxproj::new("vs.proj/example.vcxproj", is_debug);
proj.load_config();
for ld in &proj.lib_dirs {
println!("cargo:rustc-link-search=native={}", ld);
}
if from_vs || Path::new(&proj.target_fn).is_file() {
println!("cargo:rerun-if-changed={}", proj.target_fn);
println!("cargo:rustc-link-lib=static={}", proj.target);
} else {
for srcfile in &proj.sources {
println!("cargo:rerun-if-changed={}", srcfile);
}
for header in glob::glob("src/**/*.h").unwrap() {
println!("cargo:rerun-if-changed={}", header.unwrap().display());
}
let mut cco = cc::Build::new();
cco.cpp(true).std("c++20").files(&proj.sources);
for inc in &proj.include_dirs {
cco.flag(&format!("-I{}", inc));
}
for f in &proj.flags {
cco.flag(f);
}
cco.compile(&proj.basename());
}
if proj.find_lib("utilwin") {
println!("cargo:rustc-link-lib=utilwin");
}
// add other libraries
}
依赖项
~255KB