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

时间:2019-06-26 21:30:43

标签: c++ windows bazel

我是Bazel的新手,正在尝试向我的版本中添加静态库。

让我说一个简单的例子。

def test():
  out = str(input('Choice: '))
  if out == '1':
    print('Test1 Worked')
  elif out == '2':
    print('Test2 Worked')
  elif out == '10':
   print('Test10 Worked')

现在可以正常工作了。

但是,如果我有大量包含,在包含目录中有许多子目录怎么办?我是否必须分别输入主项目所依赖的每个标题,还是可以执行以下类似的操作以实质上使此目录/子目录中的所有标题可用?

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"],
)

2 个答案:

答案 0 :(得分:1)

您需要的是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"],
)

将在.h下找到所有以lib\my_test_lib\include结尾的文件,并将它们放在hdrs的{​​{1}}属性中。

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

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

多个glob模式

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

glob

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

另一个有用的事情是将glob与硬编码路径结合在一起。您可能在其中有一些文件,然后还有一个要包含的目录。您可以通过使用cc_import( ... hdrs = glob([ "lib/my_test_lib/include/*.h", "lib/my_test_lib/include/*.hpp", "lib/my_test_lib/public/*.h", ]), ... ) 运算符将路径的硬编码列表与这样的全局结果连接起来来做到这一点

+

扩展目录层次结构(谨防大量包含)

cc_import( ... hdrs = [ "lib/my_test_lib/some_header.h", ] + glob([ "lib/my_test_lib/include/*.h", ]), ... ) 函数在查找文件时还支持遍历目录及其子目录。可以使用glob全局模式来完成。因此,例如要抓取**目录中的所有.h文件,请使用此glob

my_test_lib

当心:按预期,这将包括指定目录下的所有文件。由于不明确包含哪些文件,因此这可能会失控。最好远离cc_import( ... hdrs = glob([ "lib/my_test_lib/**/*.h", ]), ... )

答案 1 :(得分:0)

[这是对Sebastian's answer的补充。] 这是我刚从同事那里学到的与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"#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"],
)