iPhoneの発売日が近づいて参りましたが……取り扱い店舗も定かでないこの状況、ストレスを感じますね。我々メディア側の人間とて同じこと、特別扱いされるわけではありませんから。準備万端にはほど遠い現状ですが、なんとかやり繰りして最新情報をお伝えしていきたいと思いますので、時折チェックのほどお願いします。

さて、今回は「lipo」について。次のSnow LeopardではHDD上のムダが取り除かれる、というまことしやかな噂もあるなか、多くのユーザが認識しつつも放置してきたユニバーサルバイナリに、lipoという刀で斬り込んでみたい。

「雪豹」はネコ……ではなくエコなOS ?

Intel Macの登場とともに存在がクローズアップされた「ユニバーサルバイナリ」。実のところ新規の技術ではなく、NeXTSTEPのときバイナリフォーマット (Mach-O) の拡張に伴い用意された機構であることは、当コラムでたびたび説明している。Intel / PowerPC両プラットフォームが並立する現在、どちらでもネイティブ動作するユニバーサルバイナリの存在は不可欠だ。いずれは (ほぼ) すべてのユーザがIntelプラットフォームに移行するのだろうが、そのときには開発者側がそのようなバイナリを用意すればいいだけのことで、ユーザ側で特別な準備を必要としないところがこのしくみの優れた点といえる。

アプリケーションの圧縮機能は、こんな感じで実装される……か? (画面はNeXTSTEP 3.3J)

しかし、その"自然淘汰"への期待は揺らいでいる。これまでは、正比例的な大容量化 / 価格低下を続けるHDDを主記録装置として採用してきたため、ファイルサイズがかさみがちなユニバーサルバイナリへの抵抗は少なかったが、SSD (Solid State Drive) を採用したMacBook Airの登場により、ディスクスペースが貴重なものとなった。原油価格高騰に悩む実世界同様、OS Xにもエコが重視される時代が到来した (?) のだ。

ディスクスペース浪費の問題は、ユニバーサルバイナリにのみ責任を押しつけることはできないが、一端を担うことは確か。Leopardでは、OS標準装備のアプリケーション / コマンドは否応なくユニバーサルバイナリの形でインストールされるが、よりIntelアーキテクチャ寄り (のはず) な次のSnow Leopardでは、PowerPCバイナリを削除 / 圧縮してディスクスペースを稼ぐような機能が追加されてもおかしくはない。ちなみに、NeXTSTEPのInstaller.appにはそのような機能があったのだが……。

ユニバーサルバイナリをダイエットする

ユニバーサルバイナリから自分に必要のないアーキテクチャのバイナリを取り除くことは、Snow Leopardを待たずとも、現行のLeopardでも「lipo」コマンドを使えば処理可能だ。

lipoコマンドを利用してダイエットを決行するときには、事前に「-info」または「-detailed_info」オプションで対象ファイルの状態を調べること (用例1)。目論見通りユニバーサルバイナリであれば、そこから不要なアーキテクチャのバイナリを削除する、という段取りだ。

用例1: ユニバーサルバイナリの情報を確認する

$ lipo -detailed_info /usr/bin/vim
Fat header in: /usr/bin/vim
fat_magic 0xcafebabe
nfat_arch 2       ←収録されているバイナリ種の数
architecture i386                    ┐
    cputype CPU_TYPE_I386            │
    cpusubtype CPU_SUBTYPE_I386_ALL  ├Intel用バイナリ
    offset 4096                      │
    size 1238368   ←ファイルサイズ    │
    align 2^12 (4096)                ┘
architecture ppc7400                     ┐
    cputype CPU_TYPE_POWERPC             │
    cpusubtype CPU_SUBTYPE_POWERPC_7400  ├PowerPC用バイナリ
    offset 1245184                       │
    size 1403680      ←ファイルサイズ     │
    align 2^12 (4096)                    ┘

lipoには3種類のバイナリ削除 / 抽出用オプションがある。各オプションともアーキテクチャ名を指定するという書式は共通だが、「-remove」は取り除き、「-thin」は残し、「-extract」は抽出する、とそれぞれ働きが異なる。以下には3通りのコマンド実行例を挙げているが、Intel用バイナリを生成するという目的は共通だ。

アプリケーションのプラグインなど一部の例外を除き、いずれの方法でも (Intel Macで動作する) スリムなバイナリを生成できるが、「-thin」オプションはユニバーサルヘッダ情報まで取り除く点は留意しておこう。なお、「-remove」および「-extract」オプションよりファイルサイズは小さくなる。

用例2: ユニバーサルバイナリをスリム化する

$ lipo -remove ppc7400 -output intelbin unibin
$ lipo -thin i386 -output intelbin unibin
$ lipo -extract i386 -output intelbin unibin

このしくみが理解できれば、高等テクニックに挑んでもいいだろう。用例2では、対象のユニバーサルバイナリ (unibin) とは別のファイル名を指定していたが、これを同名にすれば上書きできるのだ。いちいちmvコマンドでリネームする必要がなくなるので、/usr/binなどのディレクトリ全体を対象にした作業も容易になる。

用例3: ユニバーサルバイナリをスリム化する

$ lipo -thin i386 -output command command

かんたんにユニバーサルバイナリをダイエットできる「TrimTheFat」

それでも自信がない、ちょっと怖いという向きにお勧めがフリーウェアの「TrimTheFat」。使い方はかんたん、ユニバーサルアプリケーションをウインドウへドラッグ&ドロップするだけで、PowerPCバイナリを取り除いたIntel専用アプリケーションが生成される。オリジナルは末尾に「-U」を付けてバックアップされるので、問題が生じたときも安心。OS Xを使い込んでいる読者諸兄ならば、わずかな作業で数百MB以上はディスクスペースを広げられるはずだ。

Real Player 11で試したところ。約17MBの削減に成功している