Bazel 处理复杂和大型依赖项

Bazel 处理复杂和大型依赖项,bazel,Bazel,问题 我在空闲时间开发了一个C++游戏,我选择使用 Bazel 作为我的构建工具,因为我从来没有过一个运气(或乐趣)与 >制作< /C> >或>代码> Cugs。我在其他语言中也有依赖关系(python对于一些高级脚本)。我正在使用glfw进行基本窗口处理和高级图形支持,这已经足够好了,但现在问题来了。我不确定应该如何在Bazel世界中处理像glfw这样的依赖关系 对于我的一些依赖项(如gtest和fruit),我可以在WORKSPACE文件中引用它们,Bazel自动处理它们,但glfw没有采用

问题

<>我在空闲时间开发了一个C++游戏,我选择使用<代码> Bazel <代码>作为我的构建工具,因为我从来没有过一个运气(或乐趣)与<代码> >制作< /C> >或>代码> Cugs<代码>。我在其他语言中也有依赖关系(
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
    中。尽管此解决方案是所有解决方案中最不灵活的,因为您不仅将目标平台限制在构建
    .o
    的目的上,而且使整个构建的复制变得更困难,但其好处有时是值得付出代价的

    我认为这是最后的办法。即使在Bazel自己的源代码中也有一个,因为正如的commit消息所解释的,这是值得的

  • 要求安装
    glfw

    您已经考虑过这个选项。与其他方法相比,有些人可能更喜欢这种方法


我会看看是否可以将一些脚本放在一起,为目标平台构建
glfw
,这样至少我知道可以安装和设置正确的版本,现在就使用后一个选项。谢谢