FindFreetype.cmake 5.89 KB
Newer Older
1 2 3
# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.

4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
#[=======================================================================[.rst:
FindFreetype
------------

Find the FreeType font renderer includes and library.

Imported Targets
^^^^^^^^^^^^^^^^

This module defines the following :prop_tgt:`IMPORTED` target:

``Freetype::Freetype``
  The Freetype ``freetype`` library, if found

Result Variables
^^^^^^^^^^^^^^^^

This module will set the following variables in your project:

``FREETYPE_FOUND``
  true if the Freetype headers and libraries were found
``FREETYPE_INCLUDE_DIRS``
  directories containing the Freetype headers. This is the
  concatenation of the variables:

  ``FREETYPE_INCLUDE_DIR_ft2build``
    directory holding the main Freetype API configuration header
  ``FREETYPE_INCLUDE_DIR_freetype2``
    directory holding Freetype public headers
``FREETYPE_LIBRARIES``
  the library to link against
``FREETYPE_VERSION_STRING``
  the version of freetype found (since CMake 2.8.8)

Hints
^^^^^

The user may set the environment variable ``FREETYPE_DIR`` to the root
directory of a Freetype installation.
#]=======================================================================]
44

45
# Created by Eric Wing.
46 47 48
# Modifications by Alexander Neundorf.
# This file has been renamed to "FindFreetype.cmake" instead of the correct
# "FindFreeType.cmake" in order to be compatible with the one from KDE4, Alex.
49

50
# Ugh, FreeType seems to use some #include trickery which
51 52
# makes this harder than it should be. It looks like they
# put ft2build.h in a common/easier-to-find location which
53
# then contains a #include to a more specific header in a
54
# more specific location (#include <freetype/config/ftheader.h>).
55
# Then from there, they need to set a bunch of #define's
56 57
# so you can do something like:
# #include FT_FREETYPE_H
58
# Unfortunately, using CMake's mechanisms like include_directories()
59
# wants explicit full paths and this trickery doesn't work too well.
60
# I'm going to attempt to cut out the middleman and hope
61
# everything still works.
62 63

set(FREETYPE_FIND_ARGS
64
  HINTS
65
    ENV FREETYPE_DIR
66
  PATHS
67 68 69
    ENV GTKMM_BASEPATH
    [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]
    [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]
70 71 72 73 74 75
)

find_path(
  FREETYPE_INCLUDE_DIR_ft2build
  ft2build.h
  ${FREETYPE_FIND_ARGS}
76 77 78 79
  PATH_SUFFIXES
    include/freetype2
    include
    freetype2
80 81
)

82 83
find_path(
  FREETYPE_INCLUDE_DIR_freetype2
84 85 86
  NAMES
    freetype/config/ftheader.h
    config/ftheader.h
87
  ${FREETYPE_FIND_ARGS}
88 89 90 91
  PATH_SUFFIXES
    include/freetype2
    include
    freetype2
92 93
)

94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
if(NOT FREETYPE_LIBRARY)
  find_library(FREETYPE_LIBRARY_RELEASE
    NAMES
      freetype
      libfreetype
      freetype219
    ${FREETYPE_FIND_ARGS}
    PATH_SUFFIXES
      lib
  )
  find_library(FREETYPE_LIBRARY_DEBUG
    NAMES
      freetyped
      libfreetyped
      freetype219d
    ${FREETYPE_FIND_ARGS}
    PATH_SUFFIXES
      lib
  )
  include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
  select_library_configurations(FREETYPE)
115 116 117
else()
  # on Windows, ensure paths are in canonical format (forward slahes):
  file(TO_CMAKE_PATH "${FREETYPE_LIBRARY}" FREETYPE_LIBRARY)
118
endif()
119

120 121
unset(FREETYPE_FIND_ARGS)

122
# set the user variables
123 124
if(FREETYPE_INCLUDE_DIR_ft2build AND FREETYPE_INCLUDE_DIR_freetype2)
  set(FREETYPE_INCLUDE_DIRS "${FREETYPE_INCLUDE_DIR_ft2build};${FREETYPE_INCLUDE_DIR_freetype2}")
125
  list(REMOVE_DUPLICATES FREETYPE_INCLUDE_DIRS)
126
endif()
127
set(FREETYPE_LIBRARIES "${FREETYPE_LIBRARY}")
128

129 130 131 132 133 134 135
if(EXISTS "${FREETYPE_INCLUDE_DIR_freetype2}/freetype/freetype.h")
  set(FREETYPE_H "${FREETYPE_INCLUDE_DIR_freetype2}/freetype/freetype.h")
elseif(EXISTS "${FREETYPE_INCLUDE_DIR_freetype2}/freetype.h")
  set(FREETYPE_H "${FREETYPE_INCLUDE_DIR_freetype2}/freetype.h")
endif()

if(FREETYPE_INCLUDE_DIR_freetype2 AND FREETYPE_H)
136 137
  file(STRINGS "${FREETYPE_H}" freetype_version_str
       REGEX "^#[\t ]*define[\t ]+FREETYPE_(MAJOR|MINOR|PATCH)[\t ]+[0-9]+$")
138

139 140 141 142 143 144
  unset(FREETYPE_VERSION_STRING)
  foreach(VPART MAJOR MINOR PATCH)
    foreach(VLINE ${freetype_version_str})
      if(VLINE MATCHES "^#[\t ]*define[\t ]+FREETYPE_${VPART}[\t ]+([0-9]+)$")
        set(FREETYPE_VERSION_PART "${CMAKE_MATCH_1}")
        if(FREETYPE_VERSION_STRING)
145
          string(APPEND FREETYPE_VERSION_STRING ".${FREETYPE_VERSION_PART}")
146 147 148 149 150
        else()
          set(FREETYPE_VERSION_STRING "${FREETYPE_VERSION_PART}")
        endif()
        unset(FREETYPE_VERSION_PART)
      endif()
151
    endforeach()
152
  endforeach()
153
endif()
154

155
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
156 157

find_package_handle_standard_args(
158 159 160 161 162 163 164
  Freetype
  REQUIRED_VARS
    FREETYPE_LIBRARY
    FREETYPE_INCLUDE_DIRS
  VERSION_VAR
    FREETYPE_VERSION_STRING
)
165

166 167 168 169
mark_as_advanced(
  FREETYPE_INCLUDE_DIR_freetype2
  FREETYPE_INCLUDE_DIR_ft2build
)
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

if(Freetype_FOUND)
  if(NOT TARGET Freetype::Freetype)
    add_library(Freetype::Freetype UNKNOWN IMPORTED)
    set_target_properties(Freetype::Freetype PROPERTIES
      INTERFACE_INCLUDE_DIRECTORIES "${FREETYPE_INCLUDE_DIRS}")

    if(FREETYPE_LIBRARY_RELEASE)
      set_property(TARGET Freetype::Freetype APPEND PROPERTY
        IMPORTED_CONFIGURATIONS RELEASE)
      set_target_properties(Freetype::Freetype PROPERTIES
        IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C"
        IMPORTED_LOCATION_RELEASE "${FREETYPE_LIBRARY_RELEASE}")
    endif()

    if(FREETYPE_LIBRARY_DEBUG)
      set_property(TARGET Freetype::Freetype APPEND PROPERTY
        IMPORTED_CONFIGURATIONS DEBUG)
      set_target_properties(Freetype::Freetype PROPERTIES
        IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C"
        IMPORTED_LOCATION_DEBUG "${FREETYPE_LIBRARY_DEBUG}")
    endif()

    if(NOT FREETYPE_LIBRARY_RELEASE AND NOT FREETYPE_LIBRARY_DEBUG)
      set_target_properties(Freetype::Freetype PROPERTIES
        IMPORTED_LINK_INTERFACE_LANGUAGES "C"
        IMPORTED_LOCATION "${FREETYPE_LIBRARY}")
    endif()
  endif()
endif()