重いMacPortsを軽くする

MacPortsはOS標準のライブラリに頼らず独自にソフトをインストールしようとする傾向にあります。そのためちょっとしたアプリケーションを入れようとしただけで、依存関係にあるソフトを芋づる式にインストールし始めて、思わぬ時間がかかることがあります。最近のマシンはハードディスク容量が潤沢で処理速度が高速だといっても、ディスクが無駄に使われたり延々待たされると困ります。最近人気のHomebrewはOS標準のライブラリを出来るだけ利用して重複するソフトをインストールしない方針になっています。そのためソフトのインストールが軽いというのが人気の一因になっているようです。

しかしながら、MacPortsで独自ライブラリを使っているのには歴史的な背景があります。最近のMac OSであれば比較的新しいバージョンのオープンソースソフトウェアが色々と組み込まれていますが、以前のOSではそうしたソフトウェアがない場合、あっても必要な設定になっていない場合や最新版でないこともありました。そこで古いOSをサポートするためにも独自ライブラリを構築する方針になっています。とはいっても、日々更新されているportは最近のOSでしか動作確認されていないことが多いでしょうから、実際には古いOSでは支障をきたすこともありますが。

ところで、あるportと依存関係にあるすべてのportをリスト表示する機能がMacPortsにあります。portをインストールする前にあらかじめ依存関係を把握しておけば、いざインストールを始めてみて驚くことがなくなるかもしれません。

port rdeps <portname>

graphvizを使ってport間の依存関係を可視化するTclスクリプトport-depgraphも公開されています。試しに、このport-defgraphを、次のシェルスクリプトdepと同じディレクトリにおくことにします:

#!/bin/sh
./port-depgraph $@ | dot -Tpng -o $1.png; open $1.png

ちなみに例えばgraphvizのportの場合、port rdepsを使うと81個のportと依存関係にあることが分かります。+no_x11を指定すると、依存するportが50個まで減ります。上のシェルスクリプトdepを次のように実行すると、その依存関係のグラフが表示されます:

./dep graphviz +no_x11

MacPortsでソフトをインストールするときの重さは、Portfileの記述を変えることで解消できることがあります。Jumanのportを例に説明します。Jumanのportは、universalビルドに対応するためにautoreconfを使ってconfigureファイルを更新していましたが、autoreconfがPerlなどの大きなソフトに依存していたため、まっさらの状態からインストールすると必要以上に時間がかかっていました。しかし、universalでない通常のビルドの場合、configureを修正する必要がないため、universalビルドでない場合はautoreconfを使わないようにPortfileを変更しました:

if {[variant_isset universal]} {
    use_autoreconf  yes
}

通常のビルドの場合、Jumanに依存関係はありませんが、universalビルドの場合は次のような依存関係をもちます:

そもそもautoreconfにこれだけの依存関係が必要なのか分かりませんね。少なくともOSのバージョンに応じて依存するportの指定を切り替えることができるので、過剰な依存portの指定をなくすように個々のPortfileを変えていければ、重いという印象がかなり変わるのはでないかと思います。

依存するportをインストールするかどうかを決める設定方法はいくつかあります。通常は、依存するportがすでにインストールされているかどうかが条件になりますが、OS標準のシステムパスやMacPorts内に特定のバイナリやライブラリが存在するかどうかを条件に設定することもできます。以下はGuideから抜粋した例です:

depends_lib         port:rrdtool
depends_lib         lib:libX11.6:xorg
depends_build       bin:glibtool:lib tool
depends_run         path:lib/libltdl.a:libtool

1行目の例は、rrdtoolのportがインストールされていない場合に常にそれがインストールされます。2行目は、システムパスの例えば/usr/X11R6/lib/libX11.6.*やMacPorts内にこのライブラリが存在しない場合にはじめてxorgのportがインストールされることになります。3行目はバイナリ、4行目は任意のファイルが指定されています。依存関係の指定を少し工夫することで、不要な処理をなくすことができると思います。