ports memo

id:footnote:20080315:1205574241でgitsさんがportsについてのコメントをくださった。ありがとうございます。

まず、自分が何をしたいのかよく分っていないという点が問題なのだが、僕がしたいことは、

  • Aというマシンにインストールをしたportsに対して、同じものを依存性を考慮してBというマシンに、インストールする

ということだと思う。portsが依存性を解決してくれるので、Aで動いていると仮定すればBでも動くはずということになる。

出来れば、

  • 依存性を考えて最小限のインストールをする。(不必要なインストールをしない)
  • 依存性を考えて必要なものをすべてインストールする。

が、ほしいとこだ。

と考えてみて、gitsさんのアドバイスをみると、最初のものはインストールされたパッケージの全てのpackageをつくってしまうということだと思う。これは、魅力的な考えで、packageを自分用にインストールした形で作っておけば、次のマシンでのインストール作業はものすごく楽になるだろう。しかし、すでにインストールされてしまったportsの、すべてのpackageを作るのは、ちょっと手間な気がする。あと、gitsさんが書いてくださった通り、CPUアーキテクチャが異なるとpackageは使えない。

"pkg_info -aoq"の出力を使う方法は、間違っているかもしれないが、順番が依存性と関係なく並ぶと思うので、依存性によって、すでにインストールされているportsを何度もインストールしようと試みることになるのじゃないかと思う。すでにインストールされているよってことで、次に進んで、最後には正しく終了すると思うのだが、量が多いとちょっと無駄かなぁと思う。

pkg_sort

それで、少し調べて見たところ、ports-mgmt/portupgradeでついてくるpkg_sortが使えるんじゃないかと思った。

% pkg_info | cut -d' ' -f 1 | pkg_sort

とすると、インストールされたパッケージが、依存性にしたがって順番に並んでくれるようなので、この順番でportinstallの引数に与えればいいんじゃないかと思う。が、たぶん、これはportsツリーが同一であることが大前提。"pkg_info -o" の形式で並べてくれないかなぁと思ったが、ダメだった。

今の僕の状況を鑑みると、7.0-RELEASEをインストールして、sysinstall から packageをftpでおとしつつインストールしたのち、必要に応じて、portsツリーを更新してインストールしたりしてると、ちょっと悲しいどころではない。(portupgradeしろって話はあるが、それは別の話ということで)

pkg_tree

portsの依存関係って面白いなぁっておもって、もう少し視覚的にわかりやすいのはないかと思ったら、ports-mgmt/pkg_treeっていうのがあった。これは、インストールされているportsの依存関係をツリーにして出してくれるらしい。これはやってみようと思って、

% pkg_tree -v > /tmp/ports-tree.txt

ってやったら、ものすごいファイルが出来上がった。あまりに壮観なので、ちょっとだけ。

GraphicsMagick-1.1.10
|\__ xextproto-7.0.2
|\__ kbproto-1.0.3
|\__ inputproto-1.4.2.1
|\__ gsfonts-8.11_4
|\__ png-1.2.22
|\__ libfpx-1.2.0.12_1
|\__ lcms-1.17,1
|\__ jpeg-6b_4
|\__ tiff-3.8.2_1
|      \__ jpeg-6b_4
|\__ jbigkit-1.6
|\__ jasper-1.900.1_6
|      \__ jpeg-6b_4
|\__ pkg-config-0.22_1
|\__ xtrans-1.0.4
|      \__ pkg-config-0.22_1
|\__ xproto-7.0.10_1
|      \__ pkg-config-0.22_1
|\__ libICE-1.0.4,1
|     |\__ pkg-config-0.22_1
|     |\__ xtrans-1.0.4
|     |      \__ pkg-config-0.22_1
|      \__ xproto-7.0.10_1
|            \__ pkg-config-0.22_1
|\__ libSM-1.0.3,1
|     |\__ pkg-config-0.22_1
|     |\__ xproto-7.0.10_1
|     |      \__ pkg-config-0.22_1
|     |\__ xtrans-1.0.4
|     |      \__ pkg-config-0.22_1
|      \__ libICE-1.0.4,1
|           |\__ pkg-config-0.22_1
|           |\__ xtrans-1.0.4
|           |      \__ pkg-config-0.22_1
|            \__ xproto-7.0.10_1
|                  \__ pkg-config-0.22_1
|\__ libXdmcp-1.0.2
|     |\__ pkg-config-0.22_1
|      \__ xproto-7.0.10_1
|            \__ pkg-config-0.22_1
|\__ libXau-1.0.3_2
|     |\__ pkg-config-0.22_1
|      \__ xproto-7.0.10_1
|            \__ pkg-config-0.22_1
|\__ libX11-1.1.3,1
|     |\__ kbproto-1.0.3
|     |\__ inputproto-1.4.2.1
|     |\__ pkg-config-0.22_1
|     |\__ xtrans-1.0.4
|     |      \__ pkg-config-0.22_1
|     |\__ xproto-7.0.10_1
|     |      \__ pkg-config-0.22_1
|     |\__ libXdmcp-1.0.2
|     |     |\__ pkg-config-0.22_1
|     |      \__ xproto-7.0.10_1
|     |            \__ pkg-config-0.22_1
|      \__ libXau-1.0.3_2
|           |\__ pkg-config-0.22_1
|            \__ xproto-7.0.10_1
|                  \__ pkg-config-0.22_1
|\__ libXt-1.0.5
|     |\__ kbproto-1.0.3
|     |\__ inputproto-1.4.2.1
|     |\__ pkg-config-0.22_1
|     |\__ xproto-7.0.10_1
|     |      \__ pkg-config-0.22_1
|     |\__ libXau-1.0.3_2
|     |     |\__ pkg-config-0.22_1

以下、GraphicsMagick-1.1.10だけで、延々と続く。。。たぶん、インストールされているパッケージすべてにたいして、この様なツリーを書いてくれる。らしい。。。(全部チェックなんて出来ないよ!)

まとめ

何にも解決してないのだが、無理やりまとめると、

  • 誰からも依存されていないパッケージだけを知りたい!

ようするに、僕が知りたいことはこれなのだ。つまり、x11/xorg-7.3 は何か他のportsが依存しているので、インストールされている訳ではない。それは、まさしく僕が使いたいからインストールされている訳だ。他のパッケージの依存性からインストールされているパッケージはどうでもいいのだ(正しくインストールされている限りだけど)。

結局のところ僕が知りたいのは、僕が使いたいパッケージで、かつ他のパッケージからは依存性でインストールされないものだ。pkg_treeでいうと、他のpackageのツリーに現れないpackageだ。portsが依存性を正しく管理してくれているならば、それは、誰からも依存されていないpackageということになる。それを知りたい。ということが分った。これが分ってないことが問題だった。で、それを知る方法を調べようと思う。

そんなの自分で覚えておけよっていう、当然の反応があってしかるべきなのだが、だんだん使っていくと、そういうのを記憶で管理するのは難しいよねってお話でした。