使用 Bazel Build 发送静态编译的特定编译标志

Sending specific compilation flags for static compilation with Bazel Build

在我的项目中,我们的代码在为静态链接编译时必须在编译代码时添加一个定义。假设它是 -DSTATIC_COMPILATION.

我的问题:是否可以在请求静态链接或任何基于链接绑定的编译标志时控制编译标志?

我认为我可以做到:

  1. 在命令行中添加一个--copt '-DSTATIC_COMPILATION'bazel build
  2. 配置一个 bazelrc 文件,可以通过传递 bazel build --config=static_comp 来提供这样的配置 - 这很好,但我不确定它会在使用时传递给其他包这个包作为外部包 - 我在这里可能是错的...

我缺少哪些选项?

简短的回答是,目前 Bazel 无法根据代码是静态链接还是动态链接来设置标志。

Bazel 的 cc_library 确实在需要 PIC 进行动态链接的架构上编译代码两次,但不 需要 PIC 进行静态链接 - 一次有 PIC,一次没有 PIC。这主要是为了提高静态链接可执行文件的性能,因为 non-PIC 代码通常更快。

请注意,Bazel 中的 cc_test 规则默认是动态链接的,而 cc_binary 规则默认是静态链接的,因此 PIC/no-PIC 的区别需要对几乎所有 [=24] 进行双重编译=]++ 源代码。对于额外的复杂性,请注意 PIE 可执行文件需要 PIC-compiled 代码,因此如果您想要需要 PIE 可执行文件的 ASLR,则代码始终编译为 PIC。

但是,PIC/no-PIC 的支持是 cc_library 中的 hard-coded,我看不出有任何明显的方法可以 'abuse' 它来做你想做的事。您可以想象破解一个 crosstool 来声明 arch 需要 PIC 进行动态链接,而不是静态链接,然后无论如何在这两种情况下都使用 PIC 声明并设置附加标志。这将导致 .pic.o 和 .o 输出文件,尽管两者都包含 PIC 代码。如果你不能控制交叉工具,这是行不通的,我不建议这样做。

也就是说,可能还有其他方法可以实现您想要的。介意详细说明为什么您需要为静态链接代码设置一个特例吗?