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 フラグで調節するとするとうまくいくみたい。