ports memo #2
id:footnote:20080316:1205661954
こんなのシリーズ化するつもりはないのだが、新しくFreeBSDの環境整備をしていると、どうしても気になってくる。
前の結論は、誰ににも依存されていないpackageだけを探せれば、それが自分が欲しいソフトウェアなのだ!ということだった。
で、どうしたらいいか?pkg_info -Rでそのpackageに依存しているpackageを知ることができる。つまり
% pkg_info -R linux-glib2-2.6.6_1 Information for linux-glib2-2.6.6_1: Required by: linux-atk-1.9.1 linux-pango-1.10.2 linux-gtk2-2.6.10 nspluginwrapper-1.0.0 linux-flashplugin-7.0r73_1 linux-nvu-1.0 linux-scim-libs-1.4.4 ja-acroread8-8.1.2_2
とすると、linux-glib2-2.6.6_1が必要とされているpackageが出てくる。僕は、決してlinux-glib2-2.6.6_1を愛しているわけではないが、ja-acroread8-8.1.2_2を使いたいためにインストールされているということになる。そのja-acroread8-8.1.2_2は、
% pkg_info -R ja-acroread8-8.1.2_2 Information for ja-acroread8-8.1.2_2:
はたして、誰にも依存されていないが、僕自身がそれを必要としているわけだ。このja-acroread8-8.1.2_2みたいなのだけを探そうと思うわけである。もちろん、依存関係の途中にあるpackageを使うこともあるだろうが、それは依存関係でインストールされるのだから、気にしなくてもよいということになる。ま、依存関係が変更されると困るのだが。
さて、そうすると、pkg_info -Rをして3行で帰ってくるpackageだけをリストアップすればいいのね、ということで、
#!/usr/bin/perl # # open(PF, "pkg_info | cut -d' ' -f1 |") or die "Can't open pkg_info pipe."; while (<PF>) { chop; $pkg_name = $_; open(FH, "pkg_info -R $pkg_name | wc -l |") or die "Can't open pkg_info -R pipe."; while (<FH>) { chop; $num = $_; if ($num == 3) { print("$pkg_name\n"); } } }
となる。pkg_top.plとでも名づけよう。あなたのシステムのpackageのうち、誰にも依存されていないpackageのみをリストアップしてくれる、はずだ。
お〜これで、いいじゃん〜、と一瞬思ったのだが、意外となんで?ってものがある。たとえば、patch-2.5.4とか、GNU patchなのだが、僕はFreeBSD標準のpatchしか使ったことないですけど、、とか。つまり、portsからインストールするためだけに必要なpackageって意外とあるものなのだ。run dependとinstall dependは違うということですね。
考えようによっては、このリストで必要と思わないものは、アンインストールしてもいいかもしれない。ただ、そういうのは、いろんなところで使われているので、なにかportsからインストールする場合に、また入れるということを繰り返すことになるのは、ほぼ間違いない。
ちなみに、僕のShuttleでは、
% pkg_info | wc 720 4851 42649 % ./pkg_top.pl | wc 90 90 1580
720個のpackageが、90個になった。気にすべきpackageを絞り込めてるので、よしとしよう。