如何根据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文件:
- 更新
.bazelrc,添加自定义参数:
build:aarch64 --platforms=//toolchain/gcc_12.3.0_aarch64:aarch64 --define arch=aarch64 build:x86_64 --define arch=x86_64
- 修改
.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ş
相关产品推荐
相关产品推荐

