条件文

ebuild ではデータベースに入る変数は動的に生成できない、という制限があるので、いろいろなところに制約が(なんかそれって Portage 側でなんとかする問題だと思うのだが、どうも「これは仕様」ということみたい)。

具体的には

if [ -n "`use cjk`" ] ; then
    DEPEND="app-i18n/nkf"
fi

というような書き方ができない、というわけで、これは正しくは

DEPEND="cjk? ( app-i18n/nkf )"

と書くことになる(これだと DEPEND をキャッシュするときcjk? を処理してくれるのでうまくキャッシュされる)。

問題は、inherit という関数を使うときで、これを使ってeclass というファイルをロードすると、上記 DEPENDのような変数を自動で設定してくれたり、便利な関数が使えるようになったりするのだが、たとえば Emacs のサポートがほしいときだけロードしようと思って

use emacs && inherit elisp

とやってもうまくいかない。理由は上に書いたのと同じで、条件文の中に DEPEND が入ってしまうのでうまくキャッシュされてくれない、というものらしい。

これは elisp.eclass の中で newdepend virtual/emacsされており、eclass の中で設定された DEPEND/RDEPEND/PDEPEND はそれぞれ E_DEPEND/E_RDEPEND/E_PDEPEND という変数に格納されるからのようだ。というわけで、解決策は

inherit elisp
E_DEPEND="emacs? ( ${E_DEPEND} )
E_RDEPEND="emacs? ( ${E_RDEPEND} )

と、いったん inherit してしまい、あとで USE フラグで調節するとするとうまくいくみたい。