2011年10月24日月曜日

MacPorts2.0 Xcode4.2でpostgreSQLがSegmentation Fault 11が起こり悶絶

先日、メインの開発マシンであるMac miniにLionをクリーンインストールしました。周辺ツールも、Xcode4.2・MacPorts2.0の最新版をインストールして、開発環境も順調に作成していました。

よく使うportsはコンパイルまでに正常に終わり、あとはDatabaseへデータのリストアをすれば完了だなと思っていたら、postgreSQLがデータのリストア時にSegmentation Fault 11で落ちてしまいます。やばい、これが動かないと仕事が出来ない。

...
Segmentation Fault 11
$

ちょっと焦りましたが、こういう時はgoogle先生に聞くのが一番です。ググってみるとMacPortsのバグトラッキングのページに「postgresql91 segfaults on OS X 10.7 when built with Xcode 4.2」と言う、今の状況そのまんまなバグ報告が見つかりました。

このバグ報告に付いているコメントをみると、「Xcode 4.2ではコンパイル時に/Developer/usr/bin/clangがデフォルトで使われるが、これが悪さをしているようなので/Developer/usr/bin/llvm-gcc-4.2を使った方が良い。」と書かれていたので、llvm-gcc-4.2を使ってコンパイルしてみます。

clangとはコンパイラのフロントエンドであり、llvmをバックエンドとして使用されるものらしいです。Xcode4になって、コンパイラがgccからllvmに移行したらしいので、他のポートでも色々不具合が出ているようです。

コンパイラをllvm-gcc-4.2に変更する方法は2つ有り、/opt/local/var/macports/sources/rsync.macports.org/release/tarballs/ports/databases/postgresql90/Portfileを変更する方法と、コマンドラインからコンパイラを指定する方法があります。Portfileを変更するより、コマンドラインから指定した方がお手軽なので、今回はコマンドラインで作業をしてみます。

コンパイラを変更するには下記のコマンドを実行します

$ sudo port -d install postgresql90 configure.compiler=llvm-gcc-4.2

configure.compilerには/opt/local/share/macports/Tcl/port1.0/portconfigure.tclに定義されている下記の文字列を指定できます(指定できても該当するコンパイラーがインストールされていないとエラーになりますよ。)

    switch -exact ${configure.compiler} {
        cc { set name "System cc" }
        gcc { set name "System gcc" }
        gcc-3.3 { set name "Mac OS X gcc 3.3" }
        gcc-4.0 { set name "Mac OS X gcc 4.0" }
        gcc-4.2 { set name "Mac OS X gcc 4.2" }
        llvm-gcc-4.2 { set name "Mac OS X llvm-gcc 4.2" }
        clang { set name "Mac OS X clang" }
        apple-gcc-3.3 { set name "MacPorts Apple gcc 3.3" }
        apple-gcc-4.0 { set name "MacPorts Apple gcc 4.0" }
        apple-gcc-4.2 { set name "MacPorts Apple gcc 4.2" }
        macports-gcc-4.0 { set name "MacPorts gcc 4.0" }
        macports-gcc-4.1 { set name "MacPorts gcc 4.1" }
        macports-gcc-4.2 { set name "MacPorts gcc 4.2" }
        macports-gcc-4.3 { set name "MacPorts gcc 4.3" }
        macports-gcc-4.4 { set name "MacPorts gcc 4.4" }
        macports-gcc-4.5 { set name "MacPorts gcc 4.5" }
        macports-gcc-4.6 { set name "MacPorts gcc 4.6" }
        macports-llvm-gcc-4.2 { set name "MacPorts llvm-gcc 4.2" }
        macports-clang { set name "MacPorts clang" }
        default { return -code error "Invalid value for configure.compiler" }
    }

ちなみに、コンパイルオプションを指定したい場合は、下記のようにconfigure.optflagsを追加します。

$ sudo port -d install postgresql90 configure.optflags="-O3 -pipe" configure.compiler=llvm-gcc-4.2

llvm-gcc-4.2でコンパイルしたpostgreSQLでリストアしたところ、無事に完了しました\(^O^)/ バグトラッキングでpatch fileも投稿されていたので、近々反映されるでしょう。

0 コメント:

コメントを投稿