This is the top-level of the new Android GNU toolchain. It is designed so that tools in the GNU toolchain and their different versions can be dropped into the Androind toolchain easily. 1. Supported platforms. The Android tool-chain supports the following hosts: a. i686-linux-gnu (32-bit x86 Linux) b. x86_64-linux-gnu (64-bit x86 Linux) c. i686-apple-darwin* (OS X 10.4 and 10.5) The Android toolchain supports the following targets: a. arm-linux-androideabi b. arm-eabi (for Android kernel) c. arm-newlib-eabi (for runnng gcc regression tests) d. i[3456]86-*-linux-gnu, x86_64-*-linux-gnu (for x86 targets) Currently we are using arm-linux-androideabi target for general Android use. This target is already in gcc upstream. arm-eabi target is only used to compile Android kernel. The arm-newlib-eabi target is mainly used to run the gcc test suite with the gnu ARM emulator. 2. Configuring the toolchain 2.1 Prerequisites You need to have version 4.4 or higher of the 'makeinfo' program that comes from the 'texinfo' package installed on your machine, even if you use --disable-docs. Otherwise the build will later fail with a 'makeinfo is missing...' style message. You can get it by simply installing the 'texinfo' package with your favorite package manager, or from its sources. 2.2 General Information The top-level configure file accepts the usual configure options supported by GNU autoconf generated configure file. In addition it supports the following options: --with-gcc-version= --with-binutils-version= --with-newlib-version= --with-gmp-version= --with-mpfr-version= --with-mpc-version= --with-gdb-version= These are used to select the desired version of a particular GNU tool package. If these options are not used during top-level configuring, appropriate default values will be used. For any --with-XXX-version=YYY, a sub-directory called XXX-YYY must be present in the source level directory. For example, --with-gcc-version=4.3.1 requires that gcc-4.3.1-android to be present and contain the source code of a buildable gcc version. To build the default arm-eabi toolchain, use the following configure options: mkdir cd /configure --target=arm-eabi \ --prefix= \ 2.3 Building a standalone toolchain. The default is building a barebone toolchain for the Android device tree. the barebone toolchain just have binutils, gcc, and gdb. There are not target C library. This is not convenient to use for application development. It is possible to build a standalone toolchain with pre-built libraries and headers. To build a standalone toolchain, we need a set of pre-compiled libraries and associated headers. There are two ways to do that. One way is to assemble a sysroot with both the library and headers. Then when configuring the toolchain add --with-sysroot=. The toolchain expects all headers and libraries to be in /usr/include and /usr/lib respectively. When using a sysroot, the toolchain remembers where to find the target headers and libraries. Note that make install will not copy the headers and libraries from sysroot. The script build-sysroot.sh can be used to assemble a simple sysroot from an Android device tree. The other way is to specify the headers and libraries with --with-headers and --with-libs separately. If you configure your tree with a prefix. The headers and libraries will be copied to the install directory specified by the prefix. After installation, we need to remove those installed headers in /lib/gcc/arm-eabi/*/include-fixed/, if the headers already exist in the android tree. The script clear-header.sh can be used to identify and remove these installed headers. 2.4 Enabling libstdc++-v3 For space saving, we do not provide libstdc++-v3 in the toolchain by default. It is possible to build libstdc++-v3. To enable it, do export CFLAGS_FOR_TARGET=-fexceptions export CXXFLAGS_FOR_TARGET=-frtti before configuring the toolchain, and add --enable-libstdc__-v3 when configuring the toolchain. The C++ library requires a working C library, so you must provide a pre-compiled copy of Bionic with either --with-sysroot or --with-headers and --with-libs. 2.5 Enabling shared run-time libraries. By default, we disable shared run-time libraries. We can also build shared version of libgcc and libstdc++ by adding --enable-shared when configuring the toolchain. Currently the shared libraries are not used in Android and we do not provide them in the system image. If you build a toolchain with shared libraries and compile applications using them, you must provide these libraries in some place where the Android dynamic linker can find it. 2.6 OSX 10.5 caveats If you build the toolchain on a system running OS X 10.5 with Xcode 3.0, the resultant binaries will not be runnable on Macs running older OS X. To enforce compatibility with 10.4, defile the environment variables CC and LDFLAGS as follows: CC="gcc -isystem /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.4" LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk" export CC LDFLAGS If your 10.4 SDK is not installed at /Developer/SDKs/MacOSX10.4u.sdk, please adjust the values of CC and LDFLAGS appropriately. The top-level configure script currently does not support passing CC and LDFLAGS as configure options yet so they need to be passed as exported shell variables. 3. Building and Installing the toolchain After configuring the toolchain, simply use "make". The top-level Makefile in an object directory supports these targets: make build (default) make install make clean "make install" installs the toolchain in the location specified by --prefix configure option. The installation location can also be overridden by "make prefix= install". 4 Running the compiler testsuite It is possible to run the dejagnu compiler testsuite. To do that, you need a working C library. This can be done easily by preparing a sysroot and configuring the toolchain like: configure --with-sysroot= .. After configuring the toolchain, build it as normal. Before running the test, you need to have an adb connected device available. This can be either an emulator or an actual device. Make sure that adb is in the path of the shell running testsuite and there is a device. You can check all connected devices using "adb devices". Then go to the gcc object directory and run the tests: cd gcc-/gcc EXPORT DEJAGNU=/build/dejagnu/android-dejagnu.exp make check You may want to run a small subset of the testsuite first to verify your set-up. For example, you can just run the IEEE tests in the gcc testsuite by: make check-gcc RUNTESTFLAGS="ieee.exp" If you have more than one device connected to adb, you can use the environment variable ADB_SERIAL to specify a device. For example: make check ADB_SERIAL=HT832GZ12345 # a real phone make check ADB_SERIAL=emulator-5554 # an emulator If ADB_SERIAL is not empty, all adb commands use -s to select the appropriate device. Sometimes, you may run into a problem with a read-only file system. When that happens, try "adb remount". If that fails also, try "adb root" first and then "adb remount". Currently, the C++ testsuite is not fully supported. Android by default does not support exceptions and RTTI and has a very limited C++ run-time library. So we do not expect passing even a significant portion of C++ testsuite. The C testsuite should work fine with Bionic.