2012/09/25

jdkのヘッダにパスが通ってなくてemergeが失敗した話。

media-video/aacskeys のビルドに失敗した。
原因はわかっていた。

src/aacskeys.h:8:17: 致命的エラー: jni.h: そのようなファイルやディレクトリはありません

調べたところ、jniとはJava Native Interfaceの略らしい。ということはjdk関連である。
さて、jdkのヘッダが無いとのことだが、ヘッダは確かに存在しており、
$JDK_HOME/include
にある($JDK_HOMEはユーザごとに異なる。rootではシステム全体の設定になっている)。
さて、これがmake時のINCLUDESとかgccの-Iオプションとかに入れられれば良いのだが、一筋縄にはいきそうにない。

今回は、gccが自動で読みにいく環境変数をいじる。
まず、システムのデフォルトのJava VMをJDKに変更する。(デフォルトの環境変数の設定を変更するため。後述)
# java-config -L でリストが出るので、左の番号を覚えておいて、たとえば

1) IcedTea JDK 7.2.2.1 [icedtea-7] 2) Sun JDK 1.6.0.33 [sun-jdk-1.6] *) Sun JRE 1.6.0.33 [sun-jre-bin-1.6]
となっているなら、2番のVMにしたいので # java-config -S 2 というふうにする。

で、gccがヘッダファイルを探しにいくパスは、Cなら C_INCLUDE_PATH 、C++なら CPLUS_INCLUDE_PATH である。
この両方にJDKのヘッダを追加したいが、あまり関係のないパッケージまで影響が及ぶようなところを弄りたくない。
そこで、portageには目的のパッケージのmergeのときだけ環境変数を変えられるような仕組みがあるので、それを利用する。

まず、 /etc/portage/package.env (無ければ作る)に

/etc/portage/package.env
media-video/aacskeys use-jdk-jni-headers

の1行を追加する。んで、 /etc/portage/env/use-jdk-jni-headers (新規ファイル)は

/etc/portage/env/use-jdk-jni-headers
C_INCLUDE_PATH="${JDK_HOME}/include:${JDK_HOME}/include/linux" CPLUS_INCLUDE_PATH="${JDK_HOME}/include:${JDK_HOME}/include/linux"

といった内容にする。
ここで、システムのVMがJDKでないとき(jreとか)は ${JDK_HOME}/include が存在しないので、パスの指定の意味がなくなってしまうことに注意。

これでmergeしなおすと、この場合なら media-video/aacskeys のビルドのときだけ jni.h がデフォルトで探索されるパスに含まれる。

0 件のコメント:

コメントを投稿