2011年08月18日
Androidのツールチェインをソースからビルドする
NDKに含まれているgccなどのツールチェインをソースからリビルドする方法を調べました。
NDKをインストールしたディレクトリの docs/DEVELOPMENT.html にツールチェインをソースからリビルドする方法が書いてあります。
便利なスクリプトが用意されているので、以下の手順でbinutils, gcc, gdbなどNDKについているツールチェイン全てがリビルドされます。
以下はx86_64 Ubuntu 10.04 で行っています。
ソースのダウンロード
$ mkdir workdir $ cd workdir $ git clone git://android.git.kernel.org/platform/ndk.git ndk $ git clone git://android.git.kernel.org/platform/development.git development $ export NDK=$PWD/ndk $ echo $NDK $ $NDK/build/tools/build-platforms.sh $ $NDK/build/tools/download-toolchain-sources.sh --package $ ls /tmp/ndk-koba/android-ndk-toolchain-20110223.tar.bz2
ビルド
$ time $NDK/build/tools/rebuild-all-prebuilt.sh --toolchain-src-pkg=/tmp/ndk-koba/android-ndk-toolchain-20110223.tar.bz2 Checking whether the compiler generates 32-bit binaries...no To follow build in another terminal, please use: tail -F /tmp/ndk-koba/build/log.txt Building host ndk-stack tool from sources. Packaging ndk-stack binary (ndk-stack-linux-x86.tar.bz2) ... Creating sysroot: /tmp/ndk-koba/build/platforms/android-9/arch-arm Copying android-3 platform files Copying android-4 platform files Copying android-5 platform files Copying android-8 platform files Copying android-9 platform files Building arm-linux-androideabi-4.4.3 toolchain... (this can be long) Packaging arm-linux-androideabi-4.4.3 toolchain (arm-linux-androideabi-4.4.3-linux-x86.tar.bz2) ... Build arm-linux-androideabi-4.4.3 gdbserver... Checking whether the compiler generates 32-bit binaries...no Configure: arm-linux-androideabi-4.4.3 gdbserver-6.6 build. Building : arm-linux-androideabi-4.4.3 gdbserver. Install : arm-linux-androideabi-4.4.3 gdbserver. Done. Packaging arm-linux-androideabi-4.4.3 gdbserver (arm-linux-androideabi-4.4.3-gdbserver.tar.bz2) ... Packaging GNU libsupc++ armeabi libs (gnu-libsupc++-armeabi.tar.bz2) ... Packaging GNU libsupc++ armeabi-v7a libs (gnu-libsupc++-armeabi-v7a.tar.bz2) ... Packaging GNU libstdc++ headers (gnu-libstdc++-headers.tar.bz2) ... Packaging GNU libstdc++ armeabi libs (gnu-libstdc++-libs-armeabi.tar.bz2) ... Packaging GNU libstdc++ armeabi-v7a libs (gnu-libstdc++-libs-armeabi-v7a.tar.bz2) ... Building STLport binaries Copying android-3 platform files Copying android-4 platform files Copying android-5 platform files Copying android-8 platform files Copying android-9 platform files Packaging: /tmp/ndk-koba/prebuilt-20110818/stlport-libs-armeabi.tar.bz2 Packaging: /tmp/ndk-koba/prebuilt-20110818/stlport-libs-armeabi-v7a.tar.bz2 Done! See /tmp/ndk-koba/prebuilt-20110818 real 5m20.301s user 20m2.590s sys 2m26.440s
ビルドの途中経過は他のターミナルから以下のコマンドで見ることができます。
$ tail -F /tmp/ndk-koba/build/log.txt
これで、binutils, gcc, gdbなどNDKについているツールチェイン全てがリビルドされます。
それらのアーカイブは/tmp/ndk-koba/prebuilt-20110818/ にできました。
ファイルのダウンロードやビルドは全て /tmp/ndk-$USER で行われるので /tmp の容量には余裕が必要です。
$ ls /tmp/ndk-koba/prebuilt-20110818/ arm-linux-androideabi-4.4.3-gdbserver.tar.bz2 arm-linux-androideabi-4.4.3-linux-x86.tar.bz2 gnu-libstdc++-headers.tar.bz2 gnu-libstdc++-libs-armeabi.tar.bz2 gnu-libstdc++-libs-armeabi-v7a.tar.bz2 gnu-libsupc++-armeabi.tar.bz2 gnu-libsupc++-armeabi-v7a.tar.bz2 ndk-stack-linux-x86.tar.bz2 stlport-libs-armeabi.tar.bz2 stlport-libs-armeabi-v7a.tar.bz2
わたしの環境ではダウンロードに5分、ビルドに5分くらいでできました。
Windows用のツールチェインのビルド
ここからさらにさきほどのスクリプトに--mingw をつけて実行するとWindows用のツールチェインをクロスビルドすることができます。
$ time $NDK/rebuild-all-prebuilt.sh --mingw --toolchain-src-pkg=/tmp/ndk-koba/android-ndk-toolchain-20110223.tar.bz2 Checking whether the compiler generates 32-bit binaries...no To follow build in another terminal, please use: tail -F /tmp/ndk-koba/build/log.txt Building host ndk-stack tool from sources. Packaging ndk-stack binary (ndk-stack-windows.tar.bz2) ... Creating sysroot: /tmp/ndk-koba/build/platforms/android-9/arch-arm Copying android-3 platform files Copying android-4 platform files Copying android-5 platform files Copying android-8 platform files Copying android-9 platform files Building arm-linux-androideabi-4.4.3 toolchain... (this can be long) Packaging arm-linux-androideabi-4.4.3 toolchain (arm-linux-androideabi-4.4.3-windows.tar.bz2) ... Skipping gdbserver build (--mingw option being used). Skipping STLport binaries build (--mingw option being used) Done! See /tmp/ndk-koba/prebuilt-20110818 real 12m14.069s user 30m31.210s sys 4m19.210s
Windows用の実行バイナリだけがビルドされて、実機用のライブラリやgdbserverはさきほどビルドしたものをそのまま使います。
$ ls -lt /tmp/ndk-koba/prebuilt-20110818/ total 34096 -rw-r--r-- 1 koba koba 13761198 Aug 18 14:07 arm-linux-androideabi-4.4.3-windows.tar.bz2 -rw-r--r-- 1 koba koba 66403 Aug 18 13:55 ndk-stack-windows.tar.bz2 -rw-r--r-- 1 koba koba 268388 Aug 18 11:17 stlport-libs-armeabi-v7a.tar.bz2 -rw-r--r-- 1 koba koba 269436 Aug 18 11:17 stlport-libs-armeabi.tar.bz2 -rw-r--r-- 1 koba koba 1384707 Aug 18 11:16 gnu-libstdc++-libs-armeabi-v7a.tar.bz2 -rw-r--r-- 1 koba koba 1379276 Aug 18 11:16 gnu-libstdc++-libs-armeabi.tar.bz2 -rw-r--r-- 1 koba koba 579342 Aug 18 11:16 gnu-libstdc++-headers.tar.bz2 -rw-r--r-- 1 koba koba 275056 Aug 18 11:16 gnu-libsupc++-armeabi-v7a.tar.bz2 -rw-r--r-- 1 koba koba 276337 Aug 18 11:16 gnu-libsupc++-armeabi.tar.bz2 -rw-r--r-- 1 koba koba 78231 Aug 18 11:16 arm-linux-androideabi-4.4.3-gdbserver.tar.bz2 -rw-r--r-- 1 koba koba 16508083 Aug 18 11:16 arm-linux-androideabi-4.4.3-linux-x86.tar.bz2 -rw-r--r-- 1 koba koba 37949 Aug 18 11:11 ndk-stack-linux-x86.tar.bz2