This document contains instructions on how to build the FreeType library
on non-Unix systems with the help of GNU Make. Note that if you're running
Cygwin or MSys in Windows, you should follow the instructions of INSTALL.UNX
instead.


  FreeType 2 includes a powerful and flexible build system that allows
  you to  easily compile it on  a great variety of  platforms from the
  command line.  To do so, just follow these simple instructions:

  a. Install GNU Make

    Because  GNU Make  is  the  only Make  tool  supported to  compile
    FreeType 2, you should install it on your machine.

    The FreeType 2 build system relies on many features special to GNU
    Make -- trying to build the  library with any other Make tool will
    *fail*.

    NEARLY ALL OTHER MAKE TOOLS WILL FAIL, INCLUDING "BSD MAKE", SO
    REALLY INSTALL A RECENT VERSION OF GNU MAKE ON YOUR SYSTEM!

    Make sure that you are invoking GNU Make from the command line, by
    typing something like:

        make -v

    to display its version number.

    VERSION 3.78.1 OR NEWER IS NEEDED!



  b. Invoke 'make'

    Go to  the root  directory of FreeType  2, then simply  invoke GNU
    Make from the command line.   This will launch the FreeType 2 host
    platform  detection routines.   A summary  will be  displayed, for
    example, on Win32:


        ==============================================================
        FreeType build system -- automatic system detection

        The following settings are used:

          platform                     win32
          compiler                     gcc
          configuration directory      ./builds/win32
          configuration rules          ./builds/win32/w32-gcc.mk

        If this does not correspond to your system or settings please
        remove the file 'config.mk' from this directory then read the
        INSTALL file for help.

        Otherwise, simply type 'make' again to build the library.
        =============================================================


    If the detected settings correspond to your platform and compiler,
    skip to step e.  Note that if your platform is completely alien to
    the build system, the detected platform will be 'ansi'.


  c. Configure the build system for a different compiler

    If the build system correctly detected your platform, but you want
    to use a different compiler  than the one specified in the summary
    (for most platforms, gcc is  the defaut compiler), invoke GNU Make
    with

         make setup <compiler>

    For example:

        to use Visual C++ on Win32, type:  "make setup visualc"
        to use Borland C++ on Win32, type  "make setup bcc32"
        to use Watcom C++ on Win32, type   "make setup watcom"
        to use Intel C++ on Win32, type    "make setup intelc"
        to use LCC-Win32 on Win32, type:   "make setup lcc"
        to use Watcom C++ on OS/2, type    "make setup watcom"
        to use VisualAge C++ on OS/2, type "make setup visualage"

    The  <compiler> name to  use is  platform-dependent.  The  list of
    available  compilers for  your  system is  available  in the  file
    `builds/<system>/detect.mk'

    If you  are satisfied  by the new  configuration summary,  skip to
    step e.

  d. Configure the build system for an unknown platform/compiler

    The auto-detection/setup  phase of the build system  copies a file
    to the current directory under the name `config.mk'.

    For    example,    on    OS/2+gcc,    it   would    simply    copy
    `builds/os2/os2-gcc.mk' to `./config.mk'.

    If for  some reason your  platform isn't correctly  detected, copy
    manually the configuration sub-makefile to `./config.mk' and go to
    step e.

    Note  that  this file  is  a  sub-Makefile  used to  specify  Make
    variables  for compiler  and linker  invocation during  the build.
    You can  easily create your own  version from one  of the existing
    configuration files,  then copy it to the  current directory under
    the name `./config.mk'.

  e. Build the library

    The auto-detection/setup  phase should have  copied a file  in the
    current  directory,  called   `./config.mk'.  This  file  contains
    definitions of various Make  variables used to invoke the compiler
    and linker during the build.

    To  launch  the build,  simply  invoke  GNU  Make again:  The  top
    Makefile will detect the configuration file and run the build with
    it.



  Final note:
  
    the build system builds a statically linked library of the font engine
    in the "objs" directory. It does _not_ support the build of DLLs on
    Windows and OS/2, if you need these, you'll have to either use
    a IDE-specific project file, or follow the instructions in
    "INSTALL.ANY" to create your own Makefiles.
