Comment expédier un exécutable avec Language.Haskell.Interpreter?

136

J'espérais intégrer un interpréteur Haskell en utilisant hintafin que je puisse écrire des plugins dans Haskell à utiliser avec mon programme. Je ne veux pas avoir à expédier toute la plate-forme Haskell pour mes exécutables.

Normalement, les exécutables Haskell sont assez autonomes. Par exemple, effacer le PATHne pose pas de problème:

$ PATH=. Hello
Hello world

Cependant, un simple programme de test utilisant des runInterpreterbombes si j'efface le PATH:

$ PATH=. TryHint
GhcException "panic! (the 'impossible' happened)\n  (GHC version 7.8.3 for x86_64-apple-darwin):\n\tDynamic linker not initialised\n\nPlease report this as a GHC bug:  http://www.haskell.org/ghc/reportabug\n"

Quelles bibliothèques ou exécutables doivent être disponibles dans l'environnement pour que cela fonctionne?

otool ne donne pas beaucoup d'indications:

otool -L TryHint
TryHint:
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
    /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
    /usr/local/lib/libgmp.10.dylib (compatibility version 13.0.0, current version 13.0.0)

Le code de test pour TryHintne fait pas grand chose:

import Control.Monad
import Language.Haskell.Interpreter

main = do
  f <- runInterpreter $ loadModules ["Test"] >> setTopLevelModules ["Test"] >> interpret "f" (as :: Int -> Int)
  case f of
    Left e -> print e
    Right r -> mapM_ (print . r) [1..10]

Il se lie simplement fà une fonction Test.hspour être interprété au moment de l'exécution. Test.hsressemble à ça:

module Test where
f :: Int -> Int
f x = x + 1
Michael Fox
la source
6
Je ne peux pas reproduire ce problème. Quand je lance, PATH= ./TryHinttout se passe bien: il imprime quelques chiffres, puis sort. J'utilise également GHC 7.8.3. Comment construisez-vous TryHint?
Daniel Wagner
7
Je pense aussi que c'est probablement spécifique à OSX. Vous voudrez peut-être ouvrir un ticket sur le tracker de GHC comme mentionné dans le message d'erreur (après tout, l'impossible s'est produit).
MasterMastic
5
Je n'ai aucune idée de ce qui se passe avec cette erreur, mais dans tous les cas, GHC dépend de beaucoup de ressources avec lesquelles vous ne lui cachez pas PATH=., comme les fichiers d'interface pour Prelude et tout ce qu'il importe de manière transitoire, les fichiers de bibliothèque réels pour base et ghc-prim et integer-gmp, et le settingsfichier GHC . (Fondamentalement, tout est installé sous /usr/lib/ghcou dans le répertoire équivalent pour votre installation.)
Reid Barton
2
@MichaelFox reliant statiquement l'API GHC ne fonctionne pas avec le nouvel éditeur de liens dynamique introduit dans GHC 7.8, je pense: | (l'exécution de code interactif nécessite maintenant des bibliothèques dynamiques)
bennofs
2
@bennofs il semble que votre commentaire est presque une réponse si vous le reformulez légèrement!
sclv

Réponses:

2

L'expédition d'un exécutable avec Language.Haskell.Interpretersemble aller parfaitement avec la façon dont vous l'avez montré. Vous devez définir votre PATHsur le script que vous souhaitez exécuter.

De plus, comme mentionné par @bennofs dans les commentaires, la liaison statique de l'API GHC ne fonctionne pas avec le nouvel éditeur de liens dynamique introduit dans GHC 7.8 (l'exécution de code interactif nécessite désormais des bibliothèques dynamiques).

Himanshu Mishra
la source