This document contains instructions on how to cross-build the FreeType
library on Unix systems, for example, building binaries for Linux/MIPS
on  FreeBSD/i386.   Before   reading  this  document,  please  consult
INSTALL.UNIX for required tools and the basic self-building procedure.


  1. Required Tools
  -----------------

    For self-building the FreeType library  on a Unix system, GNU Make
    3.78.1 or  newer is required.  INSTALL.UNIX contains  hints how to
    check the installed `make'.

    The GNU C  compiler to cross-build the target  system is required.
    At present, using non-GNU cross compiler is not tested.  The cross
    compiler is  expected to be  installed with a system  prefix.  For
    example, if  your building system  is FreeBSD/i386 and  the target
    system is Linux/MIPS, the  cross compiler should be installed with
    the name `mips-ip22-linuxelf-gcc'.

    A C  compiler for a self-build  is required also, to  build a tool
    that  is executed  during  the building  procedure.  Non-GNU  self
    compilers are acceptable, but such a setup is not tested yet.


  2. Configuration
  ----------------

    2.1. Building and target system

      To configure for  cross-build, the options `--host=<system>' and
      `--build=<system>' must be passed to configure.  For example, if
      your building  system is FreeBSD/i386  and the target  system is
      Linux/MIPS, say

        ./configure \
          --build=i386-unknown-freebsd \
          --host=mips-ip22-linuxelf \
          [other options]

      It should  be noted that `--host=<system>'  specifies the system
      where the built binaries will  be executed, not the system where
      the build actually happens.   Older versions of GNU autoconf use
      the option  pair `--host=' and `--target='.  This  is broken and
      doesn't work.  Similarly, an explicit CC specification like

        env CC=mips-ip22-linux-gcc ./configure

      or

        env CC=/usr/local/mips-ip22-linux/bin/gcc ./configure

      doesn't   work  either;  such   a  configuration   confuses  the
      `configure' script while  trying to find the cross  and native C
      compilers.


    2.2. The prefix to install FreeType2

      Setting `--prefix=<prefix>'  properly is important.   The prefix
      to install FreeType2 is  written into the freetype-config script
      and freetype2.pc configuration file.

      If  the built  FreeType  2 library  is  used as  a  part of  the
      cross-building system,  the prefix  is expected to  be different
      from the self-building  system.  For example, configuration with
      `--prefix=/usr/local'  installs binaries  into  the system  wide
      `/usr/local'  directory  which  then  can't be  executed.   This
      causes confusion in configuration  of all applications which use
      FreeType2.   Instead,  use a  prefix to install  the cross-build
      into     a     separate     system    tree,     for     example,
      `--prefix=/usr/local/mips-ip22-linux/'.

      On the other  hand, if the built FreeType2 is used  as a part of
      the target system, the prefix to install should reflect the file
      system structure of the target system.


  3. Building command
  -------------------

    If  the  configuration  finishes successfully,  invoking  GNU make
    builds FreeType2.  Just say

      make

    or

      gmake

    depending on the name the GNU make binary actually has.


  4. Installation
  ---------------

    Saying

      make install

    as usual to install FreeType2 into the directory tree specified by
    the argument of the `--prefix' option.

    As noted in section 2.2,  FreeType2  is sometimes configured to be
    installed  into the  system directory  of the  target  system, and
    should  not be installed  in the  cross-building system.   In such
    cases, the  make variable `DESTDIR'  is useful to change  the root
    directory in the installation.  For example, after

      make DESTDIR=/mnt/target_system_root/ install

    the built FreeType2 library files are installed into the directory
    `/mnt/target_system_root/<prefix_in_configure>/lib'.


  5. TODO
  -------

    Cross building between Cygwin (or MSys) and Unix must be tested.


----------------------------------------------------------------------

Copyright 2006 by suzuki toshiya
David Turner, Robert Wilhelm, and Werner Lemberg.


This  file is  part of  the FreeType  project, and  may only  be used,
modified,  and distributed  under the  terms of  the  FreeType project
license,  LICENSE.TXT.  By  continuing to  use, modify,  or distribute
this file you  indicate that you have read  the license and understand
and accept it fully.


--- end of INSTALL.CROSS ---
