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

What is the correct way to create a system header only library in bazel?

本文关键字:方法 是什么 bazel 创建 系统      更新时间:2023-10-16

我们正在将一个CMake项目迁移到Bazel。在CMake项目中,我们有几个仅表头的库被标记为SYSTEM,以抑制一些警告。当将这些迁移到Bazel时,我们能够做到这一点的方法是使用以下

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

这是可行的,但根据Bazel C++文档,不建议在srcs中使用接口/公共头。这些应该是hdrs的一部分。将这些添加到头中是不起作用的,因为它使用了基于-I的常规包含而不是-isystem

尽管巴泽尔不推荐我们这样做,但我们的方式很好吗?如果没有,正确的做法是什么?

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

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

这对我们来说似乎是一个很好的解决方案,只是textual_hdrs上的文档不够清晰,无法表明这就是它的目的。

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

事实证明,如果您确保strip_include_prefix为None(或未传递),则将其添加到hdrs中是有效的。我们有一个宏正在封装cc_library实例,它将strip_include_prefix默认为空字符串。有趣的是,这不会影响textual_hdrssrcs,但会影响hdrs

总之,以下似乎工作良好

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