# FreeType 2 top Jamfile (c) 2001, 2002, 2003 David Turner
#

# The HDRMACRO is already defined in FTJam and is used to add
# the content of certain macros to the list of included header
# files.
#
# We can compile FreeType 2 with classic Jam however thanks to
# the following code
#
if ! $(JAM_TOOLSET)
{
  rule HDRMACRO
  {
    # nothing
  }
}


# We need to invoke a SubDir rule if the FT2 source directory top is not the
# current directory.  This allows us to build FreeType 2 as part of a larger
# project easily.
#
if $(FT2_TOP) != $(DOT)
{
  SubDir  FT2_TOP ;
}


# The following macros define the include directory, the source directory,
# and the final library name (without library extensions).  They can be
# replaced by other definitions when the library is compiled as part of
# a larger project.
#

# Name of FreeType include directory during compilation.
# This is relative to FT2_TOP.
#
FT2_INCLUDE_DIR ?= include ;

# Name of FreeType source directory during compilation.
# This is relative to FT2_TOP.
#
FT2_SRC_DIR ?= src ;

# Name of final library, without extension.
#
FT2_LIB ?= $(LIBPREFIX)freetype ;


# Define FT2_BUILD_INCLUDE to point to your build-specific directory.
# This is prepended to FT2_INCLUDE_DIR.  It can be used to specify
# the location of a custom <ft2build.h> which will point to custom
# versions of "ftmodule.h" and "ftoption.h", for example.
#
FT2_BUILD_INCLUDE ?= ;

# The list of modules to compile on any given build of the library.
# By default, this will contain _all_ modules defined in FT2_SRC_DIR.
#
# IMPORTANT: You'll need to change the content of "ftmodule.h" as well
#            if you modify this list or provide your own.
#
FT2_COMPONENTS ?= gzip       # support for gzip-compressed files
                  autohint   # auto-hinter
                  base       # base component (public APIs)
                  bdf        # BDF font driver
                  cache      # cache sub-system
                  cff        # CFF/CEF font driver
                  cid        # PostScript CID-keyed font driver
                  pcf        # PCF font driver
                  pfr        # PFR/TrueDoc font driver
                  psaux      # common PostScript routines module
                  pshinter   # PostScript hinter module
                  psnames    # PostScript names handling
                  raster     # monochrome rasterizer
                  smooth     # anti-aliased rasterizer
                  sfnt       # SFNT-based format support routines
                  truetype   # TrueType font driver
                  type1      # PostScript Type 1 font driver
                  type42     # PostScript Type 42 (embedded TrueType) driver
                  winfonts   # Windows FON/FNT font driver
                  ;


# Don't touch.
#
FT2_INCLUDE  = $(FT2_BUILD_INCLUDE)
               [ FT2_SubDir $(FT2_INCLUDE_DIR) ] ;

FT2_SRC      = [ FT2_SubDir $(FT2_SRC_DIR) ] ;

# Only used by FreeType developers.
#
if $(DEBUG_HINTER)
{
  CCFLAGS += -DDEBUG_HINTER ;
}


# We need "freetype2/include" in the current include path in order to
# compile any part of FreeType 2.
#
HDRS += $(FT2_INCLUDE) ;


# Uncomment the following line if you want to build individual source files
# for each FreeType 2 module.  This is only useful during development, and
# is better defined as an environment variable anyway!
#
# FT2_MULTI = true ;


# The file <freetype/config/ftheader.h> is used to define macros that are
# later used in #include statements.  It needs to be parsed in order to
# record these definitions.
#
HDRMACRO  [ FT2_SubDir  include freetype config ftheader.h ] ;
HDRMACRO  [ FT2_SubDir  include freetype internal internal.h ] ;


# Now include the Jamfile in "freetype2/src", used to drive the compilation
# of each FreeType 2 component and/or module.
#
SubInclude  FT2_TOP $(FT2_SRC_DIR) ;


# Test files (hinter debugging).  Only used by FreeType developers.
#
if $(DEBUG_HINTER)
{
  SubInclude FT2_TOP tests ;
}

# end of top Jamfile
