CMakeLists.txt 29.1 KB
Newer Older
E
ebraminio 已提交
1 2 3
cmake_minimum_required(VERSION 2.8.0)
project(harfbuzz)

K
Khaled Hosny 已提交
4
enable_testing()
5 6 7

## Limit framework build to Xcode generator
if (BUILD_FRAMEWORK)
8 9
  # for a framework build on macOS, use:
  # cmake -DBUILD_FRAMEWORK=ON -Bbuild -H. -GXcode && cmake --build build
10 11 12 13
  if (NOT "${CMAKE_GENERATOR}" STREQUAL "Xcode")
    message(FATAL_ERROR
      "You should use Xcode generator with BUILD_FRAMEWORK enabled")
  endif ()
14 15 16
  set (CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD_32_64_BIT)")
  set (CMAKE_MACOSX_RPATH ON)
  set (BUILD_SHARED_LIBS ON)
17 18 19
endif ()


E
Ebrahim Byagowi 已提交
20 21
## Disallow in-source builds, as CMake generated make files can collide with autotools ones
if (NOT MSVC AND "${PROJECT_BINARY_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}")
E
ebraminio 已提交
22 23 24 25 26 27 28 29 30 31 32
  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 ()
E
Ebrahim Byagowi 已提交
33

E
ebraminio 已提交
34 35

## HarfBuzz build configurations
36 37
option(HB_HAVE_FREETYPE "Enable freetype interop helpers" OFF)
option(HB_HAVE_GRAPHITE2 "Enable Graphite2 complementary shaper" OFF)
E
ebraminio 已提交
38
option(HB_BUILTIN_UCDN "Use HarfBuzz provided UCDN" ON)
39 40
option(HB_HAVE_GLIB "Enable glib unicode functions" OFF)
option(HB_HAVE_ICU "Enable icu unicode functions" OFF)
E
ebraminio 已提交
41 42
if (APPLE)
  option(HB_HAVE_CORETEXT "Enable CoreText shaper backend on macOS" ON)
43
  set (CMAKE_MACOSX_RPATH ON)
E
ebraminio 已提交
44 45 46
endif ()
if (WIN32)
  option(HB_HAVE_UNISCRIBE "Enable Uniscribe shaper backend on Windows" OFF)
C
Chun-wei Fan 已提交
47
  option(HB_HAVE_DIRECTWRITE "Enable DirectWrite shaper backend on Windows" OFF)
E
ebraminio 已提交
48
endif ()
49 50
option(HB_BUILD_UTILS "Build harfbuzz utils, needs cairo, freetype, and glib properly be installed" OFF)
if (HB_BUILD_UTILS)
51 52
  set (HB_HAVE_GLIB ON)
  set (HB_HAVE_FREETYPE ON)
53
endif ()
E
ebraminio 已提交
54

55 56
option(HB_HAVE_GOBJECT "Enable GObject Bindings" OFF)
if (HB_HAVE_GOBJECT)
57
  set (HB_HAVE_GLIB ON)
58 59
endif ()

60 61
option(HB_HAVE_INTROSPECTION "Enable building introspection (.gir/.typelib) files" OFF)
if (HB_HAVE_INTROSPECTION)
62 63
  set (HB_HAVE_GOBJECT ON)
  set (HB_HAVE_GLIB ON)
64 65
endif ()

66
option(HB_DISABLE_TEST_PROGS OFF "Do not build some of the test programs, useful for continuous builds")
E
Ebrahim Byagowi 已提交
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
option(HB_CHECK OFF "Do a configuration suitable for testing (shared library and enable all options)")
if (HB_CHECK)
  set (BUILD_SHARED_LIBS ON)
  set (HB_BUILD_UTILS ON)
  set (HB_BUILTIN_UCDN ON)
  set (HB_HAVE_ICU)
  set (HB_HAVE_GLIB ON)
  #set (HB_HAVE_GOBJECT ON)
  #set (HB_HAVE_INTROSPECTION ON)
  set (HB_HAVE_FREETYPE ON)
  set (HB_HAVE_GRAPHITE2 ON)
  if (WIN32)
    set (HB_HAVE_UNISCRIBE ON)
    set (HB_HAVE_DIRECTWRITE ON)
  elseif (APPLE)
    set (HB_HAVE_CORETEXT ON)
  endif ()
endif ()

E
ebraminio 已提交
86
include_directories(AFTER
87
  ${PROJECT_SOURCE_DIR}/src
E
ebraminio 已提交
88
  ${PROJECT_BINARY_DIR}/src
E
Ebrahim Byagowi 已提交
89
)
E
ebraminio 已提交
90 91

add_definitions(-DHAVE_OT)
C
Chun-wei Fan 已提交
92
add_definitions(-DHAVE_FALLBACK)
E
ebraminio 已提交
93

94

E
Ebrahim Byagowi 已提交
95
## Functions and headers
96 97 98 99
include (CheckFunctionExists)
include (CheckIncludeFile)
macro (check_funcs) # Similar to AC_CHECK_FUNCS of autotools
  foreach (func_name ${ARGN})
100 101 102
    string(TOUPPER ${func_name} definiton_to_add)
    check_function_exists(${func_name} HAVE_${definiton_to_add})
    if (${HAVE_${definiton_to_add}})
103 104 105 106
      add_definitions(-DHAVE_${definiton_to_add})
    endif ()
  endforeach ()
endmacro ()
E
Ebrahim Byagowi 已提交
107 108 109 110 111 112 113 114
check_funcs(atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l)
check_include_file(unistd.h HAVE_UNISTD_H)
if (${HAVE_UNISTD_H})
  add_definitions(-DHAVE_UNISTD_H)
endif ()
check_include_file(sys/mman.h HAVE_SYS_MMAN_H)
if (${HAVE_SYS_MMAN_H})
  add_definitions(-DHAVE_SYS_MMAN_H)
115 116 117 118 119 120
endif ()
check_include_file(xlocale.h HAVE_XLOCALE_H)
if (${HAVE_XLOCALE_H})
  add_definitions(-DHAVE_XLOCALE_H)
endif ()

E
ebraminio 已提交
121 122 123 124 125

if (MSVC)
  add_definitions(-wd4244 -wd4267 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS)
endif ()

126 127 128 129
if (BUILD_SHARED_LIBS)
  if (WIN32 AND NOT MINGW)
    add_definitions("-DHB_EXTERN=__declspec(dllexport) extern")
  else ()
130
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden")
131
  endif ()
E
ebraminio 已提交
132 133
endif ()

E
Ebrahim Byagowi 已提交
134

135
## Detect if we are running inside a distribution or regular repository folder
136
set (IN_HB_DIST FALSE)
137
if (EXISTS "${PROJECT_SOURCE_DIR}/ChangeLog")
E
ebraminio 已提交
138
  # perhaps we are on dist directory
139
  set (IN_HB_DIST TRUE)
140
  #set (HB_VERSION_H "${PROJECT_SOURCE_DIR}/src/hb-version.h")
E
ebraminio 已提交
141 142
endif ()

E
Ebrahim Byagowi 已提交
143

144
## Extract variables from Makefile files
145 146 147 148 149 150 151 152
function (extract_make_variable variable makefile_source)
  string(REGEX MATCH "${variable} = ([^$]+)\\$" temp ${makefile_source})
  string(REGEX MATCHALL "[^ \n\t\\]+" listVar ${CMAKE_MATCH_1})
  set (${variable} ${listVar} PARENT_SCOPE)
endfunction ()

# http://stackoverflow.com/a/27630120
function (add_prefix_to_list var prefix)
153
  set (listVar "")
154
  foreach (f ${${var}})
155
    list(APPEND listVar "${prefix}${f}")
156
  endforeach ()
157
  set (${var} "${listVar}" PARENT_SCOPE)
158 159
endfunction ()

E
ebraminio 已提交
160 161 162
file(READ ${PROJECT_SOURCE_DIR}/src/Makefile.sources SRCSOURCES)
file(READ ${PROJECT_SOURCE_DIR}/util/Makefile.sources UTILSOURCES)
file(READ ${PROJECT_SOURCE_DIR}/src/hb-ucdn/Makefile.sources UCDNSOURCES)
163

164 165 166 167 168 169 170 171 172 173 174
extract_make_variable(HB_BASE_sources ${SRCSOURCES})
add_prefix_to_list(HB_BASE_sources "${PROJECT_SOURCE_DIR}/src/")
extract_make_variable(HB_BASE_headers ${SRCSOURCES})
add_prefix_to_list(HB_BASE_headers "${PROJECT_SOURCE_DIR}/src/")
extract_make_variable(HB_FALLBACK_sources ${SRCSOURCES})
add_prefix_to_list(HB_FALLBACK_sources "${PROJECT_SOURCE_DIR}/src/")
extract_make_variable(HB_OT_sources ${SRCSOURCES})
add_prefix_to_list(HB_OT_sources "${PROJECT_SOURCE_DIR}/src/")
extract_make_variable(HB_OT_headers ${SRCSOURCES})
add_prefix_to_list(HB_OT_headers "${PROJECT_SOURCE_DIR}/src/")

175 176 177 178 179 180
extract_make_variable(HB_SUBSET_sources ${SRCSOURCES})
add_prefix_to_list(HB_SUBSET_sources "${PROJECT_SOURCE_DIR}/src/")

extract_make_variable(HB_SUBSET_headers ${SRCSOURCES})
add_prefix_to_list(HB_SUBSET_headers "${PROJECT_SOURCE_DIR}/src/")

181 182
extract_make_variable(HB_BASE_RAGEL_GENERATED_sources ${SRCSOURCES})
extract_make_variable(HB_OT_RAGEL_GENERATED_sources ${SRCSOURCES})
183
#if (IN_HB_DIST)
184 185
  add_prefix_to_list(HB_BASE_RAGEL_GENERATED_sources "${PROJECT_SOURCE_DIR}/src/")
  add_prefix_to_list(HB_OT_RAGEL_GENERATED_sources "${PROJECT_SOURCE_DIR}/src/")
186 187 188 189
#else ()
#  add_prefix_to_list(HB_BASE_RAGEL_GENERATED_sources "${PROJECT_BINARY_DIR}/src/")
#  add_prefix_to_list(HB_OT_RAGEL_GENERATED_sources "${PROJECT_BINARY_DIR}/src/")
#endif ()
190

191 192 193 194
extract_make_variable(HB_VIEW_sources ${UTILSOURCES})
add_prefix_to_list(HB_VIEW_sources "${PROJECT_SOURCE_DIR}/util/")
extract_make_variable(HB_SHAPE_sources ${UTILSOURCES})
add_prefix_to_list(HB_SHAPE_sources "${PROJECT_SOURCE_DIR}/util/")
195 196
extract_make_variable(HB_SUBSET_CLI_sources ${UTILSOURCES})
add_prefix_to_list(HB_SUBSET_CLI_sources "${PROJECT_SOURCE_DIR}/util/")
197 198 199 200 201
extract_make_variable(HB_OT_SHAPE_CLOSURE_sources ${UTILSOURCES})
add_prefix_to_list(HB_OT_SHAPE_CLOSURE_sources "${PROJECT_SOURCE_DIR}/util/")

extract_make_variable(LIBHB_UCDN_sources ${UCDNSOURCES})
add_prefix_to_list(LIBHB_UCDN_sources "${PROJECT_SOURCE_DIR}/src/hb-ucdn/")
E
ebraminio 已提交
202

203

204 205
file(READ configure.ac CONFIGUREAC)
string(REGEX MATCH "\\[(([0-9]+)\\.([0-9]+)\\.([0-9]+))\\]" HB_VERSION_MATCH ${CONFIGUREAC})
206 207 208 209
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})
E
Ebrahim Byagowi 已提交
210

211

212
## Define ragel tasks
E
ebraminio 已提交
213
if (NOT IN_HB_DIST)
214
  find_program(RAGEL "ragel" CMAKE_FIND_ROOT_PATH_BOTH)
E
ebraminio 已提交
215 216 217

  if (RAGEL)
    message(STATUS "ragel found at: ${RAGEL}")
218
  else ()
219
    message(FATAL_ERROR "ragel not found, get it here -- http://www.complang.org/ragel/ or, use harfbuzz releases https://github.com/harfbuzz/harfbuzz/releases")
220
  endif ()
E
ebraminio 已提交
221

222 223
  foreach (ragel_output IN ITEMS ${HB_BASE_RAGEL_GENERATED_sources} ${HB_OT_RAGEL_GENERATED_sources})
    string(REGEX MATCH "([^/]+)\\.hh" temp ${ragel_output})
224
    set (target_name ${CMAKE_MATCH_1})
225 226 227
    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
228
    )
229 230
    add_custom_target(harfbuzz_${target_name} DEPENDS ${PROJECT_BINARY_DIR}/src/${target_name})
  endforeach ()
E
ebraminio 已提交
231 232

  mark_as_advanced(RAGEL)
233
endif ()
E
Ebrahim Byagowi 已提交
234

E
ebraminio 已提交
235

236
## Generate hb-version.h
237 238 239 240 241 242 243 244 245 246 247
#if (NOT IN_HB_DIST)
#  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 ()
E
ebraminio 已提交
248

249

250
## Define sources and headers of the project
251
set (project_sources
252 253
  ${HB_BASE_sources}
  ${HB_BASE_RAGEL_GENERATED_sources}
E
ebraminio 已提交
254

C
Chun-wei Fan 已提交
255
  ${HB_FALLBACK_sources}
256
  ${HB_OT_sources}
B
Behdad Esfahbod 已提交
257
  ${HB_OT_RAGEL_GENERATED_sources}
258
)
259

260
set (subset_project_sources
261
  ${HB_SUBSET_sources}
262
)
E
ebraminio 已提交
263

264
set (project_extra_sources)
265

266
set (project_headers
267
  #${HB_VERSION_H}
E
ebraminio 已提交
268 269 270

  ${HB_BASE_headers}
  ${HB_OT_headers}
271
)
E
ebraminio 已提交
272

273 274 275 276
set (subset_project_headers
  ${HB_SUBSET_headers}
)

E
Ebrahim Byagowi 已提交
277 278

## Find and include needed header folders and libraries
E
ebraminio 已提交
279
if (HB_HAVE_FREETYPE)
280
  include (FindFreetype)
281 282
  if (NOT FREETYPE_FOUND)
    message(FATAL_ERROR "HB_HAVE_FREETYPE was set, but we failed to find it. Maybe add a CMAKE_PREFIX_PATH= to your Freetype2 install prefix")
283
  endif ()
E
ebraminio 已提交
284

285 286
  list(APPEND THIRD_PARTY_LIBS ${FREETYPE_LIBRARIES})
  include_directories(AFTER ${FREETYPE_INCLUDE_DIRS})
287
  add_definitions(-DHAVE_FREETYPE=1)
E
ebraminio 已提交
288

289 290
  list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-ft.cc)
  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-ft.h)
291

292
  # So check_funcs can find its headers
293 294
  set (CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${FREETYPE_INCLUDE_DIRS})
  set (CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${FREETYPE_LIBRARIES})
295

296
  check_funcs(FT_Get_Var_Blend_Coordinates FT_Set_Var_Blend_Coordinates FT_Done_MM_Var)
E
ebraminio 已提交
297 298
endif ()

299 300 301 302 303 304 305 306 307 308 309 310
if (HB_HAVE_GRAPHITE2)
  add_definitions(-DHAVE_GRAPHITE2)

  find_path(GRAPHITE2_INCLUDE_DIR graphite2/Font.h)
  find_library(GRAPHITE2_LIBRARY graphite2)

  include_directories(${GRAPHITE2_INCLUDE_DIR})

  list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-graphite2.cc)
  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-graphite2.h)

  list(APPEND THIRD_PARTY_LIBS ${GRAPHITE2_LIBRARY})
E
ebraminio 已提交
311 312

  mark_as_advanced(GRAPHITE2_INCLUDE_DIR GRAPHITE2_LIBRARY)
313 314
endif ()

E
ebraminio 已提交
315 316 317 318
if (HB_BUILTIN_UCDN)
  include_directories(src/hb-ucdn)
  add_definitions(-DHAVE_UCDN)

319 320
  list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-ucdn.cc)
  list(APPEND project_extra_sources ${LIBHB_UCDN_sources})
321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339
endif ()

if (HB_HAVE_GLIB)
  add_definitions(-DHAVE_GLIB)

  # https://github.com/WebKit/webkit/blob/master/Source/cmake/FindGLIB.cmake
  find_package(PkgConfig)
  pkg_check_modules(PC_GLIB QUIET glib-2.0)

  find_library(GLIB_LIBRARIES NAMES glib-2.0 HINTS ${PC_GLIB_LIBDIR} ${PC_GLIB_LIBRARY_DIRS})
  find_path(GLIBCONFIG_INCLUDE_DIR NAMES glibconfig.h HINTS ${PC_LIBDIR} ${PC_LIBRARY_DIRS} ${PC_GLIB_INCLUDEDIR} ${PC_GLIB_INCLUDE_DIRS} PATH_SUFFIXES glib-2.0/include)
  find_path(GLIB_INCLUDE_DIR NAMES glib.h HINTS ${PC_GLIB_INCLUDEDIR} ${PC_GLIB_INCLUDE_DIRS} PATH_SUFFIXES glib-2.0)

  include_directories(${GLIBCONFIG_INCLUDE_DIR} ${GLIB_INCLUDE_DIR})

  list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-glib.cc)
  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-glib.h)

  list(APPEND THIRD_PARTY_LIBS ${GLIB_LIBRARIES})
E
ebraminio 已提交
340 341

  mark_as_advanced(GLIB_LIBRARIES GLIBCONFIG_INCLUDE_DIR GLIB_INCLUDE_DIR)
E
ebraminio 已提交
342 343
endif ()

344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359
if (HB_HAVE_ICU)
  add_definitions(-DHAVE_ICU)

  # https://github.com/WebKit/webkit/blob/master/Source/cmake/FindICU.cmake
  find_package(PkgConfig)
  pkg_check_modules(PC_ICU QUIET icu-uc)

  find_path(ICU_INCLUDE_DIR NAMES unicode/utypes.h HINTS ${PC_ICU_INCLUDE_DIRS} ${PC_ICU_INCLUDEDIR})
  find_library(ICU_LIBRARY NAMES libicuuc cygicuuc cygicuuc32 icuuc HINTS ${PC_ICU_LIBRARY_DIRS} ${PC_ICU_LIBDIR})

  include_directories(${ICU_INCLUDE_DIR})

  list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-icu.cc)
  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-icu.h)

  list(APPEND THIRD_PARTY_LIBS ${ICU_LIBRARY})
E
ebraminio 已提交
360 361

  mark_as_advanced(ICU_INCLUDE_DIR ICU_LIBRARY)
362 363
endif ()

E
ebraminio 已提交
364 365 366 367
if (APPLE AND HB_HAVE_CORETEXT)
  # Apple Advanced Typography
  add_definitions(-DHAVE_CORETEXT)

368 369
  list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-coretext.cc)
  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-coretext.h)
E
ebraminio 已提交
370 371 372

  find_library(APPLICATION_SERVICES_FRAMEWORK ApplicationServices)
  if (APPLICATION_SERVICES_FRAMEWORK)
373
    list(APPEND THIRD_PARTY_LIBS ${APPLICATION_SERVICES_FRAMEWORK})
E
ebraminio 已提交
374
  endif (APPLICATION_SERVICES_FRAMEWORK)
375

E
ebraminio 已提交
376
  mark_as_advanced(APPLICATION_SERVICES_FRAMEWORK)
E
ebraminio 已提交
377 378 379 380 381
endif ()

if (WIN32 AND HB_HAVE_UNISCRIBE)
  add_definitions(-DHAVE_UNISCRIBE)

382 383
  list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-uniscribe.cc)
  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-uniscribe.h)
E
ebraminio 已提交
384

385
  list(APPEND THIRD_PARTY_LIBS usp10 gdi32 rpcrt4)
E
ebraminio 已提交
386 387 388 389 390
endif ()

if (WIN32 AND HB_HAVE_DIRECTWRITE)
  add_definitions(-DHAVE_DIRECTWRITE)

391 392
  list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-directwrite.cc)
  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-directwrite.h)
E
ebraminio 已提交
393

394
  list(APPEND THIRD_PARTY_LIBS dwrite rpcrt4)
E
ebraminio 已提交
395
endif ()
E
Ebrahim Byagowi 已提交
396

397
if (HB_HAVE_GOBJECT)
398 399
  include (FindPythonInterp)
  include (FindPerl)
400

401 402 403 404 405
  # Use the hints from glib-2.0.pc to find glib-mkenums
  find_package(PkgConfig)
  pkg_check_modules(PC_GLIB QUIET glib-2.0)
  find_program(GLIB_MKENUMS glib-mkenums
    HINTS ${PC_glib_mkenums}
406 407
  )
  set (GLIB_MKENUMS_CMD)
408 409 410 411 412 413 414 415 416

  if (WIN32 AND NOT MINGW)
    # In Visual Studio builds, shebang lines are not supported
    # in the standard cmd.exe shell that we use, so we need to
    # first determine whether glib-mkenums is a Python or PERL
    # script
    execute_process(COMMAND "${PYTHON_EXECUTABLE}" "${GLIB_MKENUMS}" --version
      RESULT_VARIABLE GLIB_MKENUMS_PYTHON
      OUTPUT_QUIET ERROR_QUIET
417
    )
418 419
    if (GLIB_MKENUMS_PYTHON EQUAL 0)
      message("${GLIB_MKENUMS} is a Python script.")
420
      set (GLIB_MKENUMS_CMD "${PYTHON_EXECUTABLE}" "${GLIB_MKENUMS}")
421 422 423 424
    else ()
      execute_process(COMMAND "${PERL_EXECUTABLE}" "${GLIB_MKENUMS}" --version
        RESULT_VARIABLE GLIB_MKENUMS_PERL
        OUTPUT_QUIET ERROR_QUIET
425
      )
426 427
      if (GLIB_MKENUMS_PERL EQUAL 0)
        message("${GLIB_MKENUMS} is a PERL script.")
428
        set (GLIB_MKENUMS_CMD "${PERL_EXECUTABLE}" "${GLIB_MKENUMS}")
429 430 431 432
      endif ()
      if (NOT GLIB_MKENUMS_PERL EQUAL 0 AND NOT GLIB_MKENUMS_PYTHON EQUAL 0)
        message(FATAL_ERROR "Unable to determine type of glib-mkenums script")
      endif ()
433
    endif ()
434
  else ()
435
    set (GLIB_MKENUMS_CMD "${GLIB_MKENUMS}")
436 437 438
  endif ()
  if (NOT GLIB_MKENUMS_CMD)
    message(FATAL_ERROR "HB_HAVE_GOBJECT was set, but we failed to find glib-mkenums, which is required")
439
  endif ()
440 441 442 443 444 445 446 447 448 449 450 451

  pkg_check_modules(PC_GOBJECT QUIET gobject-2.0)

  find_library(GOBJECT_LIBRARIES NAMES gobject-2.0 HINTS ${PC_GLIB_LIBDIR} ${PC_GLIB_LIBRARY_DIRS})
  find_path(GOBJECT_INCLUDE_DIR NAMES glib-object.h HINTS ${PC_GLIB_INCLUDEDIR} ${PC_GLIB_INCLUDE_DIRS} PATH_SUFFIXES glib-2.0)

  include_directories(${GOBJECTCONFIG_INCLUDE_DIR} ${GOBJECT_INCLUDE_DIR})
  mark_as_advanced(GOBJECT_LIBRARIES GOBJECT_INCLUDE_DIR)

  list(APPEND hb_gobject_sources ${PROJECT_SOURCE_DIR}/src/hb-gobject-structs.cc)
  list(APPEND hb_gobject_gen_sources
    ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc
452
  )
453 454
  list(APPEND hb_gobject_structs_headers
    ${PROJECT_SOURCE_DIR}/src/hb-gobject-structs.h
455
  )
456 457
  list(APPEND hb_gobject_headers
    ${PROJECT_SOURCE_DIR}/src/hb-gobject.h
458
    ${hb_gobject_structs_headers}
459
  )
460 461
  list(APPEND hb_gobject_gen_headers
    ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h
462
  )
463

464
  add_custom_command(
465 466 467 468 469
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h
    COMMAND ${GLIB_MKENUMS_CMD}
      --template=${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.h.tmpl
      --identifier-prefix hb_
      --symbol-prefix hb_gobject
470
      ${hb_gobject_structs_headers}
471 472 473 474 475 476 477 478 479
      ${project_headers}
      > ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h.tmp
    COMMAND "${CMAKE_COMMAND}"
      "-DENUM_INPUT_SRC=${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h.tmp"
      "-DENUM_OUTPUT_SRC=${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h"
      -P ${PROJECT_SOURCE_DIR}/replace-enum-strings.cmake
    DEPENDS ${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.h.tmpl
      ${hb_gobject_header}
      ${project_headers}
480
  )
481

482
  add_custom_command(
483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc
    COMMAND ${GLIB_MKENUMS_CMD}
      --template=${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.cc.tmpl
      --identifier-prefix hb_
      --symbol-prefix hb_gobject
      ${hb_gobject_header}
      ${project_headers}
      > ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc.tmp
    COMMAND "${CMAKE_COMMAND}"
      "-DENUM_INPUT_SRC=${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc.tmp"
      "-DENUM_OUTPUT_SRC=${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc"
      -P ${PROJECT_SOURCE_DIR}/replace-enum-strings.cmake
    DEPENDS ${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.cc.tmpl
      ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h
      ${hb_gobject_header}
      ${project_headers}
499
  )
500
endif ()
E
ebraminio 已提交
501

E
Ebrahim Byagowi 已提交
502

503 504 505 506 507 508
## Atomic ops availability detection
file(WRITE "${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives.c"
"		void memory_barrier (void) { __sync_synchronize (); }
		int atomic_add (int *i) { return __sync_fetch_and_add (i, 1); }
		int mutex_trylock (int *m) { return __sync_lock_test_and_set (m, 1); }
		void mutex_unlock (int *m) { __sync_lock_release (m); }
509
		int main () { return 0; }
510 511 512
")
try_compile(HB_HAVE_INTEL_ATOMIC_PRIMITIVES
  ${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives
R
rdb 已提交
513
  ${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives.c)
514 515 516 517 518 519 520 521 522 523 524
if (HB_HAVE_INTEL_ATOMIC_PRIMITIVES)
  add_definitions(-DHAVE_INTEL_ATOMIC_PRIMITIVES)
endif ()

file(WRITE "${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops.c"
"		#include <atomic.h>
		/* This requires Solaris Studio 12.2 or newer: */
		#include <mbarrier.h>
		void memory_barrier (void) { __machine_rw_barrier (); }
		int atomic_add (volatile unsigned *i) { return atomic_add_int_nv (i, 1); }
		void *atomic_ptr_cmpxchg (volatile void **target, void *cmp, void *newval) { return atomic_cas_ptr (target, cmp, newval); }
525
		int main () { return 0; }
526 527 528
")
try_compile(HB_HAVE_SOLARIS_ATOMIC_OPS
  ${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops
R
rdb 已提交
529
  ${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops.c)
E
ebraminio 已提交
530 531
if (HB_HAVE_SOLARIS_ATOMIC_OPS)
  add_definitions(-DHAVE_SOLARIS_ATOMIC_OPS)
532 533
endif ()

E
Ebrahim Byagowi 已提交
534 535

## Define harfbuzz library
536
add_library(harfbuzz ${project_sources} ${project_extra_sources} ${project_headers})
E
ebraminio 已提交
537 538
target_link_libraries(harfbuzz ${THIRD_PARTY_LIBS})

539 540 541 542 543
## Define harfbuzz-subset library
add_library(harfbuzz-subset ${subset_project_sources} ${subset_project_headers})
add_dependencies(harfbuzz-subset harfbuzz)
target_link_libraries(harfbuzz-subset harfbuzz ${THIRD_PARTY_LIBS})

544 545 546 547
if (UNIX OR MINGW)
  # Make symbols link locally
  link_libraries(-Bsymbolic-functions)

548
  if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
549
    # Make sure we don't link to libstdc++
550 551 552 553
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -fno-exceptions")
    set (CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "m") # libm
    set (CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "")
    set_target_properties(harfbuzz PROPERTIES LINKER_LANGUAGE C)
554
    set_target_properties(harfbuzz-subset PROPERTIES LINKER_LANGUAGE C)
555

556
    # No threadsafe statics as we do it ourselves
557
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-threadsafe-statics")
558 559 560
  endif ()
endif ()

561 562 563 564 565 566 567
## Define harfbuzz-gobject library
if (HB_HAVE_GOBJECT)
  add_library(harfbuzz-gobject
    ${hb_gobject_sources}
    ${hb_gobject_gen_sources}
    ${hb_gobject_headers}
    ${hb_gobject_gen_headers}
568
  )
569 570 571 572
  include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}/src)
  add_dependencies(harfbuzz-gobject harfbuzz)
  target_link_libraries(harfbuzz-gobject harfbuzz ${GOBJECT_LIBRARIES} ${THIRD_PARTY_LIBS})
endif ()
E
Ebrahim Byagowi 已提交
573

574 575 576 577
# On Windows, g-ir-scanner requires a DLL build in order for it to work
if (WIN32)
  if (NOT BUILD_SHARED_LIBS)
    message("Building introspection files on Windows requires BUILD_SHARED_LIBS to be enabled.")
578
    set (HB_HAVE_INTROSPECTION OFF)
579 580 581 582 583 584 585 586 587 588
  endif ()
endif ()

if (HB_HAVE_INTROSPECTION)

  find_package(PkgConfig)
  pkg_check_modules(PC_GI QUIET gobject-introspection-1.0)

  find_program(G_IR_SCANNER g-ir-scanner
    HINTS ${PC_g_ir_scanner}
589
  )
590 591 592

  find_program(G_IR_COMPILER g-ir-compiler
    HINTS ${PC_g_ir_compiler}
593
  )
594 595 596 597

  if (WIN32 AND NOT MINGW)
    # Note that since we already enable HB_HAVE_GOBJECT
    # we would already have PYTHON_EXECUTABLE handy
598
    set (G_IR_SCANNER_CMD "${PYTHON_EXECUTABLE}" "${G_IR_SCANNER}")
599
  else ()
600
    set (G_IR_SCANNER_CMD "${G_IR_SCANNER}")
601 602 603 604
  endif ()

  # We need to account for the varying output directories
  # when we build using Visual Studio projects
605
  if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio*")
606 607 608 609 610 611 612
    set (hb_libpath "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>")
  else ()
    set (hb_libpath "$<TARGET_FILE_DIR:harfbuzz-gobject>")
  endif ()

  # Get the CFlags that we used to build HarfBuzz/HarfBuzz-GObject
  set (hb_defines_cflags "")
613
  foreach (hb_cflag ${hb_cflags})
614
    list(APPEND hb_defines_cflags "-D${hb_cflag}")
615
  endforeach (hb_cflag)
616 617 618 619 620 621 622 623 624

  # Get the other dependent libraries we used to build HarfBuzz/HarfBuzz-GObject
  set (extra_libs "")
  foreach (extra_lib ${THIRD_PARTY_LIBS})
    # We don't want the .lib extension here...
    string(REPLACE ".lib" "" extra_lib_stripped "${extra_lib}")
    list(APPEND extra_libs "--extra-library=${extra_lib_stripped}")
  endforeach ()

625
  set (introspected_sources)
626 627 628 629 630 631 632
  foreach (f
    ${project_headers}
    ${project_sources}
    ${hb_gobject_gen_sources}
    ${hb_gobject_gen_headers}
    ${hb_gobject_sources}
    ${hb_gobject_headers}
E
Ebrahim Byagowi 已提交
633
  )
634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651
    if (WIN32)
      # Nasty issue: We need to make drive letters lower case,
      # otherwise g-ir-scanner won't like it and give us a bunch
      # of invalid items and unresolved types...
      STRING(SUBSTRING "${f}" 0 1 drive)
      STRING(SUBSTRING "${f}" 1 -1 path)
      if (drive MATCHES "[A-Z]")
        STRING(TOLOWER ${drive} drive_lower)
        list(APPEND introspected_sources "${drive_lower}${path}")
      else ()
        list(APPEND introspected_sources "${f}")
      endif ()
    else ()
      list(APPEND introspected_sources "${f}")
    endif ()
  endforeach ()

  # Finally, build the introspection files...
652
  add_custom_command(
653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682
    TARGET harfbuzz-gobject
    POST_BUILD
    COMMAND ${G_IR_SCANNER_CMD}
      --warn-all --no-libtool --verbose
      -n hb
      --namespace=HarfBuzz
      --nsversion=0.0
      --identifier-prefix=hb_
      --include GObject-2.0
      --pkg-export=harfbuzz
      --cflags-begin
      -I${PROJECT_SOURCE_DIR}/src
      -I${PROJECT_BINARY_DIR}/src
      ${hb_includedir_cflags}
      ${hb_defines_cflags}
      -DHB_H
      -DHB_H_IN
      -DHB_OT_H
      -DHB_OT_H_IN
      -DHB_GOBJECT_H
      -DHB_GOBJECT_H_IN
      -DHB_EXTERN=
      --cflags-end
      --library=harfbuzz-gobject
      --library=harfbuzz
      -L${hb_libpath}
      ${extra_libs}
      ${introspected_sources}
      -o ${hb_libpath}/HarfBuzz-0.0.gir
    DEPENDS harfbuzz-gobject harfbuzz
683
  )
684

685
  add_custom_command(
686 687 688 689 690 691 692 693
    TARGET harfbuzz-gobject
    POST_BUILD
    COMMAND "${G_IR_COMPILER}"
      --verbose --debug
      --includedir ${CMAKE_CURRENT_BINARY_DIR}
      ${hb_libpath}/HarfBuzz-0.0.gir
      -o ${hb_libpath}/HarfBuzz-0.0.typelib
    DEPENDS ${hb_libpath}/HarfBuzz-0.0.gir harfbuzz-gobject
694
  )
695 696
endif ()

E
Ebrahim Byagowi 已提交
697

698 699
## Additional framework build configs
if (BUILD_FRAMEWORK)
700
  set (CMAKE_MACOSX_RPATH ON)
701 702 703 704 705
  set_target_properties(harfbuzz PROPERTIES
    FRAMEWORK TRUE
    PUBLIC_HEADER "${project_headers}"
    XCODE_ATTRIBUTE_INSTALL_PATH "@rpath"
  )
706 707 708
  set (MACOSX_FRAMEWORK_IDENTIFIER "harfbuzz")
  set (MACOSX_FRAMEWORK_SHORT_VERSION_STRING "${HB_VERSION}")
  set (MACOSX_FRAMEWORK_BUNDLE_VERSION "${HB_VERSION}")
709 710 711
endif ()


E
Ebrahim Byagowi 已提交
712
## Additional harfbuzz build artifacts
713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730
if (HB_BUILD_UTILS)
  # https://github.com/WebKit/webkit/blob/master/Source/cmake/FindCairo.cmake
  find_package(PkgConfig)
  pkg_check_modules(PC_CAIRO QUIET cairo)

  find_path(CAIRO_INCLUDE_DIRS NAMES cairo.h HINTS ${PC_CAIRO_INCLUDEDIR} ${PC_CAIRO_INCLUDE_DIRS} PATH_SUFFIXES cairo)
  find_library(CAIRO_LIBRARIESNAMES cairo HINTS ${PC_CAIRO_LIBDIR} ${PC_CAIRO_LIBRARY_DIRS})

  add_definitions("-DPACKAGE_NAME=\"HarfBuzz\"")
  add_definitions("-DPACKAGE_VERSION=\"${HB_VERSION}\"")
  include_directories(${CAIRO_INCLUDE_DIRS})

  add_executable(hb-view ${HB_VIEW_sources})
  target_link_libraries(hb-view harfbuzz ${CAIRO_LIBRARIESNAMES})

  add_executable(hb-shape ${HB_SHAPE_sources})
  target_link_libraries(hb-shape harfbuzz)

731
  add_executable(hb-subset ${HB_SUBSET_CLI_sources})
732
  target_link_libraries(hb-subset harfbuzz harfbuzz-subset)
733

734 735
  add_executable(hb-ot-shape-closure ${HB_OT_SHAPE_CLOSURE_sources})
  target_link_libraries(hb-ot-shape-closure harfbuzz)
E
ebraminio 已提交
736

E
Ebrahim Byagowi 已提交
737
  mark_as_advanced(CAIRO_INCLUDE_DIRS CAIRO_LIBRARIESNAMES)
738 739
endif ()

E
Ebrahim Byagowi 已提交
740

E
ebraminio 已提交
741
## Install
742
include (GNUInstallDirs)
743

E
ebraminio 已提交
744
if (NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL)
745
  install(FILES ${project_headers} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/harfbuzz)
746
  if (HB_HAVE_GOBJECT)
747
    install(FILES ${hb_gobject_headers} ${hb_gobject_gen_headers} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/harfbuzz)
748
  endif ()
E
ebraminio 已提交
749 750 751 752
endif ()

if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
  install(TARGETS harfbuzz
753 754 755
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
756
    FRAMEWORK DESTINATION Library/Frameworks
757
  )
C
Chun-wei Fan 已提交
758 759
  if (HB_BUILD_UTILS)
    install(TARGETS hb-view
760
      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
C
Chun-wei Fan 已提交
761 762
    )
    install(TARGETS hb-view
763
      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
C
Chun-wei Fan 已提交
764 765 766
    )

    install(TARGETS hb-shape
767
      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
C
Chun-wei Fan 已提交
768 769 770
    )

    install(TARGETS hb-ot-shape-closure
771
      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
C
Chun-wei Fan 已提交
772 773
    )
  endif ()
774 775
  if (HB_HAVE_GOBJECT)
    install(TARGETS harfbuzz-gobject
776 777 778
      ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
      LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
779
    )
780
    if (HB_HAVE_INTROSPECTION)
781
      if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio*")
782 783 784 785 786 787
        set (hb_libpath "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>")
      else ()
        set (hb_libpath "$<TARGET_FILE_DIR:harfbuzz-gobject>")
      endif ()

      install(FILES "${hb_libpath}/HarfBuzz-0.0.gir"
788
        DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/gir-1.0
E
Ebrahim Byagowi 已提交
789
      )
790 791

      install(FILES "${hb_libpath}/HarfBuzz-0.0.typelib"
792 793
        DESTINATION ${CMAKE_INSTALL_LIBDIR}/girepository-1.0
      )
794
    endif ()
795
  endif ()
E
ebraminio 已提交
796
endif ()
K
Khaled Hosny 已提交
797

798 799
if (UNIX AND CMAKE_GENERATOR STREQUAL "Ninja")
  if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
800 801
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcolor-diagnostics")
    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fcolor-diagnostics")
802 803
  endif ()
  if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
804 805
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color")
    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdiagnostics-color")
806 807
  endif ()
endif ()
E
Ebrahim Byagowi 已提交
808

E
Ebrahim Byagowi 已提交
809

810
## src/ executables
811 812 813 814 815 816 817 818 819 820 821 822
if (NOT HB_DISABLE_TEST_PROGS)
  foreach (prog main test test-would-substitute test-size-params test-buffer-serialize hb-ot-tag)
    set (prog_name ${prog})
    if (${prog_name} STREQUAL "test")
      # test can not be used as a valid executable name on cmake, lets special case it
      set (prog_name test-test)
    endif ()
    add_executable(${prog_name} ${PROJECT_SOURCE_DIR}/src/${prog}.cc)
    target_link_libraries(${prog_name} harfbuzz ${THIRD_PARTY_LIBS})
  endforeach ()
  set_target_properties(hb-ot-tag PROPERTIES COMPILE_FLAGS "-DMAIN")
endif ()
823

E
Ebrahim Byagowi 已提交
824
## Tests
825
if (UNIX OR MINGW)
E
Ebrahim Byagowi 已提交
826
  if (BUILD_SHARED_LIBS)
827 828
    # generate harfbuzz.def after build completion
    string(REPLACE ";" " " space_separated_headers "${project_headers}")
829 830 831
    add_custom_command(TARGET harfbuzz POST_BUILD
      COMMAND ${CMAKE_COMMAND} -E env "headers=${space_separated_headers}" python ${PROJECT_SOURCE_DIR}/src/gen-def.py ${PROJECT_BINARY_DIR}/harfbuzz.def
      WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src)
832

833 834 835 836 837
    add_test(NAME check-static-inits.sh
      COMMAND ${PROJECT_SOURCE_DIR}/src/check-static-inits.sh
      WORKING_DIRECTORY ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/harfbuzz.dir/src # ugly hack
    )
    add_test(NAME check-libstdc++.sh COMMAND ${PROJECT_SOURCE_DIR}/src/check-libstdc++.sh)
838
    add_test(NAME check-symbols.sh COMMAND ${PROJECT_SOURCE_DIR}/src/check-symbols.sh)
E
Ebrahim Byagowi 已提交
839

840
    set_tests_properties(
841
      check-static-inits.sh check-libstdc++.sh check-symbols.sh
842 843 844
      PROPERTIES
        ENVIRONMENT "libs=.;srcdir=${PROJECT_SOURCE_DIR}/src"
        SKIP_RETURN_CODE 77)
E
Ebrahim Byagowi 已提交
845 846
  endif ()

847 848 849 850 851 852
  add_test(NAME check-c-linkage-decls.sh COMMAND ./check-c-linkage-decls.sh)
  add_test(NAME check-header-guards.sh COMMAND ./check-header-guards.sh)
  add_test(NAME check-externs.sh COMMAND ./check-externs.sh)
  add_test(NAME check-includes.sh COMMAND ./check-includes.sh)
  set_tests_properties(
    check-c-linkage-decls.sh check-header-guards.sh check-externs.sh check-includes.sh
853 854 855
    PROPERTIES
      WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src
      SKIP_RETURN_CODE 77)
E
Ebrahim Byagowi 已提交
856 857
endif ()

K
Khaled Hosny 已提交
858 859
# Needs to come last so that variables defined above are passed to
# subdirectories.
R
rdb 已提交
860
add_subdirectory(test)