ひさしぶりにNDKいじり

| No Comments | No TrackBacks

そもそもここに書くのが1年ぶりくらいのようだけど、コードを書くことが少なくなったというより、パブリックに書いたコードを直接出すことが多かったのだろうと思っている。そんなわけで今回は裏の...というわけではないけど、こっちで書いていたことの焼き直しのようなネタを書く。

そんなわけでひさしぶりにAndroid NDKだ。

直近でいじったのをみると、NDK r6がどうのと書いているようだ。現在はr8dまで出ている。Androidの状況もだいぶ変わった。armeabiの他に名ばかりのx86サポートがあった時代ではなくなり、エミュレーターなどで本格的にx86が使われるようになり、mipsもサポートされるようになった。NDK r8cからはツールチェインのパスも統一的になって、より簡単にスタンドアロンで利用できるようになった。ツールチェインのセットも、gcc(4.4.3/4.6/4.7)のほかにclangまで使えるようになった。NDK以外にも目を向けると、AOSPにはgold linkerやmclinkerといったllvmベースのリンカーまで含まれている。

以前にビルドしてみたlibiconvは、次のように configure - make - ld で簡単にビルドできるようになった(ついでにstdlibまわりのiconv特有の問題も解決してある):

export ANDROID_ROOT=~/android-ndk-r8d
export BUILD_OS=linux-x86
export ANDROID_VER=14 # 3 4 5 8 9 14
export ARCH=x86 # arm-linux-androideabi or mipsel-linux or x86
export ARCH2=i686 # arm or mipsel or i686
export TOOLFAMILY=4.7 # 4.4.3 or 4.6 or 4.7 or clang-3.1
export SYSROOT=$ANDROID_ROOT/platforms/android-$ANDROID_VER/arch-$ARCH
export CC="$ANDROID_ROOT/toolchains/$ARCH-$TOOLFAMILY/prebuilt/$BUILD_OS/bin/$ARCH2-linux-android-gcc --sysroot=$SYSROOT"
export TARGET_LIBRARY=libiconv

gl_cv_header_working_stdint_h=yes ./configure --host=x86 CPPFLAGS="-fpic -O3" CFLAGS="-fpic -O3"

make

$CC -nostdlib -shared -s -o $TARGET_LIBRARY.so -Wl,-whole-archive ./lib/.libs/$TARGET_LIBRARY.a

この例ではまだbuild-standalone-toolchain.sh を使用していないが、あれを利用すればRTTIなども使えるようになるはずだ。

ツールチェインが新しくなるのであれば、以前に作成したビルド支援ツールもかたちを変えないといけない。実のところ、以前のツールではメンテナンスが面倒になるし、NDKを利用したビルドは実際には成功するまで何度も試行することになったのにも関わらず、既に完成品のパッケージがあることを前提としすぎるきらいがあった。ビルドできるtar.gzが豊富にあるつもりだったので、むしろ依存関係の解決などに意識が向いていたけど、実際にはビルドスクリプトを試行錯誤することになった。そのような経験をふまえて、今回はローカルビルドを中心にできるようにしたい。ビルドできるモジュールの記述は、ビルドツールの一部として含めることができるだろう。

今考えているのは、大まかなディレクトリ構成だ:

  • ビルドは「生け垣」単位で管理される。
  • 1つの生け垣には、プラットフォーム別のブランチが含まれる(ここはarmeabiしか念頭になかった以前のツールとは異なる)
  • それぞれのブランチでは、SYSROOTのようにbinやらincludeやらlibやらをもつ。依存関係のインクルードなどは、それらを利用して解決する。

ビルドされたバイナリは、別途どこかで公開しても良いだろうし、無くてもビルドスクリプトさえあれば困らないだろう。

以前の経験から、主な成果が、ビルドツールではなく、個別のプロジェクトのビルドセットアップ・スクリプトにあることが分かったので、今回はそっちを貯めこむかたちで実現できればと思う。

No TrackBacks

TrackBack URL: http://veritas-vos-liberabit.com/noteon/mt-tb.cgi/170

Leave a comment