在Bazel项目中构建CMake库

时间:2017-09-10 23:25:14

标签: tensorflow build cmake bazel nanomsg

我在使用nanomsg的TensorFlow的私人分叉上编写了一个模块。

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

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

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

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

  3. 显然,Bazel构建中的一等公民不支持cmake。是否有人在您自己的项目中遇到过这个问题,创建了一种通用的,可移植的方式,在使用cmake构建的Bazel项目中包含库?如果是这样,你是怎么做到的?

2 个答案:

答案 0 :(得分: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是否失败”,请告诉我。 :)

答案 1 :(得分:1)

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