使用Bazel Build

时间:2017-01-05 05:19:18

标签: bazel

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

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

认为我知道我能做到:

  1. 在命令行--copt '-DSTATIC_COMPILATION'
  2. 中添加bazel build
  3. 配置一个 bazelrc 文件,可以通过传递bazel build --config=static_comp来提供这样的配置 - 这很不错,但我不确定它将此包作为外部包传递给其他包 - 我在这里错了......
  4. 我缺少哪些选项?

1 个答案:

答案 0 :(得分:1)

简短的回答是,今天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中是硬编码的,我没有看到任何明显的滥用方法。它可以做你想要的。您可以想象,破解一个crosstool声明拱需要PIC进行动态链接,而不是静态链接,然后在两种情况下都用PIC声明,并设置附加标志。这将导致.pic.o和.o输出文件,尽管两者都包含PIC代码。如果您无法控制套期工具,这是行不通的,我也不建议这样做。

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