在Bazel项目中构建CMake库

8
我已经在基于 TensorFlow 的私有分支上编写了一个模块,使用了 nanomsg
对于我的本地开发服务器,我使用了 cmake install 来安装 nanomsg(到 /usr/local),并从其安装位置访问头文件。该项目在本地正常运行。
然而,现在我需要在我的 TensorFlow 工作区内打包 nanomsg。我尝试了以下两种方法,但都不理想:
  1. 与OpenCV的this answer类似,我将nanomsg预编译为私有存储库,并使用http_archive directive在我的工作区内(在tensorflow/workspace.bzl中)加载它,然后在相关的构建脚本中包含头文件和库。这样运行很好,但不是一种可移植的解决方案。

  2. 一个更可移植的解决方案是,我创建了一个genrule来运行一系列特定的cmake命令,用于构建nanomsg。这种方法更加整洁,但genrule不能被重复使用来cmake其他项目。(我参考了this discussion)。

很明显,在Bazel构建中,cmake不被视为一流公民。是否有人在自己的项目中遇到了这个问题,并创建了一种通用、可移植的方式来在使用cmake构建的Bazel项目中包含库?如果有,你是如何解决的?


你希望它有多么的便携?Linux,MacOS,Windows?至于第二个问题,为什么不能将同一个genrule用于其他项目是个问题呢?我在Bazel上工作,到目前为止我还没有听说过有人提出了通用的解决方案。 - Ulf Adams
2个回答

6

6

正如Ulf所写,我认为你提出的选项2应该可以正常工作。

关于“我能否识别cmake是否失败”,是的:当cmake失败时,cmake应该返回错误退出代码(!= 0)。这反过来会导致Bazel自动将genrule动作识别为失败,并因此使构建失败。因为Bazel在运行您的命令之前设置“set -e -o pipefail”(参见https://docs.bazel.build/versions/master/be/general.html#genrule-environment),所以如果您在genrule“cmd”中链接多个cmake命令,它也应该可以正常工作。

如果您在“cmd”属性中调用一个shell脚本,然后实际上运行cmake命令,请确保在脚本的第一行中自己放置“set -e -o pipefail”。否则,当cmake失败时,脚本将不会失败。

如果我误解了您的问题“我能否识别cmake是否失败”,请告诉我。 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接