在Bazel项目中构建CMake库

Jed*_*edi 3 build cmake nanomsg bazel tensorflow

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

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

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

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

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

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

小智 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是否失败",请告诉我.:)


huk*_*ing 6

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