首页 文章

在Bazel项目中构建CMake库

提问于
浏览
3

我在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 回答

  • 6

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

相关问题