This document contains instructions how to build the FreeType library on
non-Unix  systems with  the help  of  GNU Make.   Note that  if you  are
running Cygwin or MSys in Windows, you should follow the instructions in
the file 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:

  1. 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!

    Note  that make++,  a make  tool  written in  Perl, supports  enough
    features    of    GNU     make    to    compile    FreeType.     See
    http://makepp.sourceforge.net for more information.

    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!


  2. 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  5.  Note that if your platform  is completely alien to
    the build system, the detected platform will be 'ansi'.


  3. 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>

    Examples:

      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 5.


  4. 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 5.

    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'.


  5. 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 have to either use
    a  IDE-specific   project  file,  or  follow   the  instructions  in
    "INSTALL.ANY" to create your own Makefiles.


--- end of INSTALL.GNU ---
