July 2011 Archives

Android NDK r6 changes...

| No Comments | No TrackBacks

前回書いてから休暇のような職探しのような旅に出ていて、ほとんど自由にコードをいじることができなかったのだけど、仕事もほぼ決まって少し落ち着いた。

というわけでその間にAndroid NDK r6が公開され、SDK 3.2も公開された。後者はほぼ無関係なので放置しておくとして、NDK r6の変更が割と大きく、まだビルドサーバーがきちんと動作するように更新出来ていない。breaking changeとしては、これまで armeabi だったABIの識別子が、arm-linux-androideabi のようになったことがある。これによって、使用しているgccが外部の(バージョンが異なる)ものだったりすると、この識別子を受け入れてもらえない。

とりあえず、standalone toolchainを作って、これまでと違うtoolingでビルドしようとしているのだけど、まだ様々なエラーにはまって先に進めていない。じっくり調べる時間がほしいところだけど、他に関わっているプロジェクトもあるので先はまだ見えない感じだ。

ndk + autotoolsの実験

| No Comments | No TrackBacks

年明け頃に作り出して、ずっと放置していたNDKのビルドサーバだけど、bridjでautotoolsベースのライブラリの実用にも目処が立った気がするので、掘り起こして動かしてみることにした。とはいえ、今回も掘り起こしたのを起動するにあたって、webサーバを更新したらmonoランタイムを更新させられるなど、VPSで毎回対応するには厳しいものがあり、なるべくならこのビルドサーバはnodeなどを使って書き直したいと思っている。

いずれにせよ、とりあえずは今動くものを使ってもう少しdogfoodingしようと思っている。今日は試しにlibiconvとgettextにパッチを当ててライブラリのみをビルドしてみた。(libiconv-1.13.1用パッチ, gettext-0.18.1.1用パッチ) 本当はさらにglibをビルドしたいのだけど、まだ上手くいっていない。glibそのものはAOSPに含まれているので、何かしらの修正を加えればビルド出来るはずだと思う。

未だにgccはよく分かっていないので、今日はいろいろ調べながらの試行錯誤だった。ひとつ解消したかったのは --nostdlib だ。これがあるせいで、crt0.oのリンクに失敗しないために--nostdlibが必要になり、そのせいで何かしらインクルードファイルなどが正しく取り込まれない問題が生じているような気がしている。crt0.oはmain()のローダーになるらしく、android環境用に短いgasソースで実現しているのをwebで探して発見したけど、利用条件も利用方法も不明だ。bionicにこれが含まれていないのは、gccが動かせなくなるからだろうか(gcc自身を動かすのに必要なのかもしれないという意味で)。

--nostdlibはnewlibというこれまた別の組み込み用libc実装を使う上でも使われるらしいけど、具体的な用法はよく分からない。

crt0.oが用意できてビルドの障害がひとつ取り除かれたとしても、ビルドされたバイナリは(armeabiの場合)arm環境でしか動作しないし、ビルド中はx86/64環境にいるので、ビルドされたツールは実行できないことになる。その意味では、dependencyというのは曖昧な概念だ、ということに気が付いた。たとえばgettextのツールがビルド中に必要になった場合、それはndkでビルドしたバイナリでは役に立たない(実行できないから)。この辺はAOSPを見れば切り分けが出来ているのかもしれない。

bionicはpthreadのcancelやiconv相当の機能を提供しないようなので、ビルドでハマるものは他にも数多くありそうだ。