我正在使用 Bazel 构建多平台 C++ 客户端(iOS、OSX、Android、Windows)。
iOS 和 OSX 是在我的 Mac 上本地构建的(出于必要)。Android 和 Windows 构建在 Docker 容器内。
在构建结束时,我有一个 Bazel 规则,它采用cc_binary每个平台的每个规则并将它们放入.zip.
我想利用 Bazel 的远程执行 API 在容器中构建一些二进制文件,并在本地构建其他二进制文件,然后引用共享缓存将它们整理在一起 - 所有这些都只需一个bazel build命令。
Bazel 声称这些类型的multiplatform构建——其中host(OSX x64)、execution(Linux x64)和target(许多)平台都不同——是可能的。
请参阅https://docs.bazel.build/versions/master/platforms.html
但是,我遇到了这个确切的问题:https://github.com/bazelbuild/bazel/issues/5397(其中docker-sandbox有正确的remote构建代理。)
这与下面的 Github 问题一起让我对 Bazel 关于multiplatform构建的主张提出质疑。
https://github.com/bazelbuild/bazel/issues/5309
从根本上说,这些问题似乎表明一个平台(例如 OSX)的本地目标不能与另一平台(例如 Linux)上的远程目标一起构建。
我想知道:
(1) 我想做的事情从根本上与 Bazel 的设计不一致吗?如果是这样,巴泽尔的存在意味着什么multiplatform?
(2) 我可以采用一种解决方法来保持隐秘性并保留在 Bazel 构建系统中吗?可以挂载 Docker 卷,然后编写一个将 Docker 缓存与本地缓存相结合的脚本,但 Bazel 似乎是为了处理我的用例而构建的。我在这里错过了什么吗?
相关问题:bazel是否支持不同平台上的远程执行?(没有得到满意的答案。)
(1) 我想做的事情从根本上与 Bazel 的设计不一致吗?
理论上不,实际上是。Bazel 提供了允许用户支持您的用例的功能,但默认情况下并未实现。
具体来说,如链接的 Bazel 问题中所述:Bazel规则当前对主机和目标平台之间的关系做出假设,但在您的情况下不成立,例如,它将自动检测主机(macOS)上的 JDK 文件,然后默认在所有 Java 操作中使用这些 JDK 文件 - 无论目标平台如何。
如果是这样,Bazel 是多平台意味着什么?
实际上,这意味着您可以bazel build ...在多个平台上运行,并期望 Bazel 将您的输入转换为与当前平台兼容的输出。
(2) 我可以采用一种解决方法来保持隐秘性并保留在 Bazel 构建系统中吗?
bazel build ...是的,您可以从 Windows VM 或 Docker 容器中运行。这是我问这个问题时 Bazel 团队推荐的解决方法。
相关高级 Bazel 功能:
bazel build从容器/VM 中运行,您可以编写自己的 C++ 工具链。Bazel 的核心是为每个操作提供一个包含所有相关文件的沙箱,并保证它将执行特定的命令。在自定义 C++ 工具链中,您可以告诉 Bazel 调用脚本而不是 clang,后者接受命令 + 文件并从 VM 或容器内执行它们。这可能需要大量工作,但绝对是可能的。| 归档时间: |
|
| 查看次数: |
1804 次 |
| 最近记录: |