如何将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
相关产品推荐
相关产品推荐

