Coq 具有动态依赖关系的细粒度构建?
我感兴趣的是了解bazel是否能够处理“两阶段构建”,其中依赖项是基于文件内容发现的,依赖项必须在依赖于它们的代码之前编译(不像C/C++中依赖项大多是未单独编译的头文件)。具体地说,我正在构建类似于Ocaml的Coq语言 我创建构建计划的直觉是使用一个(现有)工具(称为Coq 具有动态依赖关系的细粒度构建?,coq,bazel,bazel-rules,Coq,Bazel,Bazel Rules,我感兴趣的是了解bazel是否能够处理“两阶段构建”,其中依赖项是基于文件内容发现的,依赖项必须在依赖于它们的代码之前编译(不像C/C++中依赖项大多是未单独编译的头文件)。具体地说,我正在构建类似于Ocaml的Coq语言 我创建构建计划的直觉是使用一个(现有)工具(称为coqdep)读取.v文件并返回其所有直接依赖项的列表。以下是我想到的算法: 在目标文件上调用coqdep,并(以传递方式)调用其每个从属文件 计算目标的可传递依赖项后,添加一条规则,从包含可传递依赖项的.v中构建.vo 理想情
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通信哪些依赖项实际上未使用bazel run
运行的二进制文件将环境变量BUILD_WORKSPACE_DIRECTORY
设置为bazel WORKSPACE的根目录(请参阅),因此如果您的工具使用此环境变量,它可以就地编辑生成文件,而不是生成并复制回
(事实上,生成和复制回策略可能不可行,因为纯生成的文件将只包含Coq规则,而不包含任何其他类型的规则。要从具有其他类型规则的文件生成具有Coq规则的生成文件,必须将生成文件本身添加为依赖项,这将创建大量的ess!)dune的第一阶段对Coq的支持正是这样做的,从那时起,我们已经移动了,这样dune本身就可以理解coqdep输出。因此,如果您对Zulip感兴趣,我可以向您指出一个Coq树的版本,该版本的正确脚本可以很容易地修改以生成bazel规则。请注意,dune确实可以已经支持了一些你感兴趣的特性,还有一些非常方便的东西。你可能会因为Bazel文件和插件的耦合而感到痛苦。谢谢。<代码>沙丘< /代码>也是一个选择。我还需要支持从C++构建COQ(跟踪包含依赖)。,这似乎需要修补程序才能完成(除非有某种插件支持)我也对远程缓存很感兴趣,它可以帮助我们简化CI。我不确定它会用COQ做什么,但是它很有趣。沙丘已经支持C++代码,但是它不是很完整。但是我的意思是你可以使用我们的基础设施来生成<代码>沙丘规则