[HarfBuzz] harfbuzz: Branch 'master' - 2 commits

Behdad Esfahbod behdad at kemper.freedesktop.org
Wed Apr 5 13:38:53 UTC 2017


 CMakeLists.txt        |  234 ++++++++++++++++++++++++++++++++++++++++++++++++++
 Makefile.am           |    1 
 appveyor.yml          |   61 ++++++++-----
 src/Makefile.am       |    2 
 src/Makefile.sources  |   16 ++-
 win32/config-msvc.mak |    8 +
 6 files changed, 293 insertions(+), 29 deletions(-)

New commits:
commit d2acaf6d729727f47c5aacf7ee40097580b6f18d
Author: ebraminio <ebrahim at gnu.org>
Date:   Wed Apr 5 02:21:23 2017 -0700

    Split ragel generated files lists and remove hardcoded rl files lists (#453)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index d12b2ad9..111066c3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -24,7 +24,7 @@ option(HB_HAVE_CORETEXT "Enable CoreText shaper on macOS" ON)
 option(HB_BUILTIN_UCDN "Use HarfBuzz provided UCDN" ON)
 
 include_directories(AFTER
-  ${CMAKE_CURRENT_SOURCE_DIR}/src
+  ${PROJECT_SOURCE_DIR}/src
   ${PROJECT_BINARY_DIR}/src
   )
 
@@ -53,29 +53,47 @@ if (EXISTS "${PROJECT_SOURCE_DIR}/src/hb-version.h")
   set(HB_VERSION_H "${PROJECT_SOURCE_DIR}/src/hb-version.h")
 endif ()
 
+## Extract variables from src/Makefile.sources
+file(READ ${PROJECT_SOURCE_DIR}/src/Makefile.sources MAKEFILESOURCES)
+function (extract_make_variable variable directory)
+  string(REGEX MATCH "${variable} = ([^$]+)" temp ${MAKEFILESOURCES})
+  string(REGEX REPLACE "\thb" "${directory}/hb" temp ${temp})
+  string(REGEX MATCHALL "src/[^ ]+" temp ${temp})
+  set(${variable} ${temp} PARENT_SCOPE)
+endfunction ()
+
+extract_make_variable(HB_BASE_sources "${PROJECT_SOURCE_DIR}/src")
+extract_make_variable(HB_BASE_headers "${PROJECT_SOURCE_DIR}/src")
+extract_make_variable(HB_OT_sources "${PROJECT_SOURCE_DIR}/src")
+extract_make_variable(HB_OT_headers "${PROJECT_SOURCE_DIR}/src")
+if (IN_HB_DIST)
+  extract_make_variable(HB_BASE_RAGEL_GENERATED_sources "${PROJECT_SOURCE_DIR}/src")
+  extract_make_variable(HB_OT_RAGEL_GENERATED_sources "${PROJECT_SOURCE_DIR}/src")
+else ()
+  extract_make_variable(HB_BASE_RAGEL_GENERATED_sources "${PROJECT_BINARY_DIR}/src")
+  extract_make_variable(HB_OT_RAGEL_GENERATED_sources "${PROJECT_BINARY_DIR}/src")
+endif ()
+##
+
 if (NOT IN_HB_DIST)
   ## execute ragel tasks
   find_program(RAGEL "ragel")
 
   if (RAGEL)
     message(STATUS "ragel found at: ${RAGEL}")
-  else (RAGEL)
+  else ()
     message(FATAL_ERROR "ragel not found, get it here -- http://www.complang.org/ragel/")
-  endif (RAGEL)
+  endif ()
 
-  function (ragel_preproc src_dir src_sans_rl out_sfx)
-    add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src/${src_sans_rl}${out_sfx}
-      COMMAND ${RAGEL} -G2 -o ${PROJECT_BINARY_DIR}/src/${src_sans_rl}${out_sfx} ${CMAKE_CURRENT_SOURCE_DIR}/${src_dir}/${src_sans_rl}.rl -I ${CMAKE_CURRENT_SOURCE_DIR} ${ARGN}
-      DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${src_dir}/${src_sans_rl}.rl
+  foreach (ragel_output IN ITEMS ${HB_BASE_RAGEL_GENERATED_sources} ${HB_OT_RAGEL_GENERATED_sources})
+    string(REGEX MATCH "([^/]+)\\.hh" temp ${ragel_output})
+    set(target_name ${CMAKE_MATCH_1})
+    add_custom_command(OUTPUT ${ragel_output}
+      COMMAND ${RAGEL} -G2 -o ${ragel_output} ${PROJECT_SOURCE_DIR}/src/${target_name}.rl -I ${PROJECT_SOURCE_DIR} ${ARGN}
+      DEPENDS ${PROJECT_SOURCE_DIR}/src/${target_name}.rl
       )
-    add_custom_target(harfbuzz_${src_sans_rl} DEPENDS ${PROJECT_BINARY_DIR}/src/${src_sans_rl})
-  endfunction(ragel_preproc)
-
-  ragel_preproc(src hb-buffer-deserialize-json .hh)
-  ragel_preproc(src hb-buffer-deserialize-text .hh)
-  ragel_preproc(src hb-ot-shape-complex-indic-machine .hh)
-  ragel_preproc(src hb-ot-shape-complex-myanmar-machine .hh)
-  ragel_preproc(src hb-ot-shape-complex-use-machine .hh)
+    add_custom_target(harfbuzz_${target_name} DEPENDS ${PROJECT_BINARY_DIR}/src/${target_name})
+  endforeach ()
   ##
 
   ## Generate hb-version.h
@@ -97,41 +115,14 @@ if (NOT IN_HB_DIST)
   ##
 endif ()
 
-## Extract variables from src/Makefile.sources
-file(READ src/Makefile.sources MAKEFILESOURCES)
-function (extract_make_variable variable)
-  string(REGEX MATCH "${variable} = ([^$]+)" temp ${MAKEFILESOURCES})
-  if (NOT IN_HB_DIST)
-    # these should be built first and will be added from a different path
-    string(REPLACE "hb-buffer-deserialize-json.hh" "" temp ${temp})
-    string(REPLACE "hb-buffer-deserialize-text.hh" "" temp ${temp})
-    string(REPLACE "hb-ot-shape-complex-indic-machine.hh" "" temp ${temp})
-    string(REPLACE "hb-ot-shape-complex-myanmar-machine.hh" "" temp ${temp})
-    string(REPLACE "hb-ot-shape-complex-use-machine.hh" "" temp ${temp})
-  endif ()
-  string(REGEX REPLACE "\thb" "src/hb" temp ${temp})
-  string(REGEX MATCHALL "src/[^ ]+" temp ${temp})
-  set(${variable} ${temp} PARENT_SCOPE)
-endfunction(extract_make_variable)
-
-extract_make_variable(HB_BASE_sources)
-extract_make_variable(HB_BASE_headers)
-extract_make_variable(HB_OT_sources)
-extract_make_variable(HB_OT_headers)
-##
-
 ## Define source and headers of projects
-if (NOT IN_HB_DIST)
-  set(project_sources
-    ${project_sources}
+set(project_sources
+  ${HB_BASE_sources}
+  ${HB_BASE_RAGEL_GENERATED_sources}
 
-    ${PROJECT_BINARY_DIR}/src/hb-buffer-deserialize-json.hh
-    ${PROJECT_BINARY_DIR}/src/hb-buffer-deserialize-text.hh
-    ${PROJECT_BINARY_DIR}/src/hb-ot-shape-complex-indic-machine.hh
-    ${PROJECT_BINARY_DIR}/src/hb-ot-shape-complex-myanmar-machine.hh
-    ${PROJECT_BINARY_DIR}/src/hb-ot-shape-complex-use-machine.hh
-    )
-endif ()
+  ${HB_OT_sources}
+  ${HB_OT_RAGEL_GENERATED_sources}
+  )
 
 set(project_headers
   ${HB_VERSION_H}
@@ -140,13 +131,6 @@ set(project_headers
   ${HB_OT_headers}
   )
 
-set(project_sources
-  ${project_sources}
-
-  ${HB_BASE_sources}
-  ${HB_OT_sources}
-  )
-
 if (HB_HAVE_FREETYPE)
   set(FREETYPE_DIR "$ENV{FREETYPE_DIR}"
     CACHE PATH "root path for freetype lib/ and include/ folders"
@@ -173,27 +157,26 @@ if (HB_HAVE_FREETYPE)
   endif ()
 
   if (FREETYPE_INCLUDE_DIR AND FREETYPE_ACTUAL_LIBRARY)
-    set (THIRD_PARTY_LIBS ${THIRD_PARTY_LIBS} ${FREETYPE_ACTUAL_LIBRARY})
+    set(THIRD_PARTY_LIBS ${THIRD_PARTY_LIBS} ${FREETYPE_ACTUAL_LIBRARY})
     add_definitions(-DHAVE_FREETYPE=1 -DHAVE_FT_FACE_GETCHARVARIANTINDEX=1)
   endif ()
 
-  set(project_headers ${project_headers} src/hb-ft.h)
-
-  set(project_sources ${project_sources} src/hb-ft.cc)
+  set(project_sources ${project_sources} ${PROJECT_SOURCE_DIR}/src/hb-ft.cc)
+  set(project_headers ${project_headers} ${PROJECT_SOURCE_DIR}/src/hb-ft.h)
 endif ()
 
 if (HB_BUILTIN_UCDN)
   include_directories(src/hb-ucdn)
   add_definitions(-DHAVE_UCDN)
 
-  set(project_headers ${project_headers} src/hb-ucdn/ucdn.h)
+  set(project_headers ${project_headers} ${PROJECT_SOURCE_DIR}/src/hb-ucdn/ucdn.h)
 
   set(project_sources
     ${project_sources}
 
-    src/hb-ucdn.cc
-    src/hb-ucdn/ucdn.c
-    src/hb-ucdn/unicodedata_db.h)
+    ${PROJECT_SOURCE_DIR}/src/hb-ucdn.cc
+    ${PROJECT_SOURCE_DIR}/src/hb-ucdn/ucdn.c
+    ${PROJECT_SOURCE_DIR}/src/hb-ucdn/unicodedata_db.h)
 else ()
   add_definitions(-DHB_NO_UNICODE_FUNCS)
 endif ()
@@ -202,9 +185,8 @@ if (APPLE AND HB_HAVE_CORETEXT)
   # Apple Advanced Typography
   add_definitions(-DHAVE_CORETEXT)
 
-  set(project_headers ${project_headers} src/hb-coretext.h)
-
-  set(project_sources ${project_sources} src/hb-coretext.cc)
+  set(project_sources ${project_sources} ${PROJECT_SOURCE_DIR}/src/hb-coretext.cc)
+  set(project_headers ${project_headers} ${PROJECT_SOURCE_DIR}/src/hb-coretext.h)
 
   find_library(APPLICATION_SERVICES_FRAMEWORK ApplicationServices)
   mark_as_advanced(APPLICATION_SERVICES_FRAMEWORK)
@@ -216,9 +198,8 @@ endif ()
 if (WIN32 AND HB_HAVE_UNISCRIBE)
   add_definitions(-DHAVE_UNISCRIBE)
 
-  set(project_headers ${project_headers} src/hb-uniscribe.h)
-
-  set(project_sources ${project_sources} src/hb-uniscribe.cc)
+  set(project_sources ${project_sources} ${PROJECT_SOURCE_DIR}/src/hb-uniscribe.cc)
+  set(project_headers ${project_headers} ${PROJECT_SOURCE_DIR}/src/hb-uniscribe.h)
 
   set(THIRD_PARTY_LIBS ${THIRD_PARTY_LIBS} usp10 gdi32 rpcrt4)
 endif ()
@@ -226,9 +207,8 @@ endif ()
 if (WIN32 AND HB_HAVE_DIRECTWRITE)
   add_definitions(-DHAVE_DIRECTWRITE)
 
-  set(project_headers ${project_headers} src/hb-directwrite.h)
-
-  set(project_sources ${project_sources} src/hb-directwrite.cc)
+  set(project_sources ${project_sources} ${PROJECT_SOURCE_DIR}/src/hb-directwrite.cc)
+  set(project_headers ${project_headers} ${PROJECT_SOURCE_DIR}/src/hb-directwrite.h)
 
   set(THIRD_PARTY_LIBS ${THIRD_PARTY_LIBS} dwrite rpcrt4)
 endif ()
@@ -251,4 +231,4 @@ if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
     RUNTIME DESTINATION bin
     )
 endif ()
-##
\ No newline at end of file
+##
diff --git a/src/Makefile.am b/src/Makefile.am
index e322d568..d3a0cfa6 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -25,11 +25,13 @@ HBLIBS =
 HBNONPCLIBS =
 HBDEPS =
 HBSOURCES =  $(HB_BASE_sources)
+HBSOURCES += $(HB_BASE_RAGEL_GENERATED_sources)
 HBHEADERS = $(HB_BASE_headers)
 HBNODISTHEADERS = $(HB_NODIST_headers)
 
 if HAVE_OT
 HBSOURCES += $(HB_OT_sources)
+HBSOURCES += $(HB_OT_RAGEL_GENERATED_sources)
 HBHEADERS += $(HB_OT_headers)
 endif
 
diff --git a/src/Makefile.sources b/src/Makefile.sources
index 6363cf93..03be7ba5 100644
--- a/src/Makefile.sources
+++ b/src/Makefile.sources
@@ -5,8 +5,6 @@ NULL =
 HB_BASE_sources = \
 	hb-atomic-private.hh \
 	hb-blob.cc \
-	hb-buffer-deserialize-json.hh \
-	hb-buffer-deserialize-text.hh \
 	hb-buffer-private.hh \
 	hb-buffer-serialize.cc \
 	hb-buffer.cc \
@@ -47,6 +45,11 @@ HB_BASE_sources = \
 	hb-warning.cc \
 	$(NULL)
 
+HB_BASE_RAGEL_GENERATED_sources = \
+	hb-buffer-deserialize-json.hh \
+	hb-buffer-deserialize-text.hh \
+	$(NULL)
+
 HB_BASE_headers = \
 	hb.h \
 	hb-blob.h \
@@ -91,15 +94,12 @@ HB_OT_sources = \
 	hb-ot-shape-complex-hangul.cc \
 	hb-ot-shape-complex-hebrew.cc \
 	hb-ot-shape-complex-indic.cc \
-	hb-ot-shape-complex-indic-machine.hh \
 	hb-ot-shape-complex-indic-private.hh \
 	hb-ot-shape-complex-indic-table.cc \
 	hb-ot-shape-complex-myanmar.cc \
-	hb-ot-shape-complex-myanmar-machine.hh \
 	hb-ot-shape-complex-thai.cc \
 	hb-ot-shape-complex-tibetan.cc \
 	hb-ot-shape-complex-use.cc \
-	hb-ot-shape-complex-use-machine.hh \
 	hb-ot-shape-complex-use-private.hh \
 	hb-ot-shape-complex-use-table.cc \
 	hb-ot-shape-complex-private.hh \
@@ -115,6 +115,12 @@ HB_OT_sources = \
 	hb-ot-var-mvar-table.hh \
 	$(NULL)
 
+HB_OT_RAGEL_GENERATED_sources = \
+	hb-ot-shape-complex-indic-machine.hh \
+	hb-ot-shape-complex-myanmar-machine.hh \
+	hb-ot-shape-complex-use-machine.hh \
+	$(NULL)
+
 HB_OT_headers = \
 	hb-ot.h \
 	hb-ot-font.h \
diff --git a/win32/config-msvc.mak b/win32/config-msvc.mak
index dffdcb26..d66bb2c0 100644
--- a/win32/config-msvc.mak
+++ b/win32/config-msvc.mak
@@ -36,9 +36,11 @@ HB_DEFINES =
 HB_CFLAGS = /DHAVE_CONFIG_H
 HB_UCDN_CFLAGS = /I..\src\hb-ucdn
 HB_SOURCES =	\
-	$(HB_BASE_sources)		\
-	$(HB_FALLBACK_sources)	\
-	$(HB_OT_sources)
+	$(HB_BASE_sources)			\
+	$(HB_BASE_RAGEL_GENERATED_sources)	\
+	$(HB_FALLBACK_sources)			\
+	$(HB_OT_sources)			\
+	$(HB_OT_RAGEL_GENERATED_sources)
 
 HB_HEADERS =	\
 	$(HB_BASE_headers)		\
commit 7d64c0ef37dd930e9807bd80d398491aa9c4428c
Author: ebraminio <ebrahim at gnu.org>
Date:   Tue Apr 4 15:03:51 2017 +0430

    Add CMake build support (#444)

diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 00000000..d12b2ad9
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,254 @@
+cmake_minimum_required(VERSION 2.8.0)
+project(harfbuzz)
+
+## Disallow in-source builds
+if ("${PROJECT_BINARY_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}")
+  message(FATAL_ERROR
+    "
+In-source builds are not permitted!  Make a separate folder for"
+    " building, e.g.,"
+    "
+  mkdir build; cd build; cmake .."
+    "
+Before that, remove the files created by this failed run with"
+    "
+  rm -rf CMakeCache.txt CMakeFiles")
+endif ()
+##
+
+## HarfBuzz build configurations
+option(HB_HAVE_FREETYPE "Use FreeType" OFF)
+option(HB_HAVE_UNISCRIBE "Enable Uniscribe shaper on Windows" OFF)
+option(HB_HAVE_DIRECWRITE "Enable DirectWrite shaper on Windows" OFF)
+option(HB_HAVE_CORETEXT "Enable CoreText shaper on macOS" ON)
+option(HB_BUILTIN_UCDN "Use HarfBuzz provided UCDN" ON)
+
+include_directories(AFTER
+  ${CMAKE_CURRENT_SOURCE_DIR}/src
+  ${PROJECT_BINARY_DIR}/src
+  )
+
+# feel free to discuss these or more with the maintainers
+add_definitions(-DHAVE_OT)
+add_definitions(-DHB_NO_MT)
+add_definitions(-DHB_DISABLE_DEPRECATED)
+
+if (BUILD_SHARED_LIBS)
+  add_definitions(-DHAVE_ATEXIT)
+endif ()
+
+if (MSVC)
+  add_definitions(-wd4244 -wd4267 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS)
+endif ()
+
+if (WIN32 AND NOT MINGW AND BUILD_SHARED_LIBS)
+  add_definitions("-DHB_EXTERN=__declspec(dllexport) extern")
+endif ()
+##
+
+set(IN_HB_DIST FALSE)
+if (EXISTS "${PROJECT_SOURCE_DIR}/src/hb-version.h")
+  # perhaps we are on dist directory
+  set(IN_HB_DIST TRUE)
+  set(HB_VERSION_H "${PROJECT_SOURCE_DIR}/src/hb-version.h")
+endif ()
+
+if (NOT IN_HB_DIST)
+  ## execute ragel tasks
+  find_program(RAGEL "ragel")
+
+  if (RAGEL)
+    message(STATUS "ragel found at: ${RAGEL}")
+  else (RAGEL)
+    message(FATAL_ERROR "ragel not found, get it here -- http://www.complang.org/ragel/")
+  endif (RAGEL)
+
+  function (ragel_preproc src_dir src_sans_rl out_sfx)
+    add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src/${src_sans_rl}${out_sfx}
+      COMMAND ${RAGEL} -G2 -o ${PROJECT_BINARY_DIR}/src/${src_sans_rl}${out_sfx} ${CMAKE_CURRENT_SOURCE_DIR}/${src_dir}/${src_sans_rl}.rl -I ${CMAKE_CURRENT_SOURCE_DIR} ${ARGN}
+      DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${src_dir}/${src_sans_rl}.rl
+      )
+    add_custom_target(harfbuzz_${src_sans_rl} DEPENDS ${PROJECT_BINARY_DIR}/src/${src_sans_rl})
+  endfunction(ragel_preproc)
+
+  ragel_preproc(src hb-buffer-deserialize-json .hh)
+  ragel_preproc(src hb-buffer-deserialize-text .hh)
+  ragel_preproc(src hb-ot-shape-complex-indic-machine .hh)
+  ragel_preproc(src hb-ot-shape-complex-myanmar-machine .hh)
+  ragel_preproc(src hb-ot-shape-complex-use-machine .hh)
+  ##
+
+  ## Generate hb-version.h
+  file(READ configure.ac CONFIGUREAC)
+  string(REGEX MATCH "\\[(([0-9]+)\\.([0-9]+)\\.([0-9]+))\\]" HB_VERSION_MATCH ${CONFIGUREAC})
+  set(HB_VERSION ${CMAKE_MATCH_1})
+  set(HB_VERSION_MAJOR ${CMAKE_MATCH_2})
+  set(HB_VERSION_MINOR ${CMAKE_MATCH_3})
+  set(HB_VERSION_MICRO ${CMAKE_MATCH_4})
+
+  set(HB_VERSION_H_IN "${PROJECT_SOURCE_DIR}/src/hb-version.h.in")
+  set(HB_VERSION_H "${PROJECT_BINARY_DIR}/src/hb-version.h")
+  set_source_files_properties("${HB_VERSION_H}" PROPERTIES GENERATED true)
+  configure_file("${HB_VERSION_H_IN}" "${HB_VERSION_H}.tmp" @ONLY)
+  execute_process(COMMAND "${CMAKE_COMMAND}" -E copy_if_different
+    "${HB_VERSION_H}.tmp"
+    "${HB_VERSION_H}")
+  file(REMOVE "${HB_VERSION_H}.tmp")
+  ##
+endif ()
+
+## Extract variables from src/Makefile.sources
+file(READ src/Makefile.sources MAKEFILESOURCES)
+function (extract_make_variable variable)
+  string(REGEX MATCH "${variable} = ([^$]+)" temp ${MAKEFILESOURCES})
+  if (NOT IN_HB_DIST)
+    # these should be built first and will be added from a different path
+    string(REPLACE "hb-buffer-deserialize-json.hh" "" temp ${temp})
+    string(REPLACE "hb-buffer-deserialize-text.hh" "" temp ${temp})
+    string(REPLACE "hb-ot-shape-complex-indic-machine.hh" "" temp ${temp})
+    string(REPLACE "hb-ot-shape-complex-myanmar-machine.hh" "" temp ${temp})
+    string(REPLACE "hb-ot-shape-complex-use-machine.hh" "" temp ${temp})
+  endif ()
+  string(REGEX REPLACE "\thb" "src/hb" temp ${temp})
+  string(REGEX MATCHALL "src/[^ ]+" temp ${temp})
+  set(${variable} ${temp} PARENT_SCOPE)
+endfunction(extract_make_variable)
+
+extract_make_variable(HB_BASE_sources)
+extract_make_variable(HB_BASE_headers)
+extract_make_variable(HB_OT_sources)
+extract_make_variable(HB_OT_headers)
+##
+
+## Define source and headers of projects
+if (NOT IN_HB_DIST)
+  set(project_sources
+    ${project_sources}
+
+    ${PROJECT_BINARY_DIR}/src/hb-buffer-deserialize-json.hh
+    ${PROJECT_BINARY_DIR}/src/hb-buffer-deserialize-text.hh
+    ${PROJECT_BINARY_DIR}/src/hb-ot-shape-complex-indic-machine.hh
+    ${PROJECT_BINARY_DIR}/src/hb-ot-shape-complex-myanmar-machine.hh
+    ${PROJECT_BINARY_DIR}/src/hb-ot-shape-complex-use-machine.hh
+    )
+endif ()
+
+set(project_headers
+  ${HB_VERSION_H}
+
+  ${HB_BASE_headers}
+  ${HB_OT_headers}
+  )
+
+set(project_sources
+  ${project_sources}
+
+  ${HB_BASE_sources}
+  ${HB_OT_sources}
+  )
+
+if (HB_HAVE_FREETYPE)
+  set(FREETYPE_DIR "$ENV{FREETYPE_DIR}"
+    CACHE PATH "root path for freetype lib/ and include/ folders"
+    )
+  find_path(FREETYPE_INCLUDE_DIR
+    ft2build.h freetype2/freetype/freetype.h
+    PATHS ${FREETYPE_DIR}/include
+    )
+
+  if (CMAKE_BUILD_TYPE MATCHES Debug)
+    find_library(FREETYPE_DEBUG_LIBRARY freetyped)
+    set(FREETYPE_ACTUAL_LIBRARY ${FREETYPE_DEBUG_LIBRARY})
+  else ()
+    find_library(FREETYPE_LIBRARY
+      freetype libfreetype
+      PATHS ${FREETYPE_DIR}/lib
+      DOC "freetype library"
+      )
+    set(FREETYPE_ACTUAL_LIBRARY ${FREETYPE_LIBRARY})
+  endif ()
+
+  if (FREETYPE_INCLUDE_DIR)
+    include_directories(AFTER ${FREETYPE_INCLUDE_DIR} ${FREETYPE_INCLUDE_DIR}/freetype2)
+  endif ()
+
+  if (FREETYPE_INCLUDE_DIR AND FREETYPE_ACTUAL_LIBRARY)
+    set (THIRD_PARTY_LIBS ${THIRD_PARTY_LIBS} ${FREETYPE_ACTUAL_LIBRARY})
+    add_definitions(-DHAVE_FREETYPE=1 -DHAVE_FT_FACE_GETCHARVARIANTINDEX=1)
+  endif ()
+
+  set(project_headers ${project_headers} src/hb-ft.h)
+
+  set(project_sources ${project_sources} src/hb-ft.cc)
+endif ()
+
+if (HB_BUILTIN_UCDN)
+  include_directories(src/hb-ucdn)
+  add_definitions(-DHAVE_UCDN)
+
+  set(project_headers ${project_headers} src/hb-ucdn/ucdn.h)
+
+  set(project_sources
+    ${project_sources}
+
+    src/hb-ucdn.cc
+    src/hb-ucdn/ucdn.c
+    src/hb-ucdn/unicodedata_db.h)
+else ()
+  add_definitions(-DHB_NO_UNICODE_FUNCS)
+endif ()
+
+if (APPLE AND HB_HAVE_CORETEXT)
+  # Apple Advanced Typography
+  add_definitions(-DHAVE_CORETEXT)
+
+  set(project_headers ${project_headers} src/hb-coretext.h)
+
+  set(project_sources ${project_sources} src/hb-coretext.cc)
+
+  find_library(APPLICATION_SERVICES_FRAMEWORK ApplicationServices)
+  mark_as_advanced(APPLICATION_SERVICES_FRAMEWORK)
+  if (APPLICATION_SERVICES_FRAMEWORK)
+    set(THIRD_PARTY_LIBS ${THIRD_PARTY_LIBS} ${APPLICATION_SERVICES_FRAMEWORK})
+  endif (APPLICATION_SERVICES_FRAMEWORK)
+endif ()
+
+if (WIN32 AND HB_HAVE_UNISCRIBE)
+  add_definitions(-DHAVE_UNISCRIBE)
+
+  set(project_headers ${project_headers} src/hb-uniscribe.h)
+
+  set(project_sources ${project_sources} src/hb-uniscribe.cc)
+
+  set(THIRD_PARTY_LIBS ${THIRD_PARTY_LIBS} usp10 gdi32 rpcrt4)
+endif ()
+
+if (WIN32 AND HB_HAVE_DIRECTWRITE)
+  add_definitions(-DHAVE_DIRECTWRITE)
+
+  set(project_headers ${project_headers} src/hb-directwrite.h)
+
+  set(project_sources ${project_sources} src/hb-directwrite.cc)
+
+  set(THIRD_PARTY_LIBS ${THIRD_PARTY_LIBS} dwrite rpcrt4)
+endif ()
+
+set(project_sources ${project_sources} ${project_headers})
+##
+
+add_library(harfbuzz ${project_sources})
+target_link_libraries(harfbuzz ${THIRD_PARTY_LIBS})
+
+## Install
+if (NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL)
+  install(FILES ${project_headers} DESTINATION include/harfbuzz)
+endif ()
+
+if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
+  install(TARGETS harfbuzz
+    ARCHIVE DESTINATION lib
+    LIBRARY DESTINATION lib
+    RUNTIME DESTINATION bin
+    )
+endif ()
+##
\ No newline at end of file
diff --git a/Makefile.am b/Makefile.am
index 8dc8a4b9..1d8f2e7c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -11,6 +11,7 @@ EXTRA_DIST = \
 	harfbuzz.doap \
 	README.python \
 	BUILD.md \
+	CMakeLists.txt \
 	$(NULL)
 
 MAINTAINERCLEANFILES = \
diff --git a/appveyor.yml b/appveyor.yml
index a2867ca4..05a371a6 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -2,22 +2,35 @@ platform: x64
 
 environment:
   matrix:
-    - compiler: msvc
-      ARCH: amd64
-      VCPKG_ARCH: x64-windows
-      CFG: release
-    - compiler: msvc
-      ARCH: x86
-      VCPKG_ARCH: x86-windows
-      CFG: release
-    - compiler: msvc
+    - compiler: cmake
+      generator: Visual Studio 14
+      platform: Win32
+      configuration: Debug
+    - compiler: cmake
+      generator: Visual Studio 14 Win64
+      platform: x64
+      configuration: Debug
+    - compiler: cmake
+      generator: Visual Studio 14 ARM
+      platform: ARM
+      configuration: Debug
+
+    - compiler: nmake
       ARCH: amd64
       VCPKG_ARCH: x64-windows
       CFG: debug
-    - compiler: msvc
+    - compiler: nmake
       ARCH: x86
       VCPKG_ARCH: x86-windows
       CFG: debug
+#    - compiler: nmake
+#      ARCH: amd64
+#      VCPKG_ARCH: x64-windows
+#      CFG: release
+#    - compiler: nmake
+#      ARCH: x86
+#      VCPKG_ARCH: x86-windows
+#      CFG: release
 
     - compiler: msys2
       MINGW_PREFIX: /c/msys2/mingw64/
@@ -31,19 +44,25 @@ environment:
 install:
   - C:\msys64\usr\bin\bash -lc "pacman --noconfirm -S mingw-w64-x86_64-ragel"
 
-  - 'if "%compiler%"=="msvc" call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %ARCH%'
-#  - 'if "%compiler%"=="msvc" git clone https://github.com/Microsoft/vcpkg'
-#  - 'if "%compiler%"=="msvc" cd vcpkg'
-#  - 'if "%compiler%"=="msvc" powershell -exec bypass scripts\bootstrap.ps1'
-#  - 'if "%compiler%"=="msvc" vcpkg install freetype:%VCPKG_ARCH%'
-#  - 'if "%compiler%"=="msvc" copy installed\%VCPKG_ARCH%\debug\lib\freetyped.lib installed\%VCPKG_ARCH%\lib'
-#  - 'if "%compiler%"=="msvc" cd ..'
+  - 'if "%compiler%"=="nmake" call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %ARCH%'
+#  - 'if "%compiler%"=="nmake" git clone https://github.com/Microsoft/vcpkg'
+#  - 'if "%compiler%"=="nmake" cd vcpkg'
+#  - 'if "%compiler%"=="nmake" powershell -exec bypass scripts\bootstrap.ps1'
+#  - 'if "%compiler%"=="nmake" vcpkg install freetype:%VCPKG_ARCH%'
+#  - 'if "%compiler%"=="nmake" copy installed\%VCPKG_ARCH%\debug\lib\freetyped.lib installed\%VCPKG_ARCH%\lib'
+#  - 'if "%compiler%"=="nmake" cd ..'
 
 build_script:
-  - 'if "%compiler%"=="msvc" C:\msys64\usr\bin\bash -lc "cd $APPVEYOR_BUILD_FOLDER; PATH=$PATH:/mingw64/bin:/mingw32/bin; ./autogen.sh; make distdir"'
-  - 'if "%compiler%"=="msvc" cd harfbuzz-*\win32'
-  - 'if "%compiler%"=="msvc" nmake /f Makefile.vc CFG=%CFG% UNISCRIBE=1 DIRECTWRITE=1' # FREETYPE=1 FREETYPE_DIR=..\..\vcpkg\installed\%VCPKG_ARCH%\include ADDITIONAL_LIB_DIR=..\..\vcpkg\installed\%VCPKG_ARCH%\lib'
-  - 'if "%compiler%"=="msvc" nmake /f Makefile.vc CFG=%CFG% UNISCRIBE=1 DIRECTWRITE=1 install' # FREETYPE=1 install'
+  - 'if "%compiler%"=="cmake" md build'
+  - 'if "%compiler%"=="cmake" cd build'
+  - 'if "%compiler%"=="cmake" set PATH=%PATH%;C:\Program Files (x86)\MSBuild\14.0\Bin;c:\msys64\mingw64\bin' # msys2 is added just for having "ragel" on PATH
+  - 'if "%compiler%"=="cmake" cmake -DHB_HAVE_UNISCRIBE=ON -DHB_HAVE_DIRECTWRITE=ON -G "%generator%" ../'
+  - 'if "%compiler%"=="cmake" msbuild harfbuzz.sln /p:Configuration=%configuration% /p:Platform=%platform%'
+
+  - 'if "%compiler%"=="nmake" C:\msys64\usr\bin\bash -lc "cd $APPVEYOR_BUILD_FOLDER; PATH=$PATH:/mingw64/bin:/mingw32/bin; ./autogen.sh; make distdir"'
+  - 'if "%compiler%"=="nmake" cd harfbuzz-*\win32'
+  - 'if "%compiler%"=="nmake" nmake /f Makefile.vc CFG=%CFG% UNISCRIBE=1 DIRECTWRITE=1' # FREETYPE=1 FREETYPE_DIR=..\..\vcpkg\installed\%VCPKG_ARCH%\include ADDITIONAL_LIB_DIR=..\..\vcpkg\installed\%VCPKG_ARCH%\lib'
+  - 'if "%compiler%"=="nmake" nmake /f Makefile.vc CFG=%CFG% UNISCRIBE=1 DIRECTWRITE=1 install' # FREETYPE=1 install'
 
   - 'if "%compiler%"=="msys2" C:\msys64\usr\bin\bash -lc "pacman --noconfirm -S mingw-w64-$MSYS2_ARCH-{freetype,cairo,icu,gettext,gobject-introspection,gcc,gcc-libs,glib2,graphite2,pkg-config}"'
   - 'if "%compiler%"=="msys2" C:\msys64\usr\bin\bash -lc "cd $APPVEYOR_BUILD_FOLDER; PATH=$PATH:/mingw64/bin:/mingw32/bin; ./autogen.sh --with-uniscribe --with-freetype --with-glib --with-gobject --with-cairo --with-icu --with-graphite2 --build=%MINGW_CHOST% --host=%MINGW_CHOST% --prefix=%MINGW_PREFIX%; make; make check"'


More information about the HarfBuzz mailing list