Hatena::Grouphaskell

HowManyFilesの日記

2010-02-11日本語訳

見落としてた。

今陥っている状態とは関係ないと思うが、Haskell on Snow Leopard ← Passing Curiosityを読んでいなかった。読んでみたところ、どうやら Snow Leopard で Haskell の開発を行うためにやらなきゃいけないことがもう少しあるようなのでやることにした。

以下、上記URLに掲載されているエントリを訳してみた。誰かしらに役に立つかもしれない。

日本語訳

僕は Apple のファンボーイだってことを内緒にしてるんだけど、そんな僕は Snow Leopard を予約していて、手持ちの MacBook を発売日当日にアップグレードしたんだ。不幸にも、その作業は僕の Haskell 開発環境を完膚なきまでにぶち壊してくれた。僕はなんとかぶち当たった問題すべてを解決して、ここに解決方法を書き留めた。注意点はこの記事の最後に書いてあるから読んでみて欲しい。

最初に、GHC はなにもコンパイルしてくれなくなる。この問題はつまるところ、Snow Leopard とその中にあるコンパイラ全てが、64bit での処理がデフォになったってことだ。悲劇的なことに、GHC が Mac OS X 用に生成するコードは 32bit 用で、そのせいでアセンブラとリンカが以下のようなエラーを出すことになる。

/var/folders/1J/1JKije6yHpm78qqdjF5N2U+++TI/-Tmp-/ghc7743_0/ ghc7743_0.s:1357:0:
suffix or operands invalid for `push'

/var/folders/1J/1JKije6yHpm78qqdjF5N2U+++TI/-Tmp-/ghc7743_0/ ghc7743_0.s:1401:0:
suffix or operands invalid for `push'</code>

解決方法は、GHC に対して -m32 フラグをコンパイラ(もし使われるなら), アセンブラ, そしてリンカへ渡すように設定することだ。

コレを実現するための最も手っ取り早い方法は、 /usr/bin/ghc (GHC の実体を呼び出すためのシェルスクリプト)を編集して、-optc-m32 opta-m32 -optl-m32 のフラグを付け足すことだ。これは、上記フラグがあらゆる場合に適用されることを明確にする。

悲しむべきことに、物語はまだ終わらない。Haskell での開発環境を整えるための次のステップは、cabal-install をインストールすることだ。こいつは HTTP と zlib の二つのパッケージに依存している。HTTP には特に問題はなく、./Setup.lhs を実行することでビルドも実行も可能だ。しかし、zlib は壊れてしまっているらしく、"互換性のないバージョンです" と実行時にレポートしてくる。このエラーそのものは Codec/Compression/Zlib/Stream.hsc に原因があるらしいが、私は完全に途方にくれてしまった。

私にとって状況を進展させるための唯一の方法は、Haskell の環境からしばらくの間離れてしまうこと(Hugs すら MacPorts でインストール出来ないんだもん)か、まさにそうしようとしていたように、開発の全てを VirtualBox の中の Linux で行うかだった。これは明らかに理想的な状態とは言い難く、GHC の開発者がこの問題を次の GHC のリリースまでに解決してくれていることを望んだ。


Update

最初の問題は、GHC がコンパイルとアセンブルとリンクを 32bit で行うようにすることだ。これは、ghc のスクリプトを修正する上記の作業を含む。そしてそれと同時に、ライブラリの類(例えば、libcurl とか libpq とか)をビルドする際に下記のようなフラグの塊を Setup や cabal に渡すことも要求される。

./Setup configure --ld-options="-arch i386" --gcc-option=-m32

ひょっとすると、--gcc-option=-m32 は不要かもしれない(/usr/bin/ghc ですでに同じ意味のことを書いている)が、その他のオプションはリンカが正しいアーキテクチャを使うように説得するために必須だ。さもないと、リンクに失敗して何も得ることが出来ないか、ひどい場合には壊れたライブラリや実行ファイルが出来上がることになる。同じことが、上記の /usr/bin/ghc の編集に対しても言える。

私が直面した二番目の問題は(なんか Python のパッケージでも同じような問題があったよね)、32bit ライブラリを上手くリンク出来るようにすることだ。これは、もし貴方が拡張ライブラリをリンクしない場合には問題とはならない。が、もしそうでないなら、拡張ライブラリのうちいくつかは Macports でインストールすべきだ。この場合に注意しなければならないのは、リンクしたいライブラリ全てはユニバーサルバリアントのものをインストールしなくてはならないということだ。そうしないと、x86_64 のライブラリしかインストールされず、i386 な Haskell のコードと正しくリンクすることが出来ない。最も簡単な方法は、何かをインストールする前に /opt/local/etc/macports/variants.conf を編集して、+universal を追加することだ。パッケージを全部リビルドするなんて、楽しいことじゃないからね。

もし君がすでに Snow Leopard に移行してて、いろんなものをインストールしているとしたら、全部 universal でリビルドしたいに違いない。上記の編集を行った後に、RoR コミュで紹介されていた方法で、Macports に全てのパッケージを強制的にリビルドさせることが出来る。

sudo port selfupdate
sudo port sync
sudo port upgrade --force installed