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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 17:41:06