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.

