# FreeType 2 top Jamfile.
#
# Copyright (C) 2001-2019 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.


# 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 ?= autofit    # auto-fitter
                  base       # base component (public APIs)
                  bdf        # BDF font driver
                  bzip2      # support for bzip2-compressed PCF font
                  cache      # cache sub-system
                  cff        # CFF/CEF font driver
                  cid        # PostScript CID-keyed font driver
                  gzip       # support for gzip-compressed PCF font
                  lzw        # support for LZW-compressed PCF font
                  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
                  sfnt       # SFNT-based format support routines
                  smooth     # anti-aliased rasterizer
                  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) ] ;

# Location of API Reference Documentation
#
if $(DOC_DIR)
{
  DOC_DIR = $(DOCDIR:T) ;
}
else
{
  DOC_DIR = docs/reference ;
}


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


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


# We need to #define FT2_BUILD_LIBRARY so that our sources find the
# internal headers
#
CCFLAGS += -DFT2_BUILD_LIBRARY ;

# 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 files `ftheader.h', `internal.h', and `ftserv.h' are used to define
# macros that are later used in #include statements.  They need to be parsed
# in order to record these definitions.
#
HDRMACRO  [ FT2_SubDir  $(FT2_INCLUDE_DIR) freetype config ftheader.h ] ;
HDRMACRO  [ FT2_SubDir  $(FT2_INCLUDE_DIR) freetype internal internal.h ] ;
HDRMACRO  [ FT2_SubDir  $(FT2_INCLUDE_DIR) freetype internal ftserv.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) ;

# Handle the generation of the `ftexport.sym' file, which contains the list
# of exported symbols.  This can be used on Unix by libtool.
#
SubInclude FT2_TOP $(FT2_SRC_DIR) tools ;

rule GenExportSymbols
{
  local  apinames = apinames$(SUFEXE) ;
  local  aheader ;
  local  headers ;

  for aheader in [ Glob $(2) : *.h ]
  {
    switch $(aheader)
    {
      case */ftmac.h :
        if ( $(MAC) || $(OS) = MACOSX ) {
          headers += $(aheader) ;
        }
      case *.h : headers += $(aheader) ;
    }
  }

  LOCATE on $(1) = $(ALL_LOCATE_TARGET) ;

  APINAMES on $(1) = apinames$(SUFEXE) ;

  Depends            $(1) : $(apinames) $(headers) ;
  GenExportSymbols1  $(1) : $(headers) ;
  Clean              clean : $(1) ;
}

actions GenExportSymbols1 bind APINAMES
{
  $(APINAMES) $(2) > $(1)
}

GenExportSymbols  ftexport.sym : include/freetype ;

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

rule RefDoc
{
  Depends  $1 : all ;
  NotFile  $1 ;
  Always   $1 ;
}

actions RefDoc
{
  python -m docwriter
         --prefix=ft2
         --title=FreeType-2.10.1
         --output=$(DOC_DIR)
         $(FT2_INCLUDE)/freetype/*.h
         $(FT2_INCLUDE)/freetype/config/*.h
         $(FT2_INCLUDE)/freetype/cache/*.h
}

RefDoc  refdoc ;


# end of top Jamfile
