我在TensorFlow的私人分支上编写了一个使用nanomsg的模块。
对于我的本地开发服务器,我使用cmake install
安装nanomsg(到/usr/local
)并从其安装位置访问头文件。该项目在当地运行良好。
但是,我现在需要在我的TensorFlow工作区中打包nanomsg。我尝试了以下两种方法,但都没有找到令人满意的方法:
tensorflow/workspace.bzl
将其加载到我的工作区(http_archive directive中),然后在相关的构建脚本中包含头文件和库。运行良好,但不是便携式解决方案。genrule
来运行一个特定的cmake
命令序列,可以用来构建nanomsg。这种方法比较简洁,但genrule
不能重复用于cmake
其他项目。 (我提到了this discussion)。显然,cmake
不支持作为Bazel构建中的一等公民。是否有人在您自己的项目中遇到过这个问题,创建了一个通用的,可移植的方式,在使用cmake
构建的Bazel项目中包含库?如果是这样,你是怎么做到的?
正如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是否失败”,请告诉我。 :)
这个新项目:https://github.com/bazelbuild/rules_foreign_cc似乎是一个解决方案(它为cmake构建了在bazel中构建项目的规则)。