Rust build.rs脚本的条件编译?

问题描述 投票:3回答:1

Rust语言使用conditional compilation等属性支持#[cfg(test)]。 Rust还支持build scripts使用build.rs文件来运行代码作为构建过程的一部分来准备编译。

我想在Rust代码中使用条件编译来有条件地编译,这取决于我们是否正在编译构建脚本,类似于test构建的可能性。

想象一下:

#[cfg(build)]
fn main() {
    // Part of build script
}

#[cfg(not(build))]
fn main() {
    // Not part of build script, probably regular build
}

这不起作用,因为build在这里不是有效的标识符。是否可以使用不同的属性来执行此操作,还是可以使用其他一些技巧来实现类似的功能?


对于这个问题的一些背景: 我的目标是在编译时通过clap生成shell完成脚本。我在应用程序中的多个文件中有一个非常全面的App定义。我想在build.rs中使用include!(...)宏(由suggested作为clap)包含这些部分,因此我不必再次定义App。这会带来一些依赖关系,我想在build.rs文件使用时将其排除,因为在这种情况下不需要它们。 This是我试图在我的build.rs脚本中提供的。

rust conditional-compilation
1个回答
0
投票

你可以把构建代码放在build.rs中(或者可能有build.rs声明一个mod xyz来引入另一个文件)。

我想知道你要问的问题是你是否可以从build.rs和main.rs中引用相同的代码,如果可以,那么代码可以告诉它是否被其中一个调用。看起来你可以在使用build.rs时使用环境变量集(使用类似option_env的东西,但可能更好的方法是在build.rs中启用主代码中的功能。

(如果你还没有读过the documentation for build scripts,请阅读。)

© www.soinside.com 2019 - 2024. All rights reserved.