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
脚本中提供的。
你可以把构建代码放在build.rs中(或者可能有build.rs声明一个mod xyz来引入另一个文件)。
我想知道你要问的问题是你是否可以从build.rs和main.rs中引用相同的代码,如果可以,那么代码可以告诉它是否被其中一个调用。看起来你可以在使用build.rs时使用环境变量集(使用类似option_env
的东西,但可能更好的方法是在build.rs中启用主代码中的功能。
(如果你还没有读过the documentation for build scripts,请阅读。)