Como enviar um executável com o Language.Haskell.Interpreter?

136

Eu esperava incorporar um intérprete Haskell usando hintpara que eu pudesse escrever plugins no Haskell para usar com o meu programa. Não quero ter que enviar toda a plataforma Haskell para meus executáveis.

Normalmente, os executáveis ​​Haskell são bem independentes. Por exemplo, apagar o arquivo PATHnão causa problemas:

$ PATH=. Hello
Hello world

No entanto, um programa de teste simples usando runInterpreterbombas se eu apagar o 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"

Quais bibliotecas ou executáveis ​​precisam estar disponíveis no ambiente para que funcionem?

otool não dá muita orientação:

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)

O código de teste para TryHintnão faz muito:

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]

Apenas se liga fa uma função Test.hspara ser interpretada em tempo de execução. Test.hsse parece com isso:

module Test where
f :: Int -> Int
f x = x + 1
Michael Fox
fonte
6
Não consigo reproduzir esse problema. Quando corro, PATH= ./TryHinttudo corre bem: ele imprime alguns números e sai. Também estou usando o GHC 7.8.3. Como você está construindo TryHint?
Daniel Wagner
7
Eu também acredito que é provável que seja específico do OSX. Você pode querer abrir um ticket no do GHC rastreador como mencionado na mensagem de erro (afinal, o impossível se só acontecerá).
MasterMastic
5
Não tenho idéia do que está acontecendo com esse erro, mas, de qualquer forma, o GHC depende de muitos recursos com os quais você não está ocultando PATH=., como os arquivos de interface do Prelude e tudo o que importa transitivamente, os arquivos de biblioteca reais para base e ghc-prim e integer-gmp, e o settingsarquivo GHC . (Basicamente, tudo instalado sob /usr/lib/ghcou o diretório equivalente para a sua instalação.)
Reid Barton
2
O @MichaelFox vincular estaticamente a API do GHC não funciona com o novo vinculador dinâmico introduzido no GHC 7.8, acho: | (execução de código interativa agora exige bibliotecas dinâmicas)
bennofs
2
@bennofs, parece que seu comentário é quase uma resposta se você o reformular um pouco!
Sclv

Respostas:

2

O envio de um executável com Language.Haskell.Interpreterparece ser perfeito da maneira que você mostrou. Você precisa definir o seu PATHcomo o script que deseja executar.

E como nota lateral, como mencionado por @bennofs nos comentários, vincular estaticamente a API do GHC não funciona com o novo vinculador dinâmico introduzido no GHC 7.8 (a execução interativa de código agora requer bibliotecas dinâmicas).

Himanshu Mishra
fonte