CMakeLists.txt 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. cmake_minimum_required(VERSION 3.10)
  2. project(msdfgen VERSION 1.9 LANGUAGES CXX)
  3. option(MSDFGEN_BUILD_STANDALONE "Build the msdfgen standalone executable" ON)
  4. option(MSDFGEN_USE_OPENMP "Build with OpenMP support for multithreaded code" OFF)
  5. option(MSDFGEN_USE_CPP11 "Build with C++11 enabled" ON)
  6. option(MSDFGEN_USE_SKIA "Build with the Skia library" OFF)
  7. option(MSDFGEN_INSTALL "Generate installation target" ON)
  8. option(FREETYPE_WITH_PNG "Link libpng and zlib because FreeType is configured to require it" OFF)
  9. option(FREETYPE_WITH_HARFBUZZ "Link HarfBuzz because FreeType is configured to require it" OFF)
  10. list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
  11. if(NOT TARGET Freetype::Freetype)
  12. find_package(Freetype REQUIRED)
  13. endif()
  14. file(GLOB_RECURSE msdfgen-core_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
  15. "core/*.h"
  16. "core/*.hpp"
  17. )
  18. file(GLOB_RECURSE msdfgen-core_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
  19. "core/*.cpp"
  20. )
  21. file(GLOB_RECURSE msdfgen-ext_PUBLIC_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
  22. "ext/*.h"
  23. "ext/*.hpp"
  24. )
  25. file(GLOB_RECURSE msdfgen-ext_PRIVATE_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
  26. "include/*.h"
  27. )
  28. file(GLOB_RECURSE msdfgen-ext_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
  29. "ext/*.cpp"
  30. "lib/*.cpp"
  31. )
  32. include(folderize)
  33. folderize_sources(msdfgen-core_HEADERS ${CMAKE_SOURCE_DIR})
  34. folderize_sources(msdfgen-core_SOURCES ${CMAKE_SOURCE_DIR})
  35. folderize_sources(msdfgen-ext_PUBLIC_HEADERS ${CMAKE_SOURCE_DIR})
  36. folderize_sources(msdfgen-ext_PRIVATE_HEADERS ${CMAKE_SOURCE_DIR})
  37. folderize_sources(msdfgen-ext_SOURCES ${CMAKE_SOURCE_DIR})
  38. # Core library
  39. add_library(msdfgen-core ${msdfgen-core_SOURCES} ${msdfgen-core_HEADERS} "./msdfgen.h")
  40. add_library(msdfgen::msdfgen-core ALIAS msdfgen-core)
  41. set_target_properties(msdfgen-core PROPERTIES PUBLIC_HEADER "${msdfgen-core_HEADERS}")
  42. target_include_directories(msdfgen-core INTERFACE
  43. $<INSTALL_INTERFACE:include/msdfgen>
  44. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/>
  45. )
  46. if(MSDFGEN_USE_CPP11)
  47. target_compile_features(msdfgen-core PUBLIC cxx_std_11)
  48. target_compile_definitions(msdfgen-core PUBLIC MSDFGEN_USE_CPP11)
  49. endif()
  50. if(MSDFGEN_USE_OPENMP)
  51. # Note: Clang doesn't support OpenMP by default...
  52. find_package(OpenMP REQUIRED COMPONENTS CXX)
  53. target_link_libraries(msdfgen-core PUBLIC OpenMP::OpenMP_CXX)
  54. target_compile_definitions(msdfgen-core PUBLIC MSDFGEN_USE_OPENMP)
  55. endif()
  56. # Extensions library
  57. add_library(msdfgen-ext ${msdfgen-ext_SOURCES} ${msdfgen-ext_PUBLIC_HEADERS} ${msdfgen-ext_PRIVATE_HEADERS} "./msdfgen-ext.h")
  58. add_library(msdfgen::msdfgen-ext ALIAS msdfgen-ext)
  59. set_target_properties(msdfgen-ext PROPERTIES PUBLIC_HEADER "${msdfgen-ext_PUBLIC_HEADERS}")
  60. target_link_libraries(msdfgen-ext PUBLIC msdfgen::msdfgen-core Freetype::Freetype)
  61. target_include_directories(msdfgen-ext
  62. PUBLIC
  63. $<INSTALL_INTERFACE:include/msdfgen>
  64. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/>
  65. PRIVATE
  66. ${CMAKE_CURRENT_SOURCE_DIR}/include
  67. )
  68. if(FREETYPE_WITH_PNG)
  69. find_package(ZLIB REQUIRED)
  70. find_package(PNG REQUIRED)
  71. target_link_libraries(msdfgen-ext PUBLIC ZLIB::ZLIB PNG::PNG)
  72. endif()
  73. if(FREETYPE_WITH_HARFBUZZ)
  74. # No FindHarfBuzz.cmake available so falling back to CMAKE_LIBRARY_PATH
  75. find_library(FREETYPE_HARFBUZZ_LIB "harfbuzz")
  76. target_link_libraries(msdfgen-ext PUBLIC "${FREETYPE_HARFBUZZ_LIB}")
  77. endif()
  78. if(MSDFGEN_USE_SKIA)
  79. find_package(Skia REQUIRED)
  80. target_link_libraries(msdfgen-ext PUBLIC Skia::Skia)
  81. target_compile_definitions(msdfgen-ext PUBLIC MSDFGEN_USE_SKIA)
  82. endif()
  83. # Standalone executable
  84. if(MSDFGEN_BUILD_STANDALONE)
  85. add_executable(msdfgen main.cpp)
  86. target_compile_definitions(msdfgen PUBLIC MSDFGEN_STANDALONE)
  87. target_link_libraries(msdfgen PUBLIC msdfgen::msdfgen-core msdfgen::msdfgen-ext)
  88. endif()
  89. # Installation
  90. if(MSDFGEN_INSTALL)
  91. include(GNUInstallDirs)
  92. include(CMakePackageConfigHelpers)
  93. set(MSDFGEN_CONFIG_PATH "lib/cmake/msdfgen")
  94. # install tree package config
  95. write_basic_package_version_file(
  96. "${CMAKE_CURRENT_BINARY_DIR}/msdfgenConfigVersion.cmake"
  97. VERSION ${PROJECT_VERSION}
  98. COMPATIBILITY SameMajorVersion
  99. )
  100. configure_package_config_file(
  101. cmake/msdfgenConfig.cmake.in
  102. ${MSDFGEN_CONFIG_PATH}/msdfgenConfig.cmake
  103. INSTALL_DESTINATION ${MSDFGEN_CONFIG_PATH}
  104. NO_CHECK_REQUIRED_COMPONENTS_MACRO
  105. )
  106. # build tree package config
  107. configure_file(
  108. cmake/msdfgenConfig.cmake.in
  109. msdfgenConfig.cmake
  110. @ONLY
  111. )
  112. install(TARGETS msdfgen-core EXPORT msdfgenTargets
  113. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  114. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  115. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  116. FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR}
  117. PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/msdfgen/core
  118. )
  119. install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/msdfgen.h" "${CMAKE_CURRENT_SOURCE_DIR}/msdfgen-ext.h" DESTINATION include/msdfgen)
  120. install(TARGETS msdfgen-ext EXPORT msdfgenTargets
  121. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  122. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  123. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  124. FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR}
  125. PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/msdfgen/ext
  126. )
  127. if(MSDFGEN_BUILD_STANDALONE)
  128. install(TARGETS msdfgen EXPORT msdfgenTargets DESTINATION bin)
  129. endif()
  130. install(
  131. FILES
  132. "${CMAKE_CURRENT_BINARY_DIR}/${MSDFGEN_CONFIG_PATH}/msdfgenConfig.cmake"
  133. "${CMAKE_CURRENT_BINARY_DIR}/msdfgenConfigVersion.cmake"
  134. DESTINATION ${MSDFGEN_CONFIG_PATH}
  135. )
  136. export(
  137. EXPORT msdfgenTargets
  138. NAMESPACE msdfgen::
  139. FILE "${CMAKE_CURRENT_BINARY_DIR}/msdfgenTargets.cmake"
  140. )
  141. install(
  142. EXPORT msdfgenTargets FILE msdfgenTargets.cmake
  143. NAMESPACE msdfgen::
  144. DESTINATION ${MSDFGEN_CONFIG_PATH}
  145. )
  146. endif()