You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Bazel的Python生成脚本与cc_binary目标合并为一个

解决Bazel自动执行代码生成再编译C++二进制的问题

你需要通过genrule规则将代码生成步骤与C编译步骤串联,Bazel会自动保证编译C二进制前先执行代码生成脚本,具体配置如下:

1. 启用代码生成器的py_binary规则

先确保Python生成器能被Bazel正确调用,保留并启用py_binary定义:

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

2. 添加genrule执行代码生成

新增genrule规则,负责调用Python脚本生成目标.cpp文件:

genrule(
    name = "generate_cpp",
    srcs = [":generator_inputs"],  # 生成器依赖的输入资源
    outs = ["src/generated.cpp"],  # 指定生成文件路径,需与后续cc_binary引用一致
    tools = [":generator"],  # 依赖上面定义的Python生成器目标
    # 根据你的generator.py脚本逻辑调整命令,此处假设脚本接收输出路径参数
    cmd = "$(location :generator) $(OUTS)",
    # 如果脚本需要读取输入文件,可修改为:$(location :generator) $(SRCS) $(OUTS)
)

3. 修改cc_binary依赖生成的文件

将原cc_binary的srcs改为依赖上述genrule目标,Bazel会自动处理生成流程:

cc_binary(
    name = "run_generated_cpp",
    srcs = [":generate_cpp"],  # 直接依赖genrule,替代原手动指定的generated.cpp路径
    deps = ["//cpp_lib"],
)

原理说明

  • genrule是Bazel的通用生成规则,会在所有依赖它的目标(此处为run_generated_cpp)构建前执行。
  • 执行时Bazel会将工具、输入文件复制到沙盒环境,运行指定命令生成输出文件,之后将生成的文件传递给cc_binary完成编译。
  • 执行bazel run :run_generated_cpp时,Bazel会按顺序完成:运行generator.py → 生成generated.cpp → 编译C++二进制 → 运行二进制。

内容的提问来源于stack exchange,提问作者Jalu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 17:27:17