Macのソフトウェアパッケージ管理システム「MacPorts」は、OS Xの標準ソフトウェアにできるだけ依存せず動作するように設計されています。このためOSがバージョンアップしても、そのまま動作する場合が多いのですが、必ずしも常にうまく動き続けるとは限らないようです。
実際、MacPortsの公式「マイグレーションガイド」では、「MacPortsは、特定のオペレーティングシステム、特定のハードウェアアーキテクチャ動作するようにデザインされていて、OSのアップグレードや、アーキテクチャの変更が発生した場合は、問題が起こるかもしれない」と注意書きがあります。
A MacPorts installation is designed to work with a particular operating system and a particular hardware architecture. Problems may occur after major system changes
PowerPCからIntelのようなアーキテクチャの変更はそうそう起こらないから良いとして、OSのバージョンアップ(例えばMavericksからYosemite)時にも、MacPortsの再インストールが推奨されているのです。
今回はMacPortsの再インストール方法を説明したいと思います。
MacPorts再インストール手順
基本的にマイグレーションガイド記載されている通りに実行します。
Xcodeのインストール
Mac App StoreからXcodeをインストールします。コマンドラインツールもインストールしておきます。
MacPortsベースシステムのインストール
OSごとのバイナリパッケージをダウンロードして、インストールします。
次に、/opt/local/etc/macportsにある「macports.conf」などのconfファイルをアップデートします。既に「macports.conf」が存在していた場合「macports.conf.default」として新しい設定ファイルがインストールされているはずですので、手作業で必要な設定を移植しましょう。
自分が特別な設定を行っていない場合、単に新しい設定をファイルを、古い設定ファイルに上書きしても大丈夫です。
sudo cp macports.conf.default macports.conf
他のconfファイルに関しても同様です。
Portsの再インストール
インストール済みportsのリストを保存します。
port -qv installed > myports.txt
(オプション)requests ports(明示的にインストールしたports)のリストを保存します。
port echo requested | cut -d ' ' -f 1 > requested.txt
全てのportsをアンインストールします。
sudo port -f uninstall installed
クリーンします。
sudo port clean all
保存しておいたリストとインストール用スクリプトを使って、portsをインストールし直します。
curl -O https://svn.macports.org/repository/macports/contrib/restore_ports/restore_ports.tcl chmod +x restore_ports.tcl sudo ./restore_ports.tcl myports.txt
(オプション)requested statusを戻します。自分が明示的にインストールしたportsがどれか分かるようになります。
sudo port unsetrequested installed xargs sudo port setrequested < requested.txt
公式手順はこの通りですが、以前と全く同じportsを入れなおす必要がない場合、portsを削除後、手作業でportsをインストールした方が良いかもしれません(requested.txtをみながら)。
まとめ
全く同じMacPortsを入れているはずの二つのMacで、libz.aのファイル形式が異なっていることを発見し、MacPortsが古くなっていることに気が付きました。この場合個別のportsで何回入れなおしてもだめで、全体を再インストールし直すしか解決方法はありませんでした。
MacPortsの調子が悪くかつOSバージョンアップ前からMacPortsを使っている場合、再インストールするとうまく動くようになるかもしれません。