处理复杂和大的依赖关系
Handling complex and large dependencies
问题
我一直在业余时间用 C++ 开发游戏,我选择使用 Bazel
作为我的构建工具,因为我在使用 make
或 cmake
。我也有其他语言的依赖项(python
一些高级脚本)。我使用 glfw
进行基本 window 处理和高级图形支持,效果很好,但现在出现了问题。我不确定在 Bazel
世界中我应该如何处理 glfw
这样的依赖关系。
对于我的一些依赖项(比如 gtest
和 fruit
)我可以在我的 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
,他们就可以参加比赛了。这很棒,因为这也意味着我可以创建一个安装了 Bazel
的 Docker
容器,并且非常容易地执行 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
。
您已经考虑过这个选项。有些人可能更喜欢这种方法而不是其他方法。
问题
我一直在业余时间用 C++ 开发游戏,我选择使用 Bazel
作为我的构建工具,因为我在使用 make
或 cmake
。我也有其他语言的依赖项(python
一些高级脚本)。我使用 glfw
进行基本 window 处理和高级图形支持,效果很好,但现在出现了问题。我不确定在 Bazel
世界中我应该如何处理 glfw
这样的依赖关系。
对于我的一些依赖项(比如 gtest
和 fruit
)我可以在我的 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
,他们就可以参加比赛了。这很棒,因为这也意味着我可以创建一个安装了 Bazel
的 Docker
容器,并且非常容易地执行 CI/CD。
我可以牺牲这个方便,只是说你需要在尝试编译游戏之前安装 glfw
之类的库,但这会带来整个安装版本以及所有配置问题的备份Bazel
应该可以帮助解决。
肯定有更简单的解决方案,但我想多了?
如果 glfw
项目没有 BUILD
个文件,那么您有以下选择:
在
中构建genrule
.glfw
如果
glfw
支持某些其他构建系统,例如make
,您可以创建一个运行该工具的genrule
。这种方法有明显的缺点,比如必须声明genrule
的所有输入的不可低估的不切实际,但它是 Bazel'izingglfw
.[= 的最简单方法。 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 of92caf38
解释。需要安装
glfw
。您已经考虑过这个选项。有些人可能更喜欢这种方法而不是其他方法。