如何使用 Bazel 一次编译多个平台目标?



编译单一平台:

# BUILD
load("@io_bazel_rules_go//go:def.bzl", "go_binary")
go_binary(
name = 'example',
srcs = glob(["src/*.go"]),
)

它可以正常编译,但是当我想编译多个平台时,只有这样:

bazel build --platforms=@io_bazel_rules_go//go/toolchain:linux_amd64 //:example
bazel build --platforms=@io_bazel_rules_go//go/toolchain:linux_386 //:example
bazel build --platforms=@io_bazel_rules_go//go/toolchain:windows_amd64 //:example
bazel build --platforms=@io_bazel_rules_go//go/toolchain:darwin_amd64 //:example

我想一次编译多个平台目标,所以我试试这个:

# BUILD
load("//:matrix.bzl", "build_all_platform")

build_all_platform(
name = 'example',
pkg = glob(["src/*.go"]),
)
# matrix.bzl
load("@io_bazel_rules_go//go:def.bzl", "go_binary")
SUPPORTED_MATRIX = [
("windows", "amd64"),
("darwin", "amd64"),
("linux", "amd64"),
("linux", "386"),
]
def _build(ctx):
for goos, goarch in SUPPORTED_MATRIX:
target_name = 'proxy-download-' + goos + '-' + goarch
if goos == 'windows':
target_name += '.exe'
go_binary(
name = target_name,
srcs = ctx.attr.pkg,
pure = "auto",
goos = goos,
goarch = goarch,
)
build_all_platform = rule(
_build,
attrs = {
'pkg': attr.string_list(),
},
executable = True,
)

但是遇到错误,我想这可能是rules_go的原因。

Traceback (most recent call last):
File "/source/proxy-download/BUILD", line 4
build_all_platform(name = 'proxy-download')
File "/source/proxy-download/matrix.bzl", line 16, in _build
go_binary(name = target_name, <4 more arguments>)
File "/private/var/tmp/_bazel_/071099b99a462d431baf96a3ef76cd28/external/io_bazel_rules_go/go/private/rules/wrappers.bzl", line 50, in go_binary
go_transition_wrapper(go_binary, <3 more arguments>)
File "/private/var/tmp/_bazel_/071099b99a462d431baf96a3ef76cd28/external/io_bazel_rules_go/go/private/rules/transition.bzl", line 60, in go_transition_wrapper
transition_kind(name = name, <1 more arguments>)
'rule' can only be called during the loading phase

尝试同时通过此问题中提到的多个平台

bazel build --platforms=@io_bazel_rules_go//go/toolchain:linux_386,@io_bazel_rules_go//go/toolchain:linux_amd64 //:example
> WARNING: --platforms only supports a single target platform: using the first option @io_bazel_rules_go//go/toolchain:linux_386

作为参考,此代码通过使用生成命令行实现这一点

options = [
"go",
"build",
"-o", output_file.path,
"-compiler", "gc",
"-gcflags", '"all=-trimpath=${GOPATH}/src"',
"-asmflags", '"all=-trimpath=${GOPATH}/src"',
"-ldflags", "'%s'" % ld_flags,
"-tags", "'%s'" % ctx.attr.gotags,
pkg,
]

您可能想看看 Bazel 的用户定义转换,这些转换可以使用不同的构建配置构建依赖项。请注意,这是一项实验性功能,并非所有生成参数都是可配置的。

最新更新