gpt4 book ai didi

haskell - 为 GHC 和 Makefile 样式构建生成正确的链接依赖项

转载 作者:行者123 更新时间:2023-12-01 22:28:21 24 4
gpt4 key购买 nike

我有一个 Haskell 项目,其中许多可执行文件是由大部分相同的模块生成的。我正在使用 Makefile 来启用并行构建,它几乎按照我想要的方式工作。这是我当前 Makefile 的精简版本,其想法取自 http://www.haskell.org/ghc/docs/latest/html/users_guide/separate-compilation.html#using-make :

HFLAGS=-O3 -Wall -v0 -fno-ignore-asserts
HASKELLS=bin1 bin2 bin3 bin4 bin5 bin6 bin7 bin8 bin9

all: $(HASKELLS)

%.hi: %.o
@:

%.hi %.o: %.hs
ghc -c $(HFLAGS) $<

$(HASKELLS): %: %.o
ghc --make $(HFLAGS) $@

.hsdepend: *.hs
ghc -M -dep-makefile .hsdepend *.hs
rm -f .hsdepend.bak

include .hsdepend

如您所见,我仍然使用 ghc --make 进行链接(仅);这样各个模块就可以并行编译,并且 ghc --make 只调用链接器。

不幸的是,这并不是万无一失的:仅当 bin1.o 比可执行文件更新时,才会触发重新链接,例如 bin1,但如果只有以下之一则不会触发重新链接其他目标文件已更新。当模块中发生更改导致 .o 文件被更新,但模块的接口(interface)未更改(即 .hi)时,就会发生这种情况> 文件未被触及。

一个替代解决方案是每次调用 make 时为每个 二进制文件触发一个空的 ghc --make ;不幸的是,这很慢并且使输出困惑(我想看看什么时候链接了某些东西,什么时候没有链接)。

ghc -M 仅为每个 .o 文件生成依赖行,但不会为链接的可执行文件生成依赖行。关于哪些 .o 文件链接到哪个可执行文件(给定主模块 binN.hs 的名称)的信息显然在那里,但我并不完全清楚如果可以使用任何 Makefile 魔法来获取它。

我只能想办法通过为 .hsdepend 编写一个后处理器来做到这一点,但这似乎太过分了。

有人可以提出更好的解决方案吗?

最佳答案

我的建议是,不要费心去尝试让这项工作成功。它应该可以工作,如果可以的话那就太好了,但是 ghc 的 -M 支持目前已被破坏(例如,它不会生成正确的依赖关系规则,并忽略一些非 Haskell 文件的规则)。实际上要让它可靠地工作需要付出很大的努力,并且最终会触发比严格必要的更多的重建。

此外,对并行构建的支持已合并到 GHC 中,因此当 ghc-7.8 发布时,您将能够使用普通的 ghc --make 来获得并行构建。或者你现在可以使用 ghc 的 HEAD。

关于haskell - 为 GHC 和 Makefile 样式构建生成正确的链接依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20938894/

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