5

我在使用nanomsg的 TensorFlow 的私有分支之上编写了一个模块。

对于我的本地开发服务器,我曾经cmake install安装 nanomsg (to /usr/local) 并从其安装位置访问头文件。该项目在本地运行良好。

但是,我现在需要在我的 TensorFlow 工作区中打包 nanomsg。我尝试了以下两种方法,但都没有令人满意:

  1. 与 OpenCV 的这个答案类似,我将 nanomsg 预编译到一个私有存储库中,tensorflow/workspace.bzl使用http_archive 指令将其加载到我的工作区(within)中,然后在相关构建脚本中包含头文件和库。这运行良好,但不是便携式解决方案。

  2. 一个更便携的解决方案,我创建了一个genrule运行特定的cmake命令序列,可用于构建 nanomsg。这种方法更整洁,但genrule不能重用于cmake其他项目。(我提到了这个讨论)。

显然cmake,在 Bazel 构建中不支持作为一等公民。是否有人在您自己的项目中遇到过这个问题,创建了一种通用的、可移植的方式来将库包含在使用构建的 Bazel 项目中cmake?如果是这样,你是如何处理它的?

4

2 回答 2

6

正如 Ulf 所写,我认为您建议的选项 2 应该可以正常工作。

关于“我可以确定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 是否失败”,请告诉我。:)

于 2017-09-12T14:45:20.277 回答
4

这个新项目:https ://github.com/bazelbuild/rules_foreign_cc似乎是一个解决方案(它为 cmake 构建规则以在 bazel 中构建您的项目)。

于 2019-04-26T03:58:21.443 回答