如何在Bazel中一键构建多个cc_binary目标并添加构建后复制规则?
解决方案
1. 聚合所有目标产物
先通过filegroup把所有cc_binary的输出文件统一聚合,方便后续批量处理:
filegroup( name = "all_elf_targets", srcs = [ ":app1", # 替换为你的第一个cc_binary目标名 ":app2", # 替换为你的第二个cc_binary目标名 # 继续添加其他需要构建的cc_binary目标 ], output_group = "default", # 指定取每个目标的默认输出(即elf文件) )
2. 构建后复制产物到指定目录
用genrule实现构建后的复制逻辑,支持批量处理:
genrule( name = "package_all_elfs", srcs = [":all_elf_targets"], outs = ["dist/"], # 指定输出到bazel构建目录下的dist子目录 cmd = """ # 创建目标目录 mkdir -p $(@D)/dist # 批量复制所有elf文件到目标目录 for src_file in $(SRCS); do target_file=$(basename "$src_file") cp "$src_file" $(@D)/dist/"$target_file" done # 如果需要复制其他构建产物(比如.map符号文件),添加对应逻辑 # for src_file in $(SRCS); do # if [[ "$src_file" == *.map ]]; then # cp "$src_file" $(@D)/dist/$(basename "$src_file") # fi # done """, )
3. 一键构建并完成复制
直接执行以下命令,即可一次性构建所有cc_binary并完成产物复制:
bazel build :package_all_elfs
执行完成后,所有指定的elf文件会被复制到bazel-bin对应路径下的dist目录中(比如bazel-out/k8-fastbuild/bin/dist,具体路径随平台和构建模式略有差异)。
可选优化:公共依赖聚合
如果多个cc_binary有重复依赖,可以先抽成cc_library减少重复编译:
cc_library( name = "common_core", srcs = ["common_utils.c"], hdrs = ["common_utils.h"], )
然后在每个cc_binary的deps里引用这个库即可。
内容的提问来源于stack exchange,提问作者oruganti sivamuralikrishna
相关产品推荐
相关产品推荐

