我有一个二进制文件,该文件将单个文件作为输入,并在单个目录中产生未知数量的标头和源C ++文件。我希望能够编写如下目标:
x_library(
name = "my_x_library",
src = "source.x",
)
其中x_library
是一个宏,最终从输出文件中产生cc_library
。但是,我不能将所有输出文件捆绑在规则实现内或宏内。我尝试过this answer,但似乎不再起作用。
此问题的常见解决方案是什么?可能吗?
答案 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
。