如何从genrule的输出目录中生成cc_library?

时间:2019-08-14 17:12:14

标签: bazel

我有一个二进制文件,该文件将单个文件作为输入,并在单个目录中产生未知数量的标头和源C ++文件。我希望能够编写如下目标:

x_library(
  name = "my_x_library",
  src = "source.x",
)

其中x_library是一个宏,最终从输出文件中产生cc_library。但是,我不能将所有输出文件捆绑在规则实现内或宏内。我尝试过this answer,但似乎不再起作用。

此问题的常见解决方案是什么?可能吗?

1 个答案:

答案 0 :(得分:0)

使用genrule(不是超级迷)来获取一个C文件和一个标头并将其作为cc_library提供的宏的小示例:

def x_library(name, src):

    srcfile = "{}.c".format(name)
    hdrfile = "{}.h".format(name)

    native.genrule(
       name = "files_{}".format(name),
       srcs = [src],
       outs = [srcfile, hdrfile],
       cmd = "./generator.sh $< $(OUTS)",
       tools = ["generator.sh"],
    )

    native.cc_library(
       name = name,
       srcs = [srcfile],
       hdrs = [hdrfile],
    )

然后像这样使用它:

load(":myfile.bzl", "x_library")

x_library(
  name = "my_x_library",
  src = "source.x",
)

cc_binary(
  name = "tgt",
  srcs = ["mysrc.c"],
  deps = ["my_x_library"],
)

只要生成器输入->生成的内容是已知且稳定的(您可以使用任意数量的文件(以及C ++内容; IIRC,这些足以用于自动决定如何调用工具),都可以扩展该文件)。通常对于构建来说是一件好事)。否则,您将不能再使用genrule,因为您需要自定义规则(反正可能是一件好事)才能使用链接的答案中所述的TreeArtifact。或两个,一个带后缀.cc,另一个带后缀.hh,以便您可以将它们传递给cc_library