Build 将未知输出列表链接到cc_库
我有一个Build 将未知输出列表链接到cc_库,build,bazel,Build,Bazel,我有一个genrule,它接受一个配置文件,并吐出大量的构建文件(*.so*s和*.h文件): 无论我往哪里看,我似乎都会一个接一个地找到死角(http\u archive使用download\u and\u extract方法,该方法假设*tgz是远程的,cc\u库实现是不可访问/不可扩展的Java,等等) 我认为“我有一个节点A,它产生了一吨的输出文件,节点B依赖于此”的问题非常常见,并且有一个简单的解决方案。我错过了什么明显的东西吗 上下文: 我使用本地目录中的本地存储库规则,并使用上面的
genrule
,它接受一个配置文件,并吐出大量的构建文件(*.so*
s和*.h
文件):
无论我往哪里看,我似乎都会一个接一个地找到死角(http\u archive
使用download\u and\u extract
方法,该方法假设*tgz
是远程的,cc\u库
实现是不可访问/不可扩展的Java,等等)
我认为“我有一个节点A,它产生了一吨的输出文件,节点B依赖于此”的问题非常常见,并且有一个简单的解决方案。我错过了什么明显的东西吗
上下文:
我使用本地目录中的本地存储库规则,并使用上面的cc_library
规则作为build_文件参数(但这意味着构建此过程的第一步必须完全在Bazel构建过程之外完成,而不应该这样做):
bazel的基本理念是,构建应该依赖于明确的输入/依赖项和严格定义的输出文件,以保证可复制的构建。让genrule生成目标应该依赖的“随机”数量的文件是违反这一理念的。这就是为什么你找不到一个好方法来实现这一点
解决这个问题的一种方法是在genrule中有一个
out
文件,您可以在其中写下生成的文件的名称(或脚本日志或其他内容)。然后,您可以使用glob
定义一个包含所有生成文件的附加文件组。然后将genrule作为依赖项添加到节点B的规则中,并将文件组添加到srcs
。因此,可以保证在构建节点B之前生成文件。基本的bazel理念是,构建应依赖于明确的输入/依赖项和严格定义的输出文件,以保证可复制的构建。让genrule生成目标应该依赖的“随机”数量的文件是违反这一理念的。这就是为什么你找不到一个好方法来实现这一点
解决这个问题的一种方法是在genrule中有一个
out
文件,您可以在其中写下生成的文件的名称(或脚本日志或其他内容)。然后,您可以使用glob
定义一个包含所有生成文件的附加文件组。然后将genrule作为依赖项添加到节点B的规则中,并将文件组添加到srcs
。因此可以保证,文件是在构建节点B之前生成的嗨,我意识到这有点晚了,但我遇到了一个类似的问题,我想知道:如何“使用glob定义一个包含所有生成文件的附加文件组”?在文档()中:“由于glob()在构建文件求值期间运行,glob()只匹配源代码树中的文件,而从不匹配生成的文件。”您好,我意识到这有点晚了,但我遇到了一个类似的问题,我想知道:如何“使用glob定义一个包含所有生成文件的附加文件组”?在文档()中:“由于glob()在生成文件求值期间运行,因此glob()只匹配源树中的文件,而从不匹配生成的文件。”
genrule(
name = "ros_auto",
local = True,
srcs = [":package_list"],
outs = ["ros_built.tgz"],
tools = [":build_packages.bash"],
cmd = "$(location :build_packages.bash) $< $@"
)
cc_library(
name = "ros",
srcs = glob(["lib/*.so*"]),
hdrs = glob([
"include/**/*.h",
"include/**/*.hpp",
]),
strip_include_prefix = "include",
visibility = ["//visibility:public"],
)
new_local_repository(
name = "ros",
path = "/tmp/ros_debug",
build_file = "//ros:BUILD.bazel",
licenses = ["https://docs.ros.org/diamondback/api/licenses.html"]
)