ノートマシンなどではAOSPを全部持ってくるとディスク容量が厳しいので、一部のツールやライブラリをAndroid NDKだけでビルドしたいなーと思っていました。今回少しだけ試行錯誤してみたので、その結果を記録しておきます。
external/netcat
$ git clone https://android.googlesource.com/platform/external/netcat
$ cd netcat
$ ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk APP_ABI=armeabi TARGET_PLATFORM=android-18
運が良ければ上のようにmake変数を指定すればビルドできるでしょう。
ビルドが成功すると、obj/local/armeabi/
以下にバイナリとオブジェクトファイルができます。他のアーキテクチャ用のバイナリも同様に作成できます。
external/bzip2
少しの修正でビルドできるパターン。
$ git clone https://android.googlesource.com/platform/external/bzip2
$ cd bzip2
$ ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk APP_ABI=armeabi TARGET_PLATFORM=android-18
Android.mk:46: /Users/hnw/Development/android-ndk-r9/build/core/build-host-static-library.mk: No such file or directory
make: *** No rule to make target `/Users/hnw/Development/android-ndk-r9/build/core/build-host-static-library.mk'. Stop.
$
AOSPではホスト用のバイナリも生成できますが、Android NDKではホスト環境むけのビルドはサポートしていないためにエラーが出ています(参照:cannot find 'build-host-static-library.mk' - Google グループ)。Android.mkを下記のようにコメントアウトすればターゲット用のライブラリだけをビルドできます。
# include $(BUILD_HOST_STATIC_LIBRARY)
external/strace
厄介なパターンもあります。straceを同様にビルドしようとすると失敗します。
Compile thumb : strace <= access.c
Compile thumb : strace <= affinity.c
Compile thumb : strace <= aio.c
./aio.c: In function 'sys_io_submit':
./aio.c:193:3: warning: #warning "libaio.h is not available => no io_submit decoding" [-Wcpp]
Compile thumb : strace <= bjm.c
./bjm.c:37:22: fatal error: sys/user.h: No such file or directory
compilation terminated.
make: *** [obj/local/armeabi/objs/strace/bjm.o] Error 1
sys/user.hはAndroid NDKには含まれていないためビルドを継続できません。一方でAOSPではbionic/libc/include/sys/user.hが存在するため、正しくビルドできます。
Android NDKを真面目に更新して欲しいと思うのは僕だけなんですかね…。