#build #msvc #source #load #vcxproj

build-vcxproj

在 build.rs 中从 vcxproj 加载源代码

1 个不稳定版本

0.1.0 2024年4月26日

#1411 in 开发工具

MIT/Apache

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