君は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 で新しいカーネルカーネルモジュールをリビルドできます。

ocaml-rebuild

OCamlのライブラリのパッケージです。

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に登録しないようにしている、というわけです。

system

アーキテクチャ/システムごとの基本パッケージ集です。 bashとかportgeとかそこらへんになります。

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 自体はおそらくPortagePythonのコードでなにかしらやってもとめるものなのでしょう。

おもしろいのは 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に役立ててください。