How to customize the compilation of the library
===============================================

  FreeType  is  highly  customizable  to  fit various  needs,  and  this
  document describes how it is possible to select options and components
  at compilation time.


I. Configuration macros

  The file found in `include/freetype/config/ftoption.h' contains a list
  of commented configuration macros that can be toggled by developers to
  indicate which features should be active while building the library.
  
  These  options  range from  debug  level  to  availability of  certain
  features, like native TrueType hinting through a bytecode interpreter.
  
  We invite you to read this  file for more information.  You can change
  the file's content to suit your  needs, or override it with one of the
  techniques described below.

  
II. Modules list

  The file found in `include/freetype/config/ftmodule.h' contains a list
  of  names  corresponding  to  the  modules  and  font  drivers  to  be
  statically compiled in the FreeType library during the build.

  You can change it to suit your own preferences.  Be aware that certain
  modules depend  on others, as  described by the file  `modules.txt' in
  this directory.

  You can modify  the file's content to suit your  needs, or override it
  at compile time with one of the methods described below.

  Note that  you also  have to  rename the various  `*.mk' files  in the
  module directories  which you  want to exclude  so that  the extension
  isn't `.mk'  -- GNU make uses  a simple globbing  mechanism to include
  all those files.


III. System interface

  FreeType's default interface to the  system (i.e., the parts that deal
  with   memory   management   and    i/o   streams)   is   located   in
  `src/base/ftsystem.c'.
  
  The  current implementation uses  standard C  library calls  to manage
  memory and to read font files.  It is however possible to write custom
  implementations to suit specific systems.

  To  tell  the GNU  Make-based  build system  to  use  a custom  system
  interface, you  have to define  the environment variable  FTSYS_SRC to
  point to the relevant implementation:
  
    on Unix:

      ./configure <your options>
      export FTSYS_SRC=foo/my_ftsystem.c
      make
      make install
   
    on Windows:

      make setup <compiler>
      set FTSYS_SRC=foo/my_ftsystem.c
      make
     
     
IV. Overriding default configuration and module headers

  It  is  possible to  override  the  default  configuration and  module
  headers without changing the original files.  There are two ways to do
  that:


  1. Using the C include path
  
    Use the C include path to ensure that your own versions of the files
    are used at compile time when the lines
    
      #include FT_CONFIG_OPTIONS_H
      #include FT_CONFIG_MODULES_H

    are       compiled.       Their      default       values      being
    <freetype/config/ftoption.h>  and  <freetype/config/ftmodule.h>, you
    can do something like:

      custom/
        freetype/
          config/
            ftoption.h    => custom options header
            ftmodule.h    => custom modules list
             
      include/            => normal FreeType 2 include
        freetype/
          ...

    then change the  C include path to always give  the path to `custom'
    before the FreeType 2 `include'.


  2. Redefining FT_CONFIG_OPTIONS_H and FT_CONFIG_MODULES_H
  
    Another way to  do the same thing is to redefine  the macros used to
    name  the  configuration headers.   To  do  so,  you need  a  custom
    `ft2build.h' whose content can be as simple as:
   
      #ifndef __FT2_BUILD_MY_PLATFORM_H__
      #define __FT2_BUILD_MY_PLATFORM_H__

      #define FT_CONFIG_OPTIONS_H  <custom/my-ftoption.h>
      #define FT_CONFIG_MODULES_H  <custom/my-ftmodule.h>

      #include <freetype/config/ftheader.h>

      #endif /* __FT2_BUILD_MY_PLATFORM_H__ */
   
    Place those files in a separate directory, e.g.,
   
      custom/
        ft2build.h           => custom version described above
        my-ftoption.h        => custom options header
        my-ftmodule.h        => custom modules list header

    and  change the C  include path  to ensure  that `custom'  is always
    placed before the FT2 `include' during compilation.

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

Copyright 2003, 2005 by
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 CUSTOMIZE ---
