Pergunta

Estou tentando construir e instalar o ReadLine em um MacBook i386 com Snow Leopard.

Eu fiz as seguintes etapas:

download and extract readline-6.0.tar.gz
./configure
make everything
sudo make install

Eu verifiquei os exemplos e eles parecem funcionar (por exemplo, o RLTest tem suporte ao histórico). Esta é a saída do arquivo liberadline.6.0.dylib:

libreadline.6.0.dylib: Mach-O 64-bit dynamically linked shared library x86_64

Eu esperava que fosse i386, mas se os exemplos funcionarem ...

Então eu instalei o pacote readline da Cabal com o seguinte:

cabal install readline --reinstall --configure-option=--with-readline-includes="/usr/local/include" --configure-option=--with-readline-libraries="/usr/local/lib"

Parece funcionar: Observe que sem a instalação de opções de configuração falha. Eu usei a bandeira -reinstalação para forçar a reinstalação desde que já fiz muitas tentativas.

Esta é a saída das informações da cabala:

$ cabal info readline
* readline         (library)
    Synopsis:      An interface to the GNU readline library
    Latest version available: 1.0.1.0
    Latest version installed: 1.0.1.0
    Homepage:      [ Not specified ]
    Bug reports:   [ Not specified ]
    Description:   More information on readline can be found at
                   http:\/\/www.gnu.org\/directory\/readline.html.
    License:       GPL
    Maintainer:    libraries@haskell.org
    Source repo:   [ Not specified ]
    Flags:         split-base
    Dependencies:  base >=3, process -any, base <3
    Documentation: [ Not installed ]
    Cached:        Yes
    Modules:
        System.Console.Readline
        System.Console.SimpleLineEditor

Ok, parece que eu terminei. Não, não estou:

GHCi, version 6.10.4: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
Prelude> import System.Console.Readline
Prelude System.Console.Readline> do { readline "Prompt" }
Loading package syb ... linking ... done.
Loading package base-3.0.3.1 ... linking ... done.
Loading package filepath-1.1.0.2 ... linking ... done.
Loading package old-locale-1.0.0.1 ... linking ... done.
Loading package old-time-1.0.0.2 ... linking ... done.
Loading package unix-2.3.2.0 ... linking ... done.
Loading package directory-1.0.0.3 ... linking ... done.
Loading package process-1.0.1.1 ... linking ... done.
Loading package readline-1.0.1.0 ... linking ... <interactive>: 
/Users/macbook/.cabal/lib/readline-1.0.1.0/ghc-6.10.4/HSreadline-1.0.1.0.o: unknown symbol `_rl_basic_quote_characters'
ghc: unable to load package `readline-1.0.1.0'

Sem termos, também não consigo criar pacotes que dependem do ReadLine (por exemplo, JHC).

Você pode me apontar na direção certa? Diga -me se você precisar de outras informações.

Desde já, obrigado.

Foi útil?

Solução

Eu encontrei o seguinte procedimento que funcionou muito bem para mim. Espero que possa servir para referência futura.

Como eu suspeitava, não estava compilando corretamente o ReadLine. A oferta para isso foi

1. file explicity told me that the library was 64 bit
2. as per rtperson advice, compiling a test example was illuminating: linking was failing for that.

Veja a saída:

ghc --make test_readline.hs 
Linking test_readline ...
ld: warning: in /usr/local/lib/libreadline.dylib, file is not of required architecture

Por isso, configurei para compilar o ReadLine com a arquitetura correta, não estava adivinhando corretamente. Simplesmente limpei os diretores de construção (faço distclean) e depois configurei passando a bandeira -m32 para o GCC:

./configure CC="gcc -m32"

e, em seguida, reconstrua tudo (faça tudo) e instalei -o (Sudo Make Install). Agora o FileType é encorajador:

~ 628 $ file /usr/local/lib/libreadline.dylib 
/usr/local/lib/libreadline.dylib: Mach-O dynamically linked shared library i386

E finalmente, a ReadLine está funcionando.

PS: Você também pode criar o pacote ReadLine-1.0.1.0 manualmente, conforme detalhado no encadeamento "Configurando a instalação da CABAL no Snow Leopard com Macports" na lista de discussão Haskell-Cafe em 29 de dezembro de 2009.

Outras dicas

Eu também encontrei essa dificuldade. Acontece que você pode compilar binários "gordos", contendo versões de 32 e 64 bits, o que contorna esse problema muito bem. É assim que a Apple distribui suas próprias bibliotecas e elas dizem como fazê -lo nesta nota técnica:

Construindo binários universais a partir de projetos de código aberto baseados em "configurar"http://developer.apple.com/library/mac/#technotes/tn2005/tn2137.html

A nota é um pouco antiga -refere -se à construção de binários PPC/i386 -mas o procedimento funcionou bem para mim quando substituí "-arch i386 -arch x86_64". Eu agora tenho, por exemplo,

$ FILE LibreadLine.a LiberadLine.A: Mach-O Universal Binário com 2 Arquiteturas Liberadline.a (para Arquitetura I386): Library Random Library Random Library.a atual (para arquitetura x86_64): Library aleatória atual do Archive AR Archive

Tentar trabalhar com bibliotecas externas é um dos maiores pontos problemáticos de Haskell no momento. A comunidade está trabalhando nisso, mas a realidade é que a maioria dos programadores da Haskell são estudantes e professores, e mantendo procedimentos robustos de instalação entre os vários unices, Macs e caixas do Windows é o tipo de trabalho grunhido em que você realmente precisa de uma corporação com dinheiro em a linha para obter resultados. (Pense em sol com java ...)

Tendo sentido a dor o suficiente com GTK e OpenGL, estou rapidamente chegando à conclusão de que a maneira mais agradável de trabalhar com Haskell é seguir o Linux. Posso evitar noventa por cento da dor se simplesmente inicializar no Ubuntu.

Dito isto, você pode receber um erro mais informativo se tentar o seguinte:

ghc --make TestReadline.hs

Onde o testReadline.hs simplesmente testa a presença da biblioteca, como você está fazendo agora com o GHCI:

main = do { readline "Prompt" }

Existem também alguns sinalizadores que você pode querer adicionar ao arquivo .cabal do ReadLine que pode ajudá-lo: extra-bibliotecas, bibliotecas extra-GHCI e ld-opções. Aqui é uma documentação bastante concisa. Você pode encontrar melhor através do Google.

Se tudo mais falhar, o canal IRC de Haskell é muito útil.

Mas, realmente, há alguma razão para que a IO padrão de Haskell não funcione para você? Você sabe, algo assim (enrolado da página 186 de MUNDO REAL HASKELL)?

main = do 
   putStrLn "What's your name?"
   inpStr <- getLine
   putStrLn $ "Welcome, " ++ inpStr ++ "!"
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top