我是 Bazel 的新手,正在尝试将静态库添加到我的构建中。
举个简单的例子,我有以下内容。
cc_import(
name = "my_test_lib"
static_library = "lib\my_test_lib\test.lib"
hdrs = ["lib\my_test_lib\include\headerA.h",
"lib\my_test_lib\include\headerB.h"]
visibility = ["//visibility:public"],
)
Run Code Online (Sandbox Code Playgroud)
现在这工作正常。
但是,如果我有大量包含文件并且包含目录中有许多子目录,该怎么办?我是否必须单独输入我的主项目所依赖的每个标头,或者我可以执行类似以下操作来基本上使该目录/子目录中的所有标头可用吗?
hdrs = [ "lib\my_test_lib\include\*"]
Run Code Online (Sandbox Code Playgroud)
[这是对塞巴斯蒂安答案的补充。]这是我刚刚(从同事那里)学到的一个技巧cc_import:
假设您不希望标头“裸露”地公开,但希望它们全部位于以您的库名称为前缀的子目录中,以便您像这样引用它们:
#include <openjpeg/openjpeg.h>
Run Code Online (Sandbox Code Playgroud)
第一步是建立一个如下所示的目录结构:
. <library root>
- include
- openjpeg
- openjpeg.h
- <other header files>
Run Code Online (Sandbox Code Playgroud)
但是现在,如果您通过例如glob或
glob(["mylib/include/openjpeg/*.h"])
某些变体
glob(["mylib/include/**/*.h"])
(或者甚至通过显式命名它们!)来公开这些头文件,那么它们实际上并没有公开为
#include <openjpeg/openjpeg.h>
而是作为
#include "openjpeg.h"
或
#include <include/openjpeg/openjpeg.h>
或类似的东西。
问题是,cc_import莫名其妙地不支持这样做的includes属性cc_library,因此您不能只命名包含目录。
因此,使用标准计算机科学解决方法添加另一级间接并使用:
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"],
)
Run Code Online (Sandbox Code Playgroud)
你需要的是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"],
)
Run Code Online (Sandbox Code Playgroud)
这将找到所有以.hunder结尾的文件lib\my_test_lib\include并将它们放入hdrs您的cc_import.
globBazel 文档中有更多信息: https://docs.bazel.build/versions/master/be/functions.html#glob
注意:在 Bazel BUILD 文件中的所有平台上始终使用正斜杠(甚至在 Windows 上)。
多种全局模式
有时在全局中放入多个模式很有用,例如像这样
cc_import(
...
hdrs = glob([
"lib/my_test_lib/include/*.h",
"lib/my_test_lib/include/*.hpp",
"lib/my_test_lib/public/*.h",
]),
...
)
Run Code Online (Sandbox Code Playgroud)
将 glob 与硬编码的文件列表组合起来
另一个有用的事情是将 glob 与硬编码路径结合起来。您可能有一些想要的文件,然后还有一个您想要包含的目录。您可以通过使用+运算符将硬编码的路径列表与 glob 结果连接起来来完成此操作,如下所示
cc_import(
...
hdrs = [
"lib/my_test_lib/some_header.h",
] + glob([
"lib/my_test_lib/include/*.h",
]),
...
)
Run Code Online (Sandbox Code Playgroud)
全局目录层次结构(注意大量包含)
该glob函数还支持在查找文件时遍历目录及其子目录。这可以使用 glob 模式来完成**。因此,例如要获取目录.h中的所有文件my_test_lib,请使用此 glob
cc_import(
...
hdrs = glob([
"lib/my_test_lib/**/*.h",
]),
...
)
Run Code Online (Sandbox Code Playgroud)
注意:这将包括指定目录下的所有文件,如预期的那样。这可能会失控,因为并不清楚包含哪些文件。远离可能会更好**。