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

如何根据Toolchain为http_archive选择不同BUILD文件?

解决方案

方法1:通过仓库规则获取目标平台约束(推荐)

由于http_archive是仓库规则,在WORKSPACE解析阶段运行,无法直接使用select,但可以自定义仓库规则,通过repo_ctx判断目标平台的约束条件,选择对应BUILD文件。

修改你的.bzl文件如下:

load(
    "@bazel_tools//tools/build_defs/repo:utils.bzl",
    "maybe",
)

def _silkit_repo_impl(repo_ctx):
    # 判断目标平台是否为aarch64(依赖官方CPU约束)
    is_aarch64 = repo_ctx.target_platform_has_constraint(
        repo_ctx.attr._aarch64_constraint
    )
    
    # 选择对应架构的BUILD文件
    if is_aarch64:
        build_file_path = repo_ctx.path(repo_ctx.attr._aarch64_build_file)
    else:
        build_file_path = repo_ctx.path(repo_ctx.attr._x86_build_file)
    
    # 下载并解压归档包
    repo_ctx.download_and_extract(
        url = repo_ctx.attr.url,
        output = ".",
        # 可添加sha256校验值提升安全性
    )
    
    # 将选定的BUILD文件软链接到仓库根目录
    repo_ctx.symlink(build_file_path, "BUILD.bazel")

# 定义自定义仓库规则
silkit_repo = repository_rule(
    implementation = _silkit_repo_impl,
    attrs = {
        "url": attr.string(mandatory = True),
        "_aarch64_build_file": attr.label(default = Label("//:silkit_aarch64.BUILD")),
        "_x86_build_file": attr.label(default = Label("//:silkit_x86_64.BUILD")),
        "_aarch64_constraint": attr.label(default = Label("@platforms//cpu:aarch64")),
    },
)

def silkit():
    maybe(
        silkit_repo,
        name = "silkit",
        url = "silkit-url-in artifactory",
    )

关键说明

  • 利用repo_ctx.target_platform_has_constraint检测目标平台是否匹配aarch64约束(依赖Bazel官方的@platforms仓库)
  • 确保你的自定义平台//toolchain/gcc_12.3.0_aarch64:aarch64已包含@platforms//cpu:aarch64约束,否则判断逻辑不生效
  • //:路径替换为你存放两个BUILD文件的实际目录

方法2:通过命令行参数传递架构信息

如果自定义仓库规则过于复杂,可通过.bazelrc传递架构参数,在宏中读取并选择BUILD文件:

  1. 更新.bazelrc,添加自定义参数:
build:aarch64 --platforms=//toolchain/gcc_12.3.0_aarch64:aarch64 --define arch=aarch64
build:x86_64 --define arch=x86_64
  1. 修改.bzl文件:
load(
    "@bazel_tools//tools/build_defs/repo:utils.bzl",
    "maybe",
)
load(
    "@bazel_tools//tools/build_defs/repo:http.bzl",
    "http_archive",
)

def silkit():
    # 读取命令行传递的arch参数,默认x86_64
    arch = native.repository_ctx.var.get("arch", "x86_64")
    
    build_file = "//:silkit_aarch64.BUILD" if arch == "aarch64" else "//:silkit_x86_64.BUILD"
    
    maybe(
        http_archive,
        name = "silkit",
        build_file = build_file,
        url = "silkit-url-in artifactory",
    )

关键说明

  • 构建时需指定对应配置,例如bazel build --config=aarch64
  • 该方法依赖命令行参数传递,灵活性稍弱,但实现更简单

内容的提问来源于stack exchange,提问作者Emre İriş

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:53:01