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