REQUIRED_USE

こんな emerge エラーを見たことはあるだろうか

Calculating dependencies \

!!! Problem resolving dependencies for sys-kernel/dracut
... done!

!!! The ebuild selected to satisfy "dracut" has unmet requirements.
- sys-kernel/dracut-024-r2::gentoo USE="(multilib) -debug -device-mapper -net -optimization (-selinux)" DRACUT_MODULES="btrfs lvm ssh-client syslogame -bootchart -caps -cifs -crypt -crypt-gpg -crypt-loop -dmraid -dmsquash-live -gensplash -iscsi -livenet -mdraid -multipath -nbd -nfs -plymouth -

  The following REQUIRED_USE flag constraints are unsatisfied:
    dracut_modules_lvm? ( device-mapper ) dracut_modules_ssh-client? ( net )

  The above constraints are a subset of the following complete expression:
    dracut_modules_crypt-gpg? ( dracut_modules_crypt ) dracut_modules_crypt-loop? ( dracut_modules_crypt ) dracut_modules_livenet? ( dracut_moduleslive ) dracut_modules_crypt? ( device-mapper ) dracut_modules_dmraid? ( device-mapper ) dracut_modules_dmsquash-live? ( device-mapper ) dracut_modut? ( device-mapper ) dracut_modules_lvm? ( device-mapper ) dracut_modules_cifs? ( net ) dracut_modules_iscsi? ( net ) dracut_modules_livenet? ( netmodules_nbd? ( net ) dracut_modules_nfs? ( net ) dracut_modules_ssh-client? ( net )

これには EAPI=4 から使える REQUIRED_USE というものが関係している。

けど、とりあえずどーすれば emerge できるんよ? という話から

注目するのは真ん中の

  The following REQUIRED_USE flag constraints are unsatisfied:
    dracut_modules_lvm? ( device-mapper ) dracut_modules_ssh-client? ( net )

読み方は

  • USE=dracut_modules_lvm がある時は USE=device-mapper も必要だよ。(でも、指定されてないよ)
  • USE=dracut_modules_ssh_client がある時は USE=net も必要だよ。(でも、指定されてないよ)

なので、 USE=device-mapperと USE=netを有効にしてあげるといい。 flaggie でやるならこんな感じ。

# flaggie dracut +device-mapper +net

そして、本題の REQUIRED_USE について

dracutには一番下に書いてあるように

    dracut_modules_crypt-gpg? ( dracut_modules_crypt ) dracut_modules_crypt-loop? ( dracut_modules_crypt ) dracut_modules_livenet? ( dracut_moduleslive ) dracut_modules_crypt? ( device-mapper ) dracut_modules_dmraid? ( device-mapper ) dracut_modules_dmsquash-live? ( device-mapper ) dracut_modut? ( device-mapper ) dracut_modules_lvm? ( device-mapper ) dracut_modules_cifs? ( net ) dracut_modules_iscsi? ( net ) dracut_modules_livenet? ( netmodules_nbd? ( net ) dracut_modules_nfs? ( net ) dracut_modules_ssh-client? ( net )

といった REQUIRED_USE が指定されている。 REQUIRED_USE はようするに、USE関係間の依存関係をしめすもの。

上の例だと全て、 "foo? ( bar )" の形をしていて 「USE=fooなら、 USE=barも必ず必要」という形式になっているが、他にも使えるフォーマットはある。

  • "foo? ( !bar )"
    • USE=foo なら、 USE=barはあってはならない
  • "foo? ( || ( bar baz quux ) )"
    • USE=foo なら bar,baz,quuxの少なくとも一つは有効になっていないといけない
  • "^^ ( foo bar baz )"
    • foo, bar, bazのどれが一つは有効になっていないといけない。 なおかつ、二つ以上有効にすることはできない
  • "|| ( foo bar baz )"
    • 上の 「USE=fooなら」がない版。 foo, bar, bazの少なくとも一つは有効になっていないといけない

さらに EAPI=5 からは "?? ( foo bar baz )" として、foo, bar, bazの中でどれか一つだけが有効・もしくは全て無効にならなければいけない、といった指定ができるようになっている。

結局のところ、ebuildがこれらを使って指定している中で、満たされていないものを Portageが真ん中のところに表示してくれていた、というわけ。

この指定を覚えておいて、適宜USEフラグをいじっていけばよい。