きりかノート 3冊め

おあそびプログラミング

インストーラ.app + .pkg でインストールされたファイルが、どのパッケージからなのかを検索する

MacPorts でいえば port porvides [file] のように、あるファイルがどのインストールパッケージでインストールされたか知りたいことがある。/Library/Receipts/ 以下にそれぞれのパッケージがあるので、その中の .bom ファイルに lsbom をかければ、そのパッケージが提供するファイルの一覧を取得できる。

検索するてきとーなスクリプトが手元にあるのだけど、なんか Leopard になってからヒットしないものが増えたと思っていたら、.bom ファイルの場所が変わっていた。

というわけで、場当たりの対応。アタマワルソウな書きかたなのに、意外と遅くない。

 % cat =greceipts
#!/bin/sh
for receipt in `ls -1d /Library/Receipts/*.pkg`
do
bom=${receipt}/Contents/Archive.bom
if [ -r ${bom} ]; then
lsbom ${bom} | grep $@ | sed -e "s/^/`basename ${receipt}`:/g"
fi
done
# 10.5, Receipts/boms
for bom in `ls -1d /Library/Receipts/boms/*.bom`
do
if [ -r ${bom} ]; then
lsbom ${bom} | grep $@ | sed -e "s/^/`basename ${bom}`:/g"
fi
done

なんで今日気づいたかというと、RubyCocoa の SF.net のバグトラッカーにきてたビルドエラーの件を調べる際に、libxml2 のヘッダがインストールされるのはどのパッケージか知りたかったから。

 % greceipts -l include/libxml2
MacOSX10.4.Universal.pkg:(standard input)
com.apple.pkg.DevSDKLeo.bom:(standard input)

なので「XcodeToolsインストールしてないんじゃない?」と答えておくことに。