如果我有一个包含多个可执行文件的包,我最初使用cabal build
构建。现在我更改了一个只影响一个可执行文件的文件,cabal似乎需要大约一两秒来检查每个可执行文件以查看它是否受到影响。另一方面,make
,给定相同数量的可执行文件和源文件,将在几分之一秒内确定需要重新编译的内容。为什么巨大的差异?有没有理由,cabal不能只构建自己的makefile版本并从那里开始?
答案 0 :(得分:3)
免责声明:我对Haskell或make
内部人员不够熟悉,无法提供技术细节,但有些网络搜索确实提供了与我的提案相符的一些见解(试图避免通过提供引用来引出意见) )。另外,我假设你的makefile正在调用ghc
,显然会cabal
。
提案:我认为可能有几个关键原因,但主要原因是make
是用C语言编写的,而cabal
是用Haskell编写的。这将与来自make
的高级依赖性检查相结合(尽管我不确定如何在不查看源代码的情况下证明这一点)。其他支持原因,如网上所见:
make
内部,make
可能只是有一个更快的依赖性检查机制,从而更好地跟踪这些变化。我指出这一点,因为从OP来看,它似乎与cabal可能对所有依赖项进行全面检查的地方存在显着差异。我怀疑这将是速度差异的主要原因,如果是真的。无论如何,这些都是开源的,可以从各自的站点下载(haskell.org/cabal/和savannah.gnu.org/projects/make/),允许任何人检查实现的具体细节。
根据传递给正在使用的编译器的开关,很可能会看到很多速度差异。
HTH至少指出了你正确的方向。