emergeのsets一覧

先日 `emerge -uDN @world` しようとして失敗したとき、

```console
# emerge -uDNp @sorl
emerge: There are no sets to satisfy 'sorl'. The following sets exist:

    changed-deps
    downgrade
    installed
    live-rebuild
    module-rebuild
    preserved-rebuild
    profile
    rebuilt-binaries
    security
    selected
    selected-packages
    selected-sets
    system
    unavailable
    unavailable-binaries
    world
    x11-module-rebuild

```
と出てきて「え？意外と多いぞ@のつくset！？」と思ったので一通り調べてみることに。
かつて[naota大先生がまとめてくれている](http://d.hatena.ne.jp/meech/20111212/1323702120)ものはそれから、それ以外は調べ直し。

# changed-deps

その名の通り、依存関係の変更にトリガする。

https://wiki.gentoo.org/wiki/Project:Portage/Changed_Deps
> The emerge --changed-deps option can be used as a means to propagate changes in the dependencies of installed packages, by triggering rebuilds of installed packages for which changed dependencies are detected. Refer to the emerge man page for more information about this option.

依存関係の変更を検知するための代物だが、`--changed-deps` オプションと関わりがあるのだろうか？使用例が思いつかないため少し調べてみたい。

# downgrade

これも名前の通り、ダウングレードするであろうパッケージにトリガする。

http://d.hatena.ne.jp/meech/20111212/1323702120
>いま「インストールしているバージョン」が「見えているバージョン」よりも新しいものが指定されます。
>
>つまり…
>
> - 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してくれます

リストアップされた際に D が付与されているものに当たると思われる。

# installed

その名の通り、インストールされているすべてのパッケージにトリガする。
`@world` は導入したものだけ、 `--deep @world` だとそれに依存する全てとなるが、実際 `@world`ではヒットしないパッケージも全て `@installed` になる。

http://d.hatena.ne.jp/meech/20111212/1323702120
> 具体的には @installed には、「インストールされている全てのパッケージ」が登録されているので "emerge -1 @installed"とすると全てのパッケージをリビルドするので冬にはおすすめです。

パッケージ内容を変えないので、`emerge --oneshot @installed` と `emerge -e @world` は異なる結果になる可能性もあるという事だ。

# live-rebuild

ライブ・ビルドにのみトリガする。

…と言われても追いかけていない人にはわかりづらいと思われるが、githubなどのVCSで管理されているパッケージを追いかける。

# module-rebuild

カーネルモジュールに関連するものにのみトリガする。

http://d.hatena.ne.jp/meech/20111212/1323702120
>カーネルモジュールのパッケージです。カーネルを更新した時に、 emerge -1 @module-rebuild で新しいカーネルでカーネルモジュールをリビルドできます。

# preserved-rebuild

保存済みの、リビルドしなければならないリンク先にトリガする。

これがどういう意味かは複数バージョンあるライブラリなどを意識すればいい。古いライブラリへのリンクが残っている場合、`preserve-libs` というFEATURESが入っている場合はこのリンクを残すため古いライブラリが残り、リンクした状態になる。これを解消するためのもののようだ。

http://d.hatena.ne.jp/meech/20111212/1323702120
> Portage 2.2.xではFEATURES="preserve-libs"というものが入りました。これはパッケージのアップグレードやダウングレードによって、他のパッケージから使われているライブラリのsoname(ライブラリに内部的に付加されている名前、ダイナミックリンクのさいに参照されたりする)の変更があったかどうかを検出し、 sonameが変わっている場合には元のライブラリを削除せずに取っておきます。
>すると、元のライブラリにリンクしていたパッケージが、この preserved-rebuild に登録されるわけです。 emerge -1 @preserved-rebuild するとリンクが新しいものにはりかわります。

# profile

プロファイルにトリガする。
これは実行してみたほうが早い。

```shell-session
# emerge -p @profile

Performing Global Updates
(Could take a couple of minutes if you have a lot of binary packages.)
  .='update pass'  *='binary update'  #='/var/db update'  @='/var/db move'
  s='/var/db SLOT move'  %='binary move'  S='binary SLOT move'
  p='update /etc/portage/package.*'
/usr/portage/profiles/updates/1Q-2018.........
```
と、プロファイルそのもののみを確認したり更新したりするのに使う。（上の例では何も変わってない）

# rebuilt-binaries

作り直さなければならない、バイナリパッケージにトリガする。
この判定基準は、naota大先生曰くビルド時刻のようだ。

http://d.hatena.ne.jp/meech/20111212/1323702120
> 現在インストールされているものとビルド時刻の違うバイナリパッケージになります。これは例えば、バイナリでなにかインストールした後にバイナリ提供側がバイナリを作りなおした時などにあてはまるかと思います。

バイナリパッケージを使ってない人には無用の長物だが、利用者はそのバイナリが確かに自分の意図したものかをチェックするのに重宝しそう。

# security

GLSAにひっかかるものにトリガする。
セキュリティリスクがあるものだけ更新する時に使うようだ。

http://d.hatena.ne.jp/meech/20111212/1323702120
> GLSA(Gentoo Linux Security Advisory)のうち対処されていないセキュリティ上の問題があるパッケージについてリビルドを行ないます。

# selected

既に入っていたものを除外した、明示的にインストールしたもののみにトリガする。

http://d.hatena.ne.jp/meech/20111212/1323702120
> ユーザが明示的にインストールことを選択したパッケージです。
>…さて、さっきから "emerge -1" と -1 をつけていますが、この意味はおわかりでしょうか。 emergeすると基本的にそのパッケージが /var/lib/portage/world に登録されます。名前から推察できるとおり、ここの内容を元に emerge -uDN world でビルドされるパッケージがきまります。すなわち、 /var/lib/portage/world に登録されているパッケージと、その依存をたどって更新分をビルドしていくわけですね。こうしておくことで、昔は依存していたけれど、いまはいらなくなってしまったライブラリのパッケージなんかを --depcleanで削除できるようになっています。 せっかくGentooなのですから、このworldはなるべく小さくしておいて小さい環境を作りたいものですね。ということで、 -1 (--oneshot)をつけて、worldに登録しないようにしている、というわけです。

https://wiki.gentoo.org/wiki/Selected_set_(Portage)
> The selected set contains the packages the user has explicitly installed. The selected set, together with the system set, make up the world set. With a couple of exceptions, Portage will register select set package atoms to the /var/lib/portage/world file.

# selected-packages

`/var/lib/portage/world` で保存されたうち、ユーザが選択したものにトリガする。

https://dev.gentoo.org/~zmedico/portage/doc/man/emerge.1.html
>　selected-packages contains the user-selected "world" packages that are listed in /var/lib/portage/world, while selected-sets contains the nested sets that may be listed in /var/lib/portage/world_sets. 

# selected-sets

selected-packagesの引用文を読んでもらえればわかるが、`/var/lib/portage/world` 以外にも `/var/lib/portage/world_sets` が存在する。
これはこちらにトリガする。

# system

システムにトリガする。
これはわかると思うので省略。

http://d.hatena.ne.jp/meech/20111212/1323702120
> アーキテクチャ/システムごとの基本パッケージ集です。 bashとかportgeとかそこらへんになります。

# unavailable

パッケージとして導入されているが、ebuildが存在しなくなったものにトリガする。

http://d.hatena.ne.jp/meech/20111212/1323702120
> ebuildがなくなってしまった(同じカテゴリ・パッケージ名・スロットで)パッケージです。

# unavailable-binaries

バイナリパッケージの場合はこちらにトリガする。

http://d.hatena.ne.jp/meech/20111212/1323702120
> インストールされているパッケージで、対応するバイナリパッケージが存在していないものです。

# world

worldにトリガする。~~ワールドトリガー~~
毎日使ってると思うが、これは`@selected` と `@system` の両方を含む。つまり、`/var/lib/portage/world` などという名前だがここには `system` が含まれないので、実は `@world` とは等価ではないのだ。おのれゴルゴム。


# x11-module-rebuild

X11に関わるモジュールにトリガする。`@module-rebuild` のX11版。

http://d.hatena.ne.jp/meech/20111212/1323702120
> Xのモジュールパッケージです。Xのメジャーバージョンが上がってABIバージョンが変わると、モジュールを読めなくなるので emerge -1 @x11-module-rebuild でリビルドしちゃいます。


とまあ、調べると色々出てくる。意外と小回りがきくものだなぁと関心しきりである。