处理复杂和大的依赖关系

Handling complex and large dependencies

问题

我一直在业余时间用 C++ 开发游戏,我选择使用 Bazel 作为我的构建工具,因为我在使用 makecmake。我也有其他语言的依赖项(python 一些高级脚本)。我使用 glfw 进行基本 window 处理和高级图形支持,效果很好,但现在出现了问题。我不确定在 Bazel 世界中我应该如何处理 glfw 这样的依赖关系。

对于我的一些依赖项(比如 gtestfruit)我可以在我的 WORKSPACE 文件中引用它们并且 Bazel 自动处理它们但是 glfw 没有采纳 Bazel。所以所有这些让我问,对于 Bazel 项目中不使用 Bazel 的依赖项,我应该怎么办?

当前方法

对于我拥有的许多更简单的依赖项,我只是在 WORKSPACE 文件中创建了一个 new_git_repository 条目,并为库创建了一个 BUILD 文件。在您遇到像 glfw 这样具有许多依赖项的非常复杂的库之前,这非常有效。

在为 Linux 机器 运行 X11 构建 glfw 时,您现在依赖于 X11,这意味着添加 X11到我的 Bazel 设置。 X11 自带一组依赖项(X11 库,如 X11Cursor)等等。

glfw 还尝试提供基本的操纵杆支持,这在 Linux 中是默认提供的,这很棒!除了这是由内核提供的,这意味着内核也是我项目的依赖项。现在我只需要内核头文件,这似乎仍然需要很多东西。

备选方案

我采用目前采用的方法的原因是,使启动可以成功构建我的游戏的机器所需的依赖性非常小。从理论上讲,他们只需要一个 C/C++ 编译器、Java 8 和 Bazel,他们就可以参加比赛了。这很棒,因为这也意味着我可以创建一个安装了 BazelDocker 容器,并且非常容易地执行 CI/CD。

我可以牺牲这个方便,只是说你需要在尝试编译游戏之前安装 glfw 之类的库,但这会带来整个安装版本以及所有配置问题的备份Bazel 应该可以帮助解决。

肯定有更简单的解决方案,但我想多了?

如果 glfw 项目没有 BUILD 个文件,那么您有以下选择:

  • genrule.

    中构建 glfw

    如果 glfw 支持某些其他构建系统,例如 make,您可以创建一个运行该工具的 genrule。这种方法有明显的缺点,比如必须声明 genrule 的所有输入的不可低估的不切实际,但它是 Bazel'izing glfw.[= 的最简单方法。 28=]

  • 预构建 glfw.o 并将其签入您的源代码树。

    你可以为它创建一个cc_library规则,并将.o文件放在srcs中。尽管此解决方案是所有解决方案中最不灵活的,因为您不仅将目标平台限制为 .o 的构建目的,而且还使重现整个构建变得更加困难,但有时收益是值得的。

    我认为这种方法是最后的手段。即使在 Bazel 自己的源代码中也有一个 cc_library.srcs that includes a raw object file, because it was worth it, as the commit message of 92caf38 解释。

  • 需要安装glfw

    您已经考虑过这个选项。有些人可能更喜欢这种方法而不是其他方法。