gpt4 book ai didi

bazel - 如何使bazel `sh_binary`目标依赖于其他二进制目标?

转载 作者:行者123 更新时间:2023-12-01 09:28:13 26 4
gpt4 key购买 nike

我设置了bazel来构建许多执行各种数据库维护任务的CLI工具。每个对象都是一个py_binarycc_binary目标,可从命令行调用该目标,并带有指向某些数据文件的路径:它处理该文件并将结果存储在数据库中。

现在,我需要创建一个包含数据文件和Shell脚本的相关程序包,这些程序文件和 shell 程序脚本调用这些CLI工具来执行特定于应用程序的数据库操作。

但是,似乎没有一种方法可以依赖仅包含py_binary目标和数据文件的新程序包中的现有cc_binarysh_binary目标。尝试这样做会导致类似以下的错误:

ERROR: /workspace/shbin/BUILD.bazel:5:12: in deps attribute of sh_binary rule //shbin:run: py_binary rule '//pybin:counter' is misplaced here (expected sh_library)

有没有一种方法可以使用 sh_binary从Shell脚本调用/依赖现有的bazel二进制目标?

我在这里实现了一个完整的示例:
https://github.com/psigen/bazel-mixed-binaries

注意:

我不能使用 py_librarycc_library代替 py_binarycc_binary。这是因为 (a)我需要调用两种语言的混合来处理我的数据文件,而 (b)这些工具来自上游存储库,这些存储库已经被设计为CLI工具。

我也不能将所有数据文件放入CLI工具包中-有多个特定于应用程序的包,不能混在一起。

最佳答案

您可以创建一个风格来作为构建的一部分来运行这些工具,也可以通过data属性创建一个依赖于这些工具的sh_binary并运行它们。

稳健的方法

这是更简单的方法,可让您在构建过程中运行这些工具。

genrule(
name = "foo",
tools = [
"//tool_a:py",
"//tool_b:cc",
],
srcs = [
"//source:file1",
":file2",
],
outs = [
"output_file1",
"output_file2",
],
cmd = "$(location //tool_a:py) --input=$(location //source:file1) --output=$(location output_file1) && $(location //tool_b:cc) < $(location :file2) > $(location output_file2)",
)

sh_binary方法

这更加复杂,但是可以让您在构建的一部分(如果它在 genrule.tools中,类似于前面的方法)中运行sh_binary,或者在构建之后(从 bazel-bin下)运行sh_binary。

sh_binary中,您必须根据工具来进行数据依赖:
sh_binary(
name = "foo",
srcs = ["my_shbin.sh"],
data = [
"//tool_a:py",
"//tool_b:cc",
],
)

然后,在 sh_binary中,您必须使用Bazel内置的所谓的“Bash运行文件库”来查找二进制文件的运行时路径。该库的文档是 in its source file

这个想法是:
  • sh_binary必须设置为depend on a specific target
  • 您必须在sh_binary的顶部copy-paste some boilerplate code(原因描述为here)
  • ,然后您可以use the rlocation function查找二进制文件
  • 的运行时路径

    例如,您的 my_shbin.sh可能看起来像这样:
    #!/bin/bash
    # --- begin runfiles.bash initialization ---
    ...
    # --- end runfiles.bash initialization ---

    path=$(rlocation "__main__/tool_a/py")
    if [[ ! -f "${path:-}" ]]; then
    echo >&2 "ERROR: could not look up the Python tool path"
    exit 1
    fi
    $path --input=$1 --output=$2

    重定位路径参数中的 __main__是工作空间的名称。由于您的 WORKSPACE文件没有用于定义工作区名称的“工作区”规则,因此Bazel将使用默认的工作区名称 __main__

    关于bazel - 如何使bazel `sh_binary`目标依赖于其他二进制目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53472993/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com