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

时间:2019-03-18 20:18:19

标签: rust conditional-compilation

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

1 个答案:

答案 0 :(得分:0)

您可以仅将构建代码放入build.rs中(或者可以让build.rs声明一个mod xyz来提取另一个文件)。

我想知道您要询问的问题是,是否可以从build.rs和main.rs中引用相同的代码,并且是否可以引用该代码是否被另一个调用。看来您可以在使用build.rs时打开环境变量集(使用类似option_env的方法,但更好的方法可能是在build.rs中启用主要代码中的功能。

(如果尚未阅读the documentation for build scripts,则为该书。)