目标
我正在使用Bazel构建一个多平台C++客户端(iOS、OSX、Android )。
iOS和OSX是在我的Mac上本地构建的(出于必要)。Android和Windows都是在Docker容器中构建的。
在构建结束时,我有一个Bazel规则,它为每个平台获取每个cc_binary规则,并将它们放入一个.zip中。
我想利用Bazel的远程执行API在容器中构建我的一些二进制文件,并在本地构建其他二进制文件,然后引用一个共享缓存将它们整理在一起--所有这些都使用一个bazel build命令。
Bazel支架
巴泽尔声称,这些类型的multiplatform构建--在host (OSX x64)、execution (Linuxx64)和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是否支持不同平台上的远程执行? (没有令人满意的答案)。
发布于 2020-05-03 12:56:11
(1)我试图做的与巴泽尔的设计根本不一致吗?
理论上不,在实践中是的。Bazel提供的功能允许用户支持您的用例,但它不是默认实现的。
具体来说,正如链接Bazel问题中所描述的: Bazel规则目前假设主机和目标平台之间的关系在您的情况下是不成立的,例如,它将自动检测主机上的JDK文件(macOS),然后默认在所有Java操作中使用这些JDK文件--不管目标平台如何。
如果是,那么Bazel是多平台意味着什么?
实际上,这意味着您可以在多个平台上运行bazel build ...,并期望Bazel将您的输入转换为与当前平台兼容的输出。
(2)是否有一个解决办法,我可以采取的办法,以保持精神错乱,并停留在Bazel的建设系统?
是的,您可以在Windows或Docker容器中运行bazel build ...。这是巴泽尔团队在我问这个问题时推荐的解决办法。
相关高级Bazel功能:
bazel build,可以编写自己的C++工具链。在其核心,Bazel为每个操作提供一个沙箱,其中包含所有依赖的文件,并保证它将执行特定的命令。在定制的C++工具链中,您可以告诉Bazel调用脚本而不是clang,后者接受命令+文件并在VM或容器中执行它们。这可能是很多工作,但绝对是可能的。https://stackoverflow.com/questions/61567876
复制相似问题