GHC编译错误?

前一段时间,我设计了一个小系统,使我的Haskell程序的编译和测试更加舒适。 我的项目根目录如下所示:

./bin/
./bin/myMain
./bin/test
./interfaces/
./obj/
./src/
./src/makefile
./src/MyLib.hs
./src/myMain.hs
./src/testSuite.hs

myMain是主要模块,其进口如下:

import MyLib
-- irrelevant content follows

testSuite类似:

import System.Exit
import Test.HUnit
import MyLib
-- irrelevant content follows

我用两个简单的命令编译这些文件:

ghc  testSuite.hs -o ../bin/test -odir ../obj -hidir ../interfaces
ghc  myMain.hs -o ../bin/myMain -odir ../obj -hidir ../interfaces

现在,当我运行第一个测试套件时,即使存在任何对象或接口文件,整个测试套件也会编译并执行完美。 但是,当我运行第二个编译主要可执行文件时,它会再次编译测试二进制文件,除非我运行删除对象和接口文件。

原因是,据我Main.o ,主模块生成Main.oMain.hi ,不管名称是什么。 因此,在编译myMain时,GHC会看到这些文件存在,因此不会重新编译主模块。 奇怪的部分是,当我编译测试套件时情况并非如此 - 在这种情况下,即使存在对象和接口,也会重新编译Main。

$ ghc  testSuite.hs -o ../bin/test -odir ../obj -hidir ../interfaces
[1 of 2] Compiling MyLib       ( MyLib.hs, ../obj/MyLib.o )
[2 of 2] Compiling Main        ( testSuite.hs, ../obj/Main.o )
Linking ../bin/test ...

$ ghc  myMain.hs -o ../bin/myMain -odir ../obj -hidir ../interfaces
Linking ../bin/myMain ...

但是当我首先运行主编译:

$ ghc  myMain.hs -o ../bin/myMain -odir ../obj -hidir ../interfaces
[1 of 2] Compiling MyLib       ( MyLib.hs, ../obj/MyLib.o )
[2 of 2] Compiling Main        ( myMain.hs, ../obj/Main.o )
Linking ../bin/myMain ...

$ ghc  testSuite.hs -o ../bin/test -odir ../obj -hidir ../interfaces
[2 of 2] Compiling Main        ( testSuite.hs, ../obj/Main.o ) [Test.HUnit changed]
Linking ../bin/test ...

更奇怪的是,当我放置-odir-hidir GHC参数并将所有内容编译到同一目录时,问题就消失了。 为什么?

[注意:]

$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.6.3
链接地址: http://www.djcxy.com/p/7519.html

上一篇: GHC compilation bug?

下一篇: Specialization in GHC