Usando o pacote Cabal Readline no i386 MacBook (Snow Leopard)
-
22-09-2019 - |
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.
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 ++ "!"