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