In order to build the library, read the `BUILD' document in the `docs'
directory.  This is only a quick starter.


I. From the command line
------------------------

  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's possible
    to build a shared library through the "libtool" script. You'll 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"
       export LINK="libtool --mode=link"
       jam
               
    In later releases of FT2, building shared libraries with Jam should
    become automatic..
    
    
  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://LNC.usc.edu/~holt/makepp
  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


  - 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
          

II. In your own environment (IDE)
---------------------------------

  You need to add  the directories "freetype2/include" to your include
  path when compiling the library.
  
  FreeType  2 is  made  of several  components;  each one  of them  is
  located   in  a  subdirectory   of  "freetype2/src".   For  example,
  `freetype2/src/truetype/' contains the TrueType font driver.
  
  DO NOT COMPILE ALL C FILES!  Rather, compile the following ones:
  
    -- base components (required)
     
      src/base/ftsystem.c
      src/base/ftinit.c
      src/base/ftdebug.c
      src/base/ftbase.c
      src/base/ftglyph.c
      src/base/ftbbox.c
      src/base/ftmm.c
     
      src/base/ftmac.c        -- only on the Macintosh

    -- other components are optional

      src/autohint/autohint.c -- auto hinting module
      src/cache/ftcache.c     -- cache sub-system (in beta)
      src/sfnt/sfnt.c         -- SFNT files support (TrueType & OpenType)
      src/cff/cff.c           -- CFF/OpenType font driver
      src/psnames/psnames.c   -- Postscript glyph names support
      src/psaux/psaux.c       -- Postscript Type 1 parsing
      src/truetype/truetype.c -- TrueType font driver
      src/type1/type1.c       -- Type 1 font driver
      src/cid/type1cid.c      -- Type 1 CID-keyed font driver
      src/winfonts/winfonts.c -- Windows FONT / FNT font driver

    Note:
     
       `truetype.c' needs `sfnt.c' and `psnames.c'
       `type1.c'    needs `psaux.c' and `psnames.c'
       `type1cid.c' needs `psaux.c' and `psnames.c'
       `cff.c'      needs `sfnt.c', `psaux.c', and `psnames.c'

       etc.

For more information, please consult "docs/BUILD" !!

--- end of INSTALL --
