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 件のコメント:
コメントを投稿