| 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=<gcc version> |
| --with-binutils-version=<binutils version> |
| --with-newlib-version=<newlib version> |
| --with-gmp-version=<gmp version> |
| --with-mpfr-version=<mpfr version> |
| --with-mpc-version=<mpc version> |
| --with-gdb-version=<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 <toolchain object directory> |
| cd <toolchain object directory> |
| <source directory>/configure --target=arm-eabi \ |
| --prefix=<toolchain install directory> \ |
| |
| 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=<path to sysroot>. The toolchain expects all |
| headers and libraries to be in <sysroot>/usr/include and <sysroot>/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 |
| <prefix dir>/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 |
| <run configure> |
| |
| 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 location> 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=<your sysroot> .. <other config options> |
| |
| 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-<version>/gcc |
| EXPORT DEJAGNU=<toolchain source>/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 <serial> 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. |
| |