Bazel:混合Linux远程执行平台和MacOS本地平台 目标 我使用Bazel来构建多平台C++客户端(iOS、OSX、Android、Windows)。

Bazel:混合Linux远程执行平台和MacOS本地平台 目标 我使用Bazel来构建多平台C++客户端(iOS、OSX、Android、Windows)。,bazel,Bazel,iOS和OSX是在我的Mac上本地构建的(出于需要)。Android和Windows构建在Docker容器中 在构建结束时,我有一个Bazel规则,它为每个平台获取每个cc_binary规则,并将它们放在.zip中 我想利用Bazel的远程执行API在容器中构建一些二进制文件,在本地构建其他二进制文件,然后引用共享缓存将它们整理在一起——所有这些都需要一个Bazel build命令 巴泽尔支架 Bazel声称这些类型的多平台构建是可能的,其中主机(OSX x64)、执行(Linux x64)和目

iOS和OSX是在我的Mac上本地构建的(出于需要)。Android和Windows构建在Docker容器中

在构建结束时,我有一个Bazel规则,它为每个平台获取每个
cc_binary
规则,并将它们放在
.zip

我想利用Bazel的远程执行API在容器中构建一些二进制文件,在本地构建其他二进制文件,然后引用共享缓存将它们整理在一起——所有这些都需要一个
Bazel build
命令

巴泽尔支架 Bazel声称这些类型的
多平台
构建是可能的,其中
主机
(OSX x64)、
执行
(Linux x64)和
目标
平台(许多)都是不同的

我的经验 但是,我遇到了这个问题:(其中,
docker sandbox
remote
构建的正确代理。)

这与下面的Github问题一起,使我对Bazel关于
multiplatform
builds的说法产生了疑问

从根本上讲,这些问题似乎表明一个平台(如OSX)的本地目标无法与另一个平台(如Linux)上的远程目标一起构建

问题: 我想知道:

(1) 我试图做的与Bazel的设计根本不符吗?如果是这样,Bazel是多平台的是什么意思

(2) 是否有一个工作区可以让我保持隐秘性,并保持在Bazel构建系统中?可以装载一个Docker卷,然后编写一个脚本,将Docker缓存与我的本地缓存结合起来,但Bazel似乎是为处理我的用例而构建的。我是不是遗漏了什么

相关问题:(没有令人满意的答案。)

(1) 我试图做的与Bazel的设计根本不符吗

理论上不,实际上是。Bazel提供了允许用户支持您的用例的功能,但默认情况下并没有实现

具体而言,如链接的Bazel问题中所述:Bazel规则目前对主机和目标平台之间的关系做出假设,但在您的案例中并不适用,例如,它将自动检测主机(macOS)上的JDK文件然后默认在所有Java操作中使用这些JDK文件,而不考虑目标平台

如果是这样,Bazel是多平台的是什么意思

实际上,这意味着您可以在多个平台上运行
bazel build…
,并期望bazel将您的输入转换为与当前平台兼容的输出

(2) 是否有一个工作区可以让我保持隐秘性,并保持在Bazel构建系统中

是的,您可以在Windows VM或Docker容器中运行
bazel build…
。这是我问这个问题时Bazel团队推荐的解决方法

相关高级Bazel功能:

  • 如果您希望通过一次Bazel调用为多个目标平台构建,请查看(这将允许您为多个平台构建相同的规则,例如,iOS和macOS,但需要您编写自己的规则)
  • 如果您不想从容器/vm中运行
    bazel build
    ,您可以编写自己的代码。在其核心,Bazel为每个操作提供了一个包含所有依赖文件的沙盒,并保证它将执行特定的命令。在自定义C++工具链中,您可以告诉BAZEL调用脚本而不是CLANG,它使用命令+文件并在VM或容器中执行它们。这可能需要做很多工作,但绝对是可能的

是的,您可以运行bazel build。。。从Windows VM或Docker容器中。这不支持我构建iOS和OSX工件的要求。出于技术和法律原因,在Docker容器中不可能对OSX和iOS进行AFAIK编译。正确!建议将build命令分为3部分:一部分用于macOS/iOS人工制品,另一部分用于Linux(从容器中运行),另一部分用于Windows(从Windows VM运行)。这不是很好的用户体验,但很可能是开箱即用的(特别是如果您正在构建cc_库/cc_二进制目标)。好的-是的,我的问题本质上是,我必须回到您刚才描述的方法,还是可以在一个
bazel构建中完成这一切…
这样我的
zip
规则(已实现用户定义的转换,以考虑平台差异)可以使用
deps
简单地依赖于每个平台的
cc_二进制
规则。听起来现在的答案是接受轻微的UX攻击。更新:似乎我能够通过添加
build:remote--不兼容的_enable_cc_工具链_resolution
来解决我的问题。现在正确地选择了mingw-w64编译器,而不是我并不完全清楚为什么新平台API的使用会导致bazel使用容器化编译器而不是clang,但这是一个进步。