gpt4 book ai didi

haskell - 当什么都没有改变时,如何阻止 GHC 重新编译模块?

转载 作者:行者123 更新时间:2023-12-02 16:01:35 25 4
gpt4 key购买 nike

我有以下目录结构:

  • libgs - 基本的全局脚本抽象机和标准库
  • gsi - 全局脚本解释器
  • gs2hs - Haskell 编译器的全局脚本

大多数(当然不是全部)代码是用全局脚本编写的,并由 Haskell 程序 hsgs2hs 翻译成 Haskell。

因此,gsi 和 gs2hs 中的代码都依赖于 libgs 中的模块。

由于我的代码组织有些草率,gs2hs 中的编译器还依赖于 gsi 目录中的前端模块(解析器、类型检查器等)。

除了法律:如果重要的话:我的代码可以在线免费获得,但不是开源的,并且它的许可证不允许通过 Hackage 重新分发。结束法律。

我可以通过运行使这个目录结构工作

ghc --make -i../libgs gsi.hs -o gsi

在 gsi 目录中,和

ghc --make -i../libgs -i ../gsi gs2hs.hs -o gs2hs

在 gs2hs 目录中。

这有一个问题,每次我按顺序执行两个构建时,GHC 都会重新编译 libgs 目录中的每个模块以及 gsi 目录中的每个共享模块,并告诉我“标志已更改”。

我想,好吧,我应该为 Haskell 中重复使用的代码使用包,对吧?所以我将 libgs 转换为一个包:

  • 将 libgs.cabal 文件添加到该目录,将所有模块列为公开模块。
  • 添加运行 cabal install --lib --package-env $REPO_ROOT/package.env . 的 libgs/install-all 脚本,并在构建 gsi 和 gs2hs 之前调用它
  • -package-env $REPO_ROOT/package.env 添加到 gsi 和 gs2hs 目录中的 GHcflags。

没有快乐!

现在,对 libgs 的任何更改——即使只是向其添加一个新模块——都会导致 GHC 重新编译 gsi 目录中的每个模块,告诉我基本模块 GSI.Value 已更改。即使实际上没有;该模块的源代码及其依赖的所有内容(不多)都没有改变。只是它来自的包的哈希值发生了变化。

如何阻止 GHC 不断地重新编译世界,并让它只在结果可能不同时才重新编译?

最佳答案

Add a libgs.cabal file to that directory, listing all the modules as exposed modules.

好的,很好。

Add a libgs/install-all script that runs cabal install --lib --package-env $REPO_ROOT/package.env

不要那样做。作为一般规则,永远不要使用 install --lib。通常最好让 Cabal 决定何时安装库。最简单的方法是将可执行文件放在包本身中。您可以在 .cabal 文件中同时拥有一个 library: 部分,以及任意多个 executable: gsiexecutable: gs2hs 一个。

或者,您可以将 libgs 保留为一个不关心可执行文件的包,但将它们分别放在自己的包中。然后你不在包目录本身做任何构建,而是在你的主 src 目录中放置一个 cabal.project 文件,说

packages: ./libgs ./gsi ./gs2hs

然后在该目录中运行 cabal new-build。它将需要的目标文件集中存储在其 .dist-newstyle 目录中。

关于haskell - 当什么都没有改变时,如何阻止 GHC 重新编译模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70545368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com