[Haskell-cafe] .hi inconsistency bug.
Daniel Gorín
dgorin at dc.uba.ar
Wed Mar 18 09:07:51 EDT 2009
> So, if I understand correctly, the interpreter is compiling
> MainTypes twice?
No, the interpreter is trying to compile types that were already
compiled by the compiler when building your application. The resulting
types are incompatible.
> Could this be a result of having two outputs (one executable and one
> library) in my .cabal file? it _does_ compile those things twice...
> If I create a second cabal file which separates these two different
> packages, would that fix it?
I don't think so. If you already have your application split in
library part + executable part, then everything should be fine (as
long as the library is installed before running your application).
> The issue is, the (dynamic) interpreter part of my code is part of
> the main loop of the program, and is (as far as I can see)
> inseparable from the rest of the code.
What you need to separate is the code you are planning to interpret in
runtime. For example, say you have:
src/HackMail/Main.hs
src/HackMail/Data/Types.hs
src/SomePlugin.hs
and SomePlugin.hs is loaded by the interpreter, then you may want to
reorganize your files like
this:
src/HackMail/Main.hs
src/HackMail/Data/Types.hs
plugins/SomePlugin.hs
and set the source path to "plugins" directory (using something like
unsafeSetGhcOption "-i./plugins", or set [searchPath := ["./
plugins"]], if using the darcs version).
Daniel
> I'll give the cabal thing a try, given the incredible triviality of
> doing everything with cabal, I should be done testing the solution
> before I hit the send button... Cabal guys, you rock.
>
> Thanks again, Dan.
>
> /Joe
>
> Daniel Gorín wrote:
>> Hi
>>
>> Just a wild guess but maybe the interpreter is recompiling (in
>> runtime) code that has already been compiled to build your
>> application (in compile-time). This may lead to inconsistencies
>> since a type such as HackMail.Data.Main.Types.Filter may refer to
>> two different (and incompatible) types.
>>
>> To see if this is the case, make sure your "dynamic" code is not
>> located together with your base code (i.e., move it to another
>> directory, and set the src file directory for the interpreter
>> accordingly). Now you may get another runtime error, something
>> along the lines of "Module not found: HackMail.Data.MainTypes".
>> This basically means that you need to make your (already compiled)
>> types available to the interpreter. I think the simplest way is to
>> put all your support types in a package, register it with ghc, link
>> your application to it, and ask the interpreter to use this package
>> (with a "-package " flag).
>>
>> Hope this helps!
>>
>> Daniel
>>
>> On Mar 17, 2009, at 11:52 PM, Joe Fredette wrote:
>>
>>> List,
>>>
>>> I've got this project, source on patch-tag here[1]
>>>
>>> It's a nice little project, I've got the whole thing roughly
>>> working, it compiles okay, everything seems to work, until I try
>>> to run it, specifically when I run it in ghci, or when I run the
>>> main executable (which uses hint), and look at any type involving
>>> my "Email" type, it gives me the following error:
>>>
>>> Type syonym HackMail.Data.MainTypes.Filter:
>>> Can't find interface-file declaration for type constructor or
>>> class HackMail.Data.ParseEmail.Email
>>> Probable cause: bug in .hi-boot file, or inconsistent .hi file
>>> Use -ddump-if-trace to get an idea of which file caused the
>>> error
>>>
>>> As far as I understand, it wants to find the interface-file
>>> declaration for a specific type (Email) exported by the ParseEmail
>>> module, all of the exports (I think) are in order. I've tried
>>> mucking around with it a bit, but I don't fully understand what
>>> the error even means, much less how to fix it.
>>>
>>> Other relevant info, Email is exported in a roundabout way, namely
>>> by importing a module MainTypes, which exports a module Email,
>>> which exports a the ParseEmail Module, which exports the datatype
>>> Email.
>>>
>>> The "Filter" delcaration it _actually_ complains about (it's just
>>> the first place the email type is invoked) is:
>>>
>>> type Filter a = ReaderT (Config, Email) IO a
>>>
>>> nothing particularly special.
>>>
>>> Any help fixing this is greatly appreciated, I did find this bug
>>> report[2] which seems like it might be relevant.
>>>
>>> But trying to unregister -> cabal clean -> cabal install doesn't
>>> fix it. I've also tried manually removing the dist/ folder, and
>>> also unregistering the package.
>>>
>>> Thanks again.
>>>
>>> /Joe
>>>
>>> [1] http://patch-tag.com/repo/Hackmail/browse
>>> [2] http://hackage.haskell.org/trac/ghc/ticket/2057
>>> <jfredett.vcf>_______________________________________________
>>> Haskell-Cafe mailing list
>>> Haskell-Cafe at haskell.org
>>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>
>>
> <jfredett.vcf>
More information about the Haskell-Cafe
mailing list