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フラグをいじっていけばよい。