Coq 具有动态依赖关系的细粒度构建?

Coq 具有动态依赖关系的细粒度构建?,coq,bazel,bazel-rules,Coq,Bazel,Bazel Rules,我感兴趣的是了解bazel是否能够处理“两阶段构建”,其中依赖项是基于文件内容发现的,依赖项必须在依赖于它们的代码之前编译(不像C/C++中依赖项大多是未单独编译的头文件)。具体地说,我正在构建类似于Ocaml的Coq语言 我创建构建计划的直觉是使用一个(现有)工具(称为coqdep)读取.v文件并返回其所有直接依赖项的列表。以下是我想到的算法: 在目标文件上调用coqdep,并(以传递方式)调用其每个从属文件 计算目标的可传递依赖项后,添加一条规则,从包含可传递依赖项的.v中构建.vo 理想情

我感兴趣的是了解bazel是否能够处理“两阶段构建”,其中依赖项是基于文件内容发现的,依赖项必须在依赖于它们的代码之前编译(不像C/C++中依赖项大多是未单独编译的头文件)。具体地说,我正在构建类似于Ocaml的Coq语言

我创建构建计划的直觉是使用一个(现有)工具(称为
coqdep
)读取
.v
文件并返回其所有直接依赖项的列表。以下是我想到的算法:

  • 在目标文件上调用
    coqdep
    ,并(以传递方式)调用其每个从属文件
  • 计算目标的可传递依赖项后,添加一条规则,从包含可传递依赖项的
    .v
    中构建
    .vo
  • 理想情况下,对
    coqdep
    (在步骤1中)的调用将在构建之间缓存,因此只需要在文件更改时重新计算。依赖信息的可传递闭包也将被缓存

    有可能在bazel中实现这一点吗?有没有为这样的语言设置构建的指针?天真地说,这似乎是一个两阶段的构建,我不确定这如何适合bazel的编译模型。当我查看Ocaml的规则时,它似乎依赖于
    ocamlbuild
    来满足构建顺序和依赖性需求,而不是在bazel中“本机”完成


    感谢您的指点和见解。

    我正在研究类似的问题,因为我想用Bazel构建ReasonML

    Bazel基于存储库中的
    构建
    文件计算Bazel目标之间的依赖关系,而无需访问源文件。在此分析阶段,您可以与文件系统进行的唯一交互是在规则调用中使用
    glob
    列出目录内容

    目前,我看到了使用Bazel获得细粒度增量构建的四个选项:

  • 用手写的
    BUILD
    文件详细说明细粒度依赖关系
  • 使用工具生成
    生成
    文件。您不能直接将该工具包装在Bazel规则中,使其在
    Bazel build
    期间运行,因为生成的
    build
    文件将位于输出文件夹中,而不是源文件夹中。但是,您可以在生成期间运行调用
    coqdep
    的规则,并提供一个可执行文件,根据
    coqdep
    调用的(可缓存)结果编辑源文件夹中的
    build
    文件。由于您可以在构建期间读取源文件夹和输出文件夹,因此如果用户必须再次运行可执行文件,您甚至可以向用户打印消息。无论如何,完整的构建过程将是
    bazel运行//tools/updatecoq构建文件和&bazel构建
    ,以达到一个固定点
  • 构建
    文件中具有粗粒度依赖项,但具有持久性工作程序以增量方式重建单个目标
  • 构建
    文件中对依赖项进行粒度调整,但为每个目标文件生成单独的操作,并使用的
    未使用的输入_列表
    参数与Bazel通信哪些依赖项实际上未使用
  • 不过,我不确定3和4是否真的能起作用,或者需要付出多少努力。

    (目前还没有足够的代表对此发表评论,所以这是一个答案)

    #其中的2个可能是最典型的

    Golang就是这样一个例子,它处于同一条船上:Golang文件的依赖关系是在Bazel上下文之外通过读取源文件的导入语句来确定的。gazelle是一种根据Bazel工作区源文件中的导入在构建文件中写入/重写Golang规则的工具。可以为遵循此模式的其他语言创建类似的工具

    但生成的生成文件将位于输出文件夹中,而不是源文件夹中。因此,您还必须提供一个可执行文件,将文件复制回源文件夹

    请注意,通过
    bazel run
    运行的二进制文件将环境变量
    BUILD_WORKSPACE_DIRECTORY
    设置为bazel WORKSPACE的根目录(请参阅),因此如果您的工具使用此环境变量,它可以就地编辑生成文件,而不是生成并复制回


    (事实上,生成和复制回策略可能不可行,因为纯生成的文件将只包含Coq规则,而不包含任何其他类型的规则。要从具有其他类型规则的文件生成具有Coq规则的生成文件,必须将生成文件本身添加为依赖项,这将创建大量的ess!)

    dune的第一阶段对Coq的支持正是这样做的,从那时起,我们已经移动了,这样dune本身就可以理解coqdep输出。因此,如果您对Zulip感兴趣,我可以向您指出一个Coq树的版本,该版本的正确脚本可以很容易地修改以生成bazel规则。请注意,dune确实可以已经支持了一些你感兴趣的特性,还有一些非常方便的东西。你可能会因为Bazel文件和插件的耦合而感到痛苦。谢谢。<代码>沙丘< /代码>也是一个选择。我还需要支持从C++构建COQ(跟踪包含依赖)。,这似乎需要修补程序才能完成(除非有某种插件支持)我也对远程缓存很感兴趣,它可以帮助我们简化CI。我不确定它会用COQ做什么,但是它很有趣。沙丘已经支持C++代码,但是它不是很完整。但是我的意思是你可以使用我们的基础设施来生成<代码>沙丘规则