【问题标题】:Building a CMake library within a Bazel project在 Bazel 项目中构建 CMake 库
【发布时间】:2018-02-19 03:34:17
【问题描述】:

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

对于我的本地开发服务器,我使用 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)。

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

【问题讨论】:

  • 您希望它的便携性如何? Linux、MacOS、Windows?对于 2,为什么不能将相同的 genrule 用于其他项目是一个问题?我在 Bazel 工作,到目前为止,我还没有听说有人提出通用解决方案。

标签: tensorflow build cmake bazel nanomsg


【解决方案1】:

正如 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 是否失败”,请告诉我。 :)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多