Bazel 处理复杂和大型依赖项
问题 <>我在空闲时间开发了一个C++游戏,我选择使用<代码> Bazel <代码>作为我的构建工具,因为我从来没有过一个运气(或乐趣)与<代码> >制作< /C> >或>代码> Cugs<代码>。我在其他语言中也有依赖关系(Bazel 处理复杂和大型依赖项,bazel,Bazel,问题 我在空闲时间开发了一个C++游戏,我选择使用 Bazel 作为我的构建工具,因为我从来没有过一个运气(或乐趣)与 >制作< /C> >或>代码> Cugs。我在其他语言中也有依赖关系(python对于一些高级脚本)。我正在使用glfw进行基本窗口处理和高级图形支持,这已经足够好了,但现在问题来了。我不确定应该如何在Bazel世界中处理像glfw这样的依赖关系 对于我的一些依赖项(如gtest和fruit),我可以在WORKSPACE文件中引用它们,Bazel自动处理它们,但glfw没有采用
python
对于一些高级脚本)。我正在使用glfw
进行基本窗口处理和高级图形支持,这已经足够好了,但现在问题来了。我不确定应该如何在Bazel
世界中处理像glfw
这样的依赖关系
对于我的一些依赖项(如gtest
和fruit
),我可以在WORKSPACE
文件中引用它们,Bazel
自动处理它们,但glfw
没有采用Bazel
。所有这些都让我想问,对于在Bazel
项目中不使用Bazel
的依赖项,我应该怎么做
当前方法
对于许多简单的依赖项,我只是在我的工作区
文件中创建了一个新的\u git\u存储库
条目,并为库创建了一个构建
文件。这非常有效,直到您使用了真正复杂的库,如glfw
,这些库本身有许多依赖项
当为运行X11
的Linux机器构建glfw
时,您现在依赖于X11
,这意味着将X11
添加到我的Bazel
设置中X11
自带一组依赖项(如X11
库,如X11Cursor
)等等
glfw
还尝试提供基本的操纵杆支持,这是Linux默认提供的,非常好!除了这是由内核提供的,这意味着内核也是我的项目的一个依赖项。现在,除了内核头,我不需要任何东西了,这似乎仍然需要很多东西
备选方案
到目前为止,我之所以采用这种方法,是为了使能够成功构建我的游戏的机器运转所需的依赖性非常小。从理论上讲,他们只需要一个C/C++编译器、Java8和Bazel
,他们就可以开始比赛了。这很好,因为这也意味着我可以创建一个安装了Bazel
的Docker
容器,并且可以非常轻松地制作CI/CD
我可以牺牲这种简单性,只说在尝试编译游戏之前需要安装像glfw
这样的库,但这会带来安装哪个版本以及如何配置的全部问题,而Bazel
应该帮助解决这个问题
当然有一个更简单的解决方案,我想得太多了?如果
glfw
项目没有BUILD
文件,那么您有以下选项:
- 在
中构建genrule
如果glfw
支持其他构建系统,如glfw
,则可以创建运行该工具的make
。这种方法有明显的缺点,比如必须声明该genrule
的所有输入是不可低估的不切实际,但这是将genrule
打包的最简单方法glfw
- 预构建
,并将其检查到源代码树中 您可以为它创建glfw.o
规则,并将cc\u库
文件放入.o
中。尽管此解决方案是所有解决方案中最不灵活的,因为您不仅将目标平台限制在构建srcs
的目的上,而且使整个构建的复制变得更困难,但其好处有时是值得付出代价的 我认为这是最后的办法。即使在Bazel自己的源代码中也有一个,因为正如的commit消息所解释的,这是值得的.o
- 要求安装
您已经考虑过这个选项。与其他方法相比,有些人可能更喜欢这种方法glfw
glfw
,这样至少我知道可以安装和设置正确的版本,现在就使用后一个选项。谢谢