This document contains instructions on how to build the FreeType library
on Unix systems. This also works for emulations like Cygwin or MSys on
Win32:


  I. Ensure that you are using GNU Make
  -------------------------------------

    The FreeType build system  _exclusively_ works with GNU Make.  You
    will  not be  able to  compile the  library with  the instructions
    below using any other alternative (including BSD Make).

    Trying  to compile  the library  with a  different Make  tool will
    print a message like:

      Sorry, GNU make is required to build FreeType2.

    and the build  process will be aborted.  If  this happens, install
    GNU Make on your system,  and use the GNUMAKE environment variable
    to name it.



  IV. Build and install the library
  ---------------------------------

    The following  should work  on all Unix  systems where  the 'make'
    command invokes GNU Make:

      ./configure --prefix=<yourprefix>
      make
      make install           (as root)

    where "<yourprefix>"  must be replaced  by the prefix  returned by
    the "freetype-config" command.

    When using a different command to invoke GNU Make, use the GNUMAKE
    variable.  For example,  if `gmake' is the command  to use on your
    system, do something like:

       GNUMAKE=gmake ./configure --prefix=<yourprefix>
       gmake
       gmake install            (as root)

    If  this  still  doesn't   work,  something's rotten on your system(
    (e.g. you're using a very old version of GNU Make)



I. Unix systems
---------------

  If you have GNU Make installed, simply type

    ./configure
    make
    make install

  on the command line to configure, build and install FreeType on your
  system.  Note that the default installation path is "/usr/local".

  Please read the file  README.UNX, it contains _critical_ information
  regarding the installation of FreeType on many Unix systems.


II. From the command line
-------------------------

  If  you are  not using  Unix, there  are two  ways to  quickly build
  FreeType 2 from the command line.

  The first, and favorite one, is to use the "Jam" build tool.  Jam is
  a highly  portable replacement for  Make whose control files  do not
  depend on the current platform or compiler toolset.

  For more information, please see:

    http://www.freetype.org/jam/index.html

  The second one is to use "GNU Make" (and NO OTHER MAKE TOOL).


  1. Building FT2 with "Jam"
  --------------------------

    Once you've  got *our version* of  the Jam tool  installed on your
    system, simply go to the top-level FT2 directory, then type

      "jam"

    on the command line.  This will  build the library and place it in
    the "objs" directory.

    By default,  a static  library is built.   On Unix systems,  it is
    possible to  build a shared library through  the "libtool" script.
    You need to have libtool  installed on your system, then re-define
    a few environment variables before invoking Jam, as in

       export CC="libtool --mode=compile cc"
       export LINK="libtool --mode=link cc"
       jam

    In  later releases  of  FT2, building  shared  libraries with  Jam
    should become automatic on Unix systems.


  2. Building FT2 with "GNU Make"
  -------------------------------

  You need  to have  GNU Make (version  3.78.1 or newer)  installed on
  your system to compile the library from the command line.  This will
  _NOT_ work with other make tools (including BSD make)!

  [Well, this is not  really correct.  Recently, a perl implementation
  of make called `makepp' has appeared which can also build FreeType 2
  successfully on  Unix platforms.   See http://makepp.sourceforge.net
  for more details.]

  - Go to the `freetype2' directory.

  - Unix (any C compiler should work):

      - make setup (don't worry, this will invoke a configure script)
      - make
      - make install

    Alternatively,  you can  pass parameters  to the  configure script
    within the CFG variable, as in:

      - make setup CFG="--prefix=/usr"
      - make
      - make install

    If the  configure script isn't run,  try to add `unix' as a target
    on the command line, e.g.:

      - make setup unix CFG="--prefix=/opt/experimental"


  - Windows:

    We provide a  version of GNU Make for Win32  on the FreeType site.
    See http://www.freetype.org/download.html for details.

    - gcc (Mingw, _not_ CygWin):

        - make setup
        - make


    - Visual C++:

        - make setup visualc
        - make


    - other compilers:

        - make setup bcc32    -> Borland C++ 32 bits
        - make setup intelc   -> Intel C++
        - make setup watcom   -> Watcom C++
        - make setup lcc      -> Win32-LCC


  If you want  to build FreeType 2 in another  directory, you must set
  two  environment  variables,  `OJB_DIR'  and  `TOP_DIR'.  The former
  gives the directory where the object files and the library should  be
  created (this directory must exist), the latter the top directory of
  the FreeType 2 source tree.  Example:

    OBJ_DIR=~/freetype2.compiled TOP_DIR=~/freetype2 \
      make -f$TOP_DIR/Makefile setup ansi
    OBJ_DIR=~/freetype2.compiled TOP_DIR=~/freetype2 \
      make -f$TOP_DIR/Makefile

  On  Unix boxes,  calling  `configure' from  the  build directory  is
  sufficient;  it  will  build  a  small   Makefile  which  calls  the
  FreeType 2 Makefile with the necessary parameters.


--- end of INSTALL --
