使用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。这主要是为了静态链接的可执行文件的性能,因为非PIC代码通常更快。

请注意,Bazel中的cc_test规则在默认情况下是动态链接的,而cc_binary规则在默认条件下是静态链接的,因此PIC/no-PIC的区别需要对几乎所有的C/C++源代码进行双重编译。为了增加复杂性,请注意,PIE可执行文件需要PIC编译的代码,因此,如果您想要ASLR,它需要PIE可运行文件,则代码始终编译为PIC。

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

也就是说,可能还有其他方法可以实现你想要的。请仔细说明为什么需要为静态链接的代码设置特殊情况?