君はPortageのSetを知っているのか
いきなりですが、とりあえず "emerge @" してみましょう
$ emerge @ emerge: There are no sets to satisfy ''. The following sets exist: downgrade installed live-rebuild module-rebuild ocaml-rebuild preserved-rebuild rebuilt-binaries security selected system unavailable unavailable-binaries world x11-module-rebuild
こんなんが出てくる方と出てこない方がいるかと思います。出てこない方は多分 Portage-2.1.x をお使いで2.2.xにしたらこれがでるようになるので、2.2.xを入れるか、stableなにってインストールされるのを待ってから続きを読んでくださいね。
さて、こんなものが出てきましたが、これは一体なんでしょう?
普通は emergeの後にはパッケージ名を指定するものですが、 @から始まっているとパッケージセット名と見なされます。この「パッケージセット」には複数のパッケージの集合のようなものです。
具体的には @installed には、「インストールされている全てのパッケージ」が登録されているので "emerge -1 @installed"とすると全てのパッケージをリビルドするので冬にはおすすめです。
ということで、この「パッケージセット」について一つずつ解説していきましょう。
downgrade
いま「インストールしているバージョン」が「見えているバージョン」よりも新しいものが指定されます。
つまり…
- Super Teokure 3.0がでた!さっそくPortageに入った!
- 颯爽とSuper Teokure 3.0をインストールした!
- でも、3.0に深刻なバグが見つかった!!!
- Portageでは3.0をmaskすることにした
- この時点で、新しくSuper Teokureをemergeしようとする人は3.0がmaskされたので、2.xがインストールされることになります。
この状況で emerge -1 @downgrade すると、 Super Teokure 3.0が入っているけれど、「見える」バージョンは2.xなので2.xをビルドしてdowngradeしてくれます
installed
前述の通り、インストールされている全てのパッケージです。
live-rebuild
Subversion, CVS, GitなどなどVCSからCheckoutしてくるタイプのパッケージです。 なにかおっかけやっている人は emerge -1 @live-rebuild を毎日実行すれば幸福な日々になりますね。
module-rebuild
カーネルモジュールのパッケージです。カーネルを更新した時に、 emerge -1 @module-rebuild で新しいカーネルでカーネルモジュールをリビルドできます。
preserved-rebuild
Portage 2.2.xではFEATURES="preserve-libs"というものが入りました。これはパッケージのアップグレードやダウングレードによって、他のパッケージから使われているライブラリのsoname(ライブラリに内部的に付加されている名前、ダイナミックリンクのさいに参照されたりする)の変更があったかどうかを検出し、 sonameが変わっている場合には元のライブラリを削除せずに取っておきます。
すると、元のライブラリにリンクしていたパッケージが、この preserved-rebuild に登録されるわけです。 emerge -1 @preserved-rebuild するとリンクが新しいものにはりかわります。
rebuilt-binaries
現在インストールされているものとビルド時刻の違うバイナリパッケージになります。これは例えば、バイナリでなにかインストールした後にバイナリ提供側がバイナリを作りなおした時などにあてはまるかと思います。
security
GLSA(Gentoo Linux Security Advisory)のうち対処されていないセキュリティ上の問題があるパッケージについてリビルドを行ないます。
selected
ユーザが明示的にインストールことを選択したパッケージです。
…さて、さっきから "emerge -1" と -1 をつけていますが、この意味はおわかりでしょうか。 emergeすると基本的にそのパッケージが /var/lib/portage/world に登録されます。名前から推察できるとおり、ここの内容を元に emerge -uDN world でビルドされるパッケージがきまります。すなわち、 /var/lib/portage/world に登録されているパッケージと、その依存をたどって更新分をビルドしていくわけですね。こうしておくことで、昔は依存していたけれど、いまはいらなくなってしまったライブラリのパッケージなんかを --depcleanで削除できるようになっています。 せっかくGentooなのですから、このworldはなるべく小さくしておいて小さい環境を作りたいものですね。ということで、 -1 (--oneshot)をつけて、worldに登録しないようにしている、というわけです。
unavailable
ebuildがなくなってしまった(同じカテゴリ・パッケージ名・スロットで)パッケージです。
unavailable-binaries
インストールされているパッケージで、対応するバイナリパッケージが存在していないものです。
world
これは @selected + @system になります。
x11-module-rebuild
Xのモジュールパッケージです。Xのメジャーバージョンが上がってABIバージョンが変わると、モジュールを読めなくなるので emerge -1 @x11-module-rebuild でリビルドしちゃいます。
Setの作り方
さて、以上 setを紹介してきましたが、これはどういう仕組みで動いているのでしょうか。 これは /usr/share/portage/config/sets/portage.conf で設定されています。
たとえば worldは
[world] class = portage.sets.base.DummyPackageSet packages = @selected @system
となっていて、 @selected + @system となっています。
selected は
[selected] class = portage.sets.files.WorldSelectedSet
となっていて、この portage.sets.files.WorldSelectedSet 自体はおそらくPortageがPythonのコードでなにかしらやってもとめるものなのでしょう。
おもしろいのは live-rebuild
[live-rebuild] class = portage.sets.dbapi.VariableSet variable = INHERITED includes = bzr cvs darcs git git-2 mercurial subversion tla
bzr cvsなど各種VCSのeclassをinheritしているパッケージをこのようにして指定しています。
また x11-module-rebuild などは
[x11-module-rebuild] class = portage.sets.dbapi.OwnerSet files = /usr/lib/xorg/modules exclude-files = /usr/bin/Xorg
としていて、 /usr/lib/xorg/modules 以下のファイルのオーナーであるパッケージのような指定の方法になっています。
自分でsetを作る
いつものごとくGentooは選択なので、自分でSetを定義することができます。やってみましょう。
/etc/portage/sets.confにこう書いてみます
[teokure-rebuild] class = portage.sets.dbapi.OwnerSet files = /usr/share/mikutter
emerge @teokure-rebuild してみましょう…!!!
$ emerge -pv @teokure-rebuild [ebuild R ] net-misc/mikutter-0.0.4.592 USE="libnotify test -sound" RUBY_TARGETS="ruby18 ruby19" 2,067 kB
おおー、ちゃんと動いてますねぇ!!
もしくは /etc/portage/sets/okkake に
net-misc/mikutter app-editors/emacs-vcs app-emacs/emacs-w3m
とか書いておけば
$ emerge -pv @okkake [ebuild R #] app-editors/emacs-vcs-24.0.9999-r1 USE="X alsa dbus gif gnutls gpm gtk gzip-el imagemagick jpeg libxml2 m17n-lib png sound source svg tiff toolkit-scroll-bars xft xpm -Xaw3d -athena -gconf -gsettings -gtk3 -hesiod -kerberos -motif (-selinux) -wide-int" 0 kB [0] [ebuild R ] net-misc/mikutter-9999 USE="libnotify test -sound" RUBY_TARGETS="ruby18 ruby19" 0 kB [ebuild R *] app-emacs/emacs-w3m-9999 USE="mime" LINGUAS="ja" 0 kB [1]
とまあ、こんな感じで自分の好きなパッケージだけをおっかけることが簡単にできます。
ぜひぜひ、いい感じのsetを作って日々のemergeに役立ててください。