Bazel:混合Linux远程执行平台和MacOS本地平台 目标 我使用Bazel来构建多平台C++客户端(iOS、OSX、Android、Windows)。
iOS和OSX是在我的Mac上本地构建的(出于需要)。Android和Windows构建在Docker容器中 在构建结束时,我有一个Bazel规则,它为每个平台获取每个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)和目
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为每个操作提供了一个包含所有依赖文件的沙盒,并保证它将执行特定的命令。在自定义C++工具链中,您可以告诉BAZEL调用脚本而不是CLANG,它使用命令+文件并在VM或容器中执行它们。这可能需要做很多工作,但绝对是可能的bazel build
是的,您可以运行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,但这是一个进步。