Bazel 在运行 cc_binary 之前执行 python 脚本

问题描述 投票:0回答:1

我正在尝试创建一个 bazel 目标,它将从 .cpp 文件运行 c++ 二进制文件,该文件是由 python 脚本动态生成的。

假设我有generator.py,它在目录中创建一个 generated.cpp 文件。

我的规则如下:

# py_binary(
#     name = "generator",
#     srcs = [
#         "src/generator.py"
#     ],
#     main = "src/generator.py",
#     data = [
#         ":generator_inputs",
#     ],
#     imports = ["."],
# )
   
# cc_binary(
#     name = "run_generated_cpp",
#     srcs = ["src/generated.cpp"],
#     deps = [
#         "//cpp_lib",
#     ]
# )

如何将这 2 个目标合并为 1 个?这样执行 cc_binary 就有一个从 py 脚本生成文件的预处理步骤。

python c++ bazel build-system starlark
1个回答
0
投票

您可能想使用genrule。 Genrules 使您能够在构建期间执行二进制文件,并且它们可以生成其他规则可以声明为输入的输出。我实际上没有测试下面的代码,但总体思路是定义生成器二进制文件并将该目标指定为 genrule 目标中的

exec_tool
,使用
$(location)
帮助器调用
cmd
字段中的工具genrule 的,并将生成的文件声明为 genrule 的输出。一旦声明,这些可以用作其他规则的输入。

py_binary(
    name = "generator",
    srcs = [
        "src/generator.py"
    ],
    main = "src/generator.py",
    data = [
        ":generator_inputs",
    ],
    imports = ["."],
)

genrule(
    name = "generated_cpp_sources",
    outs = ["src/generated.cpp"],
    exec_tools = [":generator"],
    cmd = "$(location :generator)"
)
   
cc_binary(
    name = "run_generated_cpp",
    srcs = ["src/generated.cpp"],
    deps = [
        "//cpp_lib",
    ]
)
© www.soinside.com 2019 - 2024. All rights reserved.