2016-11-16 4 views
0

Je possède ce graphe de dépendance (en ignorant les dépendances des modules tiers):GHC affirme le module uniquement disponible en tant que module de démarrage quand il ne doit pas être

Main: 
    GSI.Util 
    GSI.Value 
    GSI.Result 
    GSI.Eval 
    GSI.ByteCode 
    GSI.Thread 
GSI.Main: 
    GSI.Value 
    GSI.ByteCode 
GSI.Thread: 
    GSI.Util 
    GSI.RTS 
    GSI.Value 
    GSI.Result 
    GSI.Eval 
GSI.Eval: 
    GSI.Util 
    GSI.RTS 
    GSI.Value 
    GSI.Result 
    ACE 
GSI.Eval (.hs-boot): 
    GSI.Value 
ACE: 
    GSI.RTS 
    GSI.Value 
    GSI.ByteCode 
    GSI.Result 
    {-# SOURCE #-} GSI.Eval 
GSI.ByteCode: 
    GSI.Util 
    GSI.Value 
    {-# SOURCE #-} GSI.Thread 
GSI.ByteCode (.hs-boot): 
    {-# SOURCE #-} GSI.Value 
    {-# SOURCE #-} GSI.Thread 
GSI.Result: 
    GSI.Util 
    GSI.RTS 
    GSI.Value 
GSI.Value: 
    GSI.Util 
    GSI.RTS 
    {-# SOURCE #-} GSI.ByteCode 

(j'aimerais réduire ce graphique vers le bas plus loin, mais honnêtement, je suis perdu quant aux pièces qui sont pertinentes: les fichiers .hs-boot non listés n'ont pas de dépendances sur mon code). Quand je fais

ghc --make Main.hs 

Je reçois ce message:

[10 of 13] Compiling ACE    (ACE.hs, ACE.o) [GSI.ByteCode changed] 
module GSI.Thread cannot be linked; it is only available as a boot module 

Qu'est-ce que sur la terre? J'importe GSI.Thread pas comme un module de démarrage de Main, alors comment GHC peut-il affirmer qu'il n'est disponible qu'en tant que module de démarrage? (? Et, d'ailleurs, pourquoi ne peut GHC simplement détecter cette situation et inclure le module non-démarrage automatique)

+0

Bien 'ACE' n'est pas' Main' et 'ACE' (mais pas' Main') est impliqué dans un cycle d'importation avec 'GSI.Thread', donc ce message ne semble pas déraisonnable. Vous avez un Template Haskell ou quelque chose dans 'ACE'? –

+0

@ReidBarton - Je ne comprends pas du tout. Vous semblez savoir ce que ce message d'erreur signifie - et Google ne le fait pas - alors peut-être pourriez-vous expliquer cela? Je suis complètement perdu. –

+0

Je ne sais pas vraiment ce que ça veut dire, sauf que ça vient du linker ghci, donc vous devez utiliser Template Haskell ou quelque chose comme ça. –

Répondre

1

Le problème réel est que l'ACE et GSI.Value avaient une dépendance circulaire:

ACE -> GSI.Value -> GSI.Thread -> GSI.Eval -> ACE 

Il s'agit d'un problème irrécupérable car ACE utilise une fonction de GSI.Value dans une épissure Haskell modèle. Cela nécessite que GHC charge dynamiquement GSI.Value afin de compiler ACE; mais c'est clairement impossible.

La solution consistait à déplacer le type de thread de GSI.Thread et à un module distinct qui pouvait éviter toute dépendance sur GSI.Eval ou GSI.Value.