在bazel中创建仅系统标头库的正确方法是什么?

时间:2019-01-09 20:02:58

标签: c++ bazel

我们正在将CMake项目迁移到Bazel。我们在CMake项目中有几个标有SYSTEM的仅标头库,以禁止显示某些警告。将这些迁移到Bazel时,我们可以通过以下方式进行这项工作

cc_library(
    name = "lib",
    srcs = ["include/header1.h", ...],
    includes = ["include"],
)

这有效,但是按照Bazel C++ documentation,建议不要在srcs中包含接口/公共头。这些应该是hdrs的一部分。将这些添加到标头不起作用,因为它使用基于常规-I的包含而不是-isystem

尽管bazel不建议这样做,但这样做是否还行呢?如果没有,那么正确的方法是什么?

编辑: 经过一番挖掘之后,在textual_hdrs上找到了cc_library属性,并使用它似乎也可以使用。与将公共标头添加到srcs相比,这似乎是一种更干净的方法。现在规则看起来像这样

cc_library(
    name = "lib",
    textual_hdrs = ["include/header1.h", ...],
    includes = ["include"],
)

对于我们来说,这似乎是一个不错的解决方案,只是textual_hdrs上的文档不够清楚,无法表明其含义。

PS:我们真的不可能重构代码来解决警告,因为有许多类似这样的库,而这完全超出了迁移工作的范围。

1 个答案:

答案 0 :(得分:1)

如果您确定strip_include_prefix为None(或未通过),则将其添加到hdrs 可以。我们有一个宏,它包装了cc_library实例,并且默认将strip_include_prefix设置为空字符串。有趣的是,这不会影响textual_hdrssrcs,但会影响hdrs

总之,以下内容似乎工作正常

cc_library(
    name = "lib",
    hdrs = ["include/header1.h", ...],
    includes = ["include"],
)