Bazel - 导入静态库时包括目录中的所有标头



我是 Bazel 的新手,并试图在我的构建中添加静态库。

假设作为一个简单的例子,假设我有以下内容。

cc_import(
name = "my_test_lib"
static_library = "libmy_test_libtest.lib"
hdrs = ["libmy_test_libincludeheaderA.h", 
"libmy_test_libincludeheaderB.h"]
visibility = ["//visibility:public"],
)

现在这工作正常。

但是,如果我有大量的包含并且包含目录中有许多子目录怎么办。我是否必须单独输入我的主项目所依赖的每个标头,或者我可以执行以下操作来基本上使该目录/子目录中的所有标头可用?

hdrs = [ "libmy_test_libinclude*"]

[这是对塞巴斯蒂安回答的补充。 这是我刚刚(从同事那里)学到的一个技巧,用于cc_import

假设您不希望标头"裸露",而是希望它们都位于以库名称为前缀的子目录中,以便像这样引用它们:

#include <openjpeg/openjpeg.h>

第一步是拥有一个如下所示的目录结构:

. <library root>
- include
- openjpeg
- openjpeg.h
- <other header files>

但是现在,如果您通过glob公开这些头文件,例如
glob(["mylib/include/openjpeg/*.h"])
或某些变体,如
glob(["mylib/include/**/*.h"])
(甚至通过明确命名它们!),它们实际上并没有公开为
#include <openjpeg/openjpeg.h>
而是
#include "openjpeg.h"
or
#include <include/openjpeg/openjpeg.h>
或类似的东西。

问题是cc_import不负责任地不支持cc_library所做的includes属性,因此您不能只命名包含目录

因此,请使用添加另一个间接寻址级别的标准计算机科学解决方法并使用它:

cc_library(name = "openjpeg", 
includes = ["include"],
deps = ["openjpeg-internal"],
visibility = ["//visibility:public"],
)
cc_import(name = "openjpeg-internal",
hdrs = glob(["include/**/*.h"]),
static_library = ...,
visibility = ["//visibility:private"],
)

你需要的是glob函数。

要在上面的示例中使用它,您将执行以下操作

cc_import(
name = "my_test_lib"
static_library = "lib/my_test_lib/test.lib"
hdrs = glob(["lib/my_test_lib/include/*.h"])
visibility = ["//visibility:public"],
)

这将在libmy_test_libinclude下找到所有以.h结尾的文件,并将它们放在cc_importhdrs属性中。

Bazel 文档中提供了有关glob的更多信息:https://docs.bazel.build/versions/master/be/functions.html#glob

注意:始终在 Bazel BUILD 文件的所有平台上使用正斜杠(即使在 Windows 上)。

多种球形模式

有时在 glob 中放入多个模式很有用,例如像这样

cc_import(
...
hdrs = glob([
"lib/my_test_lib/include/*.h",
"lib/my_test_lib/include/*.hpp",
"lib/my_test_lib/public/*.h",
]),
...
)

将 glob 与硬编码的文件列表组合在一起

另一个有用的事情是将 glob 与硬编码路径相结合。您可能在那里有几个您想要的文件,然后是一个您还想包含的目录。为此,您可以使用+运算符将硬编码的路径列表与如下所示的 glob 结果连接

起来
cc_import(
...
hdrs = [
"lib/my_test_lib/some_header.h",
] + glob([
"lib/my_test_lib/include/*.h",
]),
...
)

通配目录层次结构(当心大量包含)

glob函数还支持在查找文件时遍历目录及其子目录。这可以使用**球模式来完成。因此,例如,要获取my_test_lib目录中的所有.h文件,请使用此 glob

cc_import(
...
hdrs = glob([
"lib/my_test_lib/**/*.h",
]),
...
)

注意:这将包括指定目录下的所有文件,正如预期的那样。这可能会失控,因为它没有明确包含哪些文件。最好远离**.

最新更新