MacPorts 2.0.1 インストールメモ: PATH とファイルシステムの case-sensitivity に注意
Lion に対応した MacPorts 2.0 が先月リリースされました。続いて、今月 2 日には 2.0.1 がリリースされています。このバージョンは完成度が高く、目立った不具合も報告されていないようでした。「そろそろ大丈夫だろう」と考えて私もインストールしたところ、無事インストールできたものの小さなトラブルに遭遇してしまいました。
大事なことなので二度言いますが、MacPorts 2.0 の完成度は高いので、ほとんどの人はトラブル無く使えるはずです。それでも、私と同じ地雷を踏む人が一人や二人いるかもしれないと考え、私が遭遇したトラブルと対処法をメモしておきます。
ちなみに、私が MacPorts 2.0.1 をインストールした環境は、
- Mac OS X 10.6.8
- Xcode 4.0.2
- 2 パーティション
- / ... HFS+ (case-insensitive)
- /opt ... HFS+ (case-sensitive)
- zsh
です。この環境の /opt/macports に MacPorts をイントールしました。
私的インストールログ
トラブル対処済みの最終版インストールログを gist にして貼りつけてみました。行末の括弧つき数字は行番号で、後で参照するときに使います。私的なログなのでトラブルとは関係ない趣味もいろいろと含まれています。
この中に、処理済み地雷が 2 個含まれています。次節以降で、私が踏んだ地雷を紹介していきます。
configure 時の PATH に注意
私はソースから MacPorts をビルドしてインストールしました。最初にインストールしたときは、configure 時の PATH に /usr/sbin を含めないという失敗をしました。この失敗は、(3) で対処済みです。以下、失敗と対処法を解説します。
まず、MacPorts 2.0 の変更点の一つを説明します。MacPorts 2.0 から root ではなく一般ユーザに権限を降格して port ビルドできるようになりました。ChangeLog によると、この一般ユーザ名はデフォルトでは macports で、ユーザ macports は MacPorts のインストール時に作成されるそうです。
これだけでも MacPorts 1.9 から 2.0 に移行する価値があると私は考え、MacPorts 1.9 をアンインストールして MacPorts 2.0 をインストールすることにしました。しかし、最初にインストールしたときにはユーザ macports が作成されず、port のビルドは root のままでした。ユーザ macports が作成されない理由を調べてみたところ、dscl(1) と dseditgroup(8) の 2 つのコマンドが関係していることが分かりました。
この 2 つのコマンドはユーザとグループを作成するのに利用されます。dscl(1) はユーザ macports を作成するのに、dseditgroup(8) はユーザ macports が所属するグループ macports を作成するのに利用されます。どちらも Mac OS X に標準で含まれるコマンドなのですが、man ページのカテゴリから想像がつくように、dscl は /usr/bin/dscl に、dseditgroup は /usr/sbin/dseditgroup に置かれています。
ソースからインストールする際は、configure スクリプトが dscl と dseditgroup を見つけることになっています。しかし、私が最初にインストールしたときには、PATH に /usr/bin が含まれていなかったため、configure スクリプトが dseditgroup を見つけられませんでした。configure スクリプトが dseditgroup を見つけられないとどうなるかというと、続く make install がユーザ macports の作成をあきらめ、ユーザ macports が作成されないということになります。
対処法としては、configure スクリプトを実行するときに PATH に /usr/sbin を含めればいいので、(3) で PATH に/usr/sbin を追加してみました。先のインストールログを振返ってみると、(6) でちゃんとユーザ macports が作成されていることを確認できます。
$prefix と /tmp の case-sensitivity に注意
最初の環境のところで紹介したように、私は case-sensitive な HFS+ パーティションを一つ作って、そこに MacPorts をインストールしています。/ は買ったときのまま case-insensitive な HFS+ にしています。さて、MacPorts は port のビルドに /tmp を利用するのですが、私の環境では /tmp は case-insensitive なファイルシステムです。こうなると、
- port のビルドは case-insensitive
- port のインストール先は case-sensitive
というねじれが生じます。
このねじれが生じた状態で port をインストールしていってどうなったかというと、
---> Computing dependencies for openssl ---> Activating openssl @1.0.0d_0+universal Error: Target org.macports.activate returned: could not read "/tmp/mpextract********/opt/macports/share/man/man3/bn_print.3ssl.gz": no such file or directory Log for openssl is at: /opt/macports/var/macports/logs/_opt_macports_var_macports_sources_rsync.macports.org_release_ports_devel_openssl/openssl/main.log Error: Status 1 encountered during processing.
openssl のインストールで怒られました。
対処法としては、単純に /tmp と /opt/macports の case-sensitivity を一致させてあげればいいので、port install の実行時に TMPDIR=/opt/tmp することで解決することにしました。具体的には、(7) のように alias sport を作って、port install 実行時に環境変数 TMPDIR を設定するようにしてみました。
2.0.1 の ChangeLog では直ったようなことが書いてあったので油断していたのですが、
Release 2.0.1 (2011-08-02 by jmr):
http://svn.macports.org/repository/macports/branches/release_2_0/base/ChangeLog
- Fixed errors when installing some archives built on a case-sensitive
filesystem onto a case-insensitive one. (#30373, jmr in r81562)
見事に踏んでしまいました。