Rust语言使用#[cfg(test)]
之类的属性支持conditional compilation。
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
生成外壳完成脚本。我对应用程序中的多个文件有一个全面的App
定义。我想在build.rs
中使用此功能,方法是使用include!(...)
宏(如clap
的{{3}})包含这些部分,因此我不必定义{{ 1}}。这会带来一些依赖性,我想在App
文件使用它们时排除这些依赖性,因为在这种情况下不需要它们。我正在尝试在build.rs
脚本中使用suggested。
答案 0 :(得分:0)
您可以仅将构建代码放入build.rs中(或者可以让build.rs声明一个mod xyz来提取另一个文件)。
我想知道您要询问的问题是,是否可以从build.rs和main.rs中引用相同的代码,并且是否可以引用该代码是否被另一个调用。看来您可以在使用build.rs时打开环境变量集(使用类似option_env
的方法,但更好的方法可能是在build.rs中启用主要代码中的功能。
(如果尚未阅读the documentation for build scripts,则为该书。)