CMakeLists.txt 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028
  1. #===================================
  2. # Build script for RmlUi ===========
  3. #===================================
  4. cmake_minimum_required(VERSION 3.1)
  5. if(APPLE)
  6. # This has to be before most other options so CMake properly handles the
  7. # compiler variables, it MUST bebefore the project() definition
  8. if(IOS_PLATFORM)
  9. set(CMAKE_TOOLCHAIN_FILE CMake/Platform/iOS.cmake)
  10. endif(IOS_PLATFORM)
  11. option(BUILD_UNIVERSAL_BINARIES "Build universal binaries for all architectures supported" ON)
  12. if (NOT CMAKE_OSX_ARCHITECTURES AND BUILD_UNIVERSAL_BINARIES)
  13. if(IOS)
  14. # set the architecture for iOS
  15. if (${IOS_PLATFORM} STREQUAL "OS")
  16. set (IOS_ARCH armv6 armv7 armv7s arm64)
  17. set (CMAKE_OSX_ARCHITECTURES ${IOS_ARCH} CACHE STRING "Build architecture for iOS")
  18. else (${IOS_PLATFORM} STREQUAL "OS")
  19. set (IOS_ARCH x86_64)
  20. set (CMAKE_OSX_ARCHITECTURES ${IOS_ARCH} CACHE STRING "Build architecture for iOS Simulator")
  21. endif (${IOS_PLATFORM} STREQUAL "OS")
  22. else(IOS)
  23. # set the architectures for OS X
  24. set (OSXI_ARCH x86_64)
  25. set (CMAKE_OSX_ARCHITECTURES ${OSXI_ARCH} CACHE STRING "Build architecture for OS X universal binaries")
  26. endif(IOS)
  27. endif (NOT CMAKE_OSX_ARCHITECTURES AND BUILD_UNIVERSAL_BINARIES)
  28. endif(APPLE)
  29. if(COMMAND cmake_policy)
  30. cmake_policy(SET CMP0015 NEW)
  31. endif(COMMAND cmake_policy)
  32. # Enable the use of MACOSX_RPATH by default for CMake v3.0+; this effectively
  33. # allows plug 'n' play functionality, so to speak -- the resulting shared
  34. # library files can simply be copied over into the end-user's application
  35. # bundle or framework bundle. No mucking around with install_name_tool.
  36. #
  37. # See also:
  38. # cmake --help-policy cmp0042
  39. # http://www.kitware.com/blog/home/post/510
  40. if(POLICY CMP0042)
  41. cmake_policy(SET CMP0042 NEW)
  42. endif(POLICY CMP0042)
  43. if (POLICY CMP0072)
  44. cmake_policy (SET CMP0072 NEW)
  45. endif(POLICY CMP0072)
  46. if(POLICY CMP0074)
  47. cmake_policy(SET CMP0074 NEW)
  48. endif(POLICY CMP0074)
  49. project(RmlUi LANGUAGES C CXX VERSION 5.0)
  50. set(RMLUI_VERSION_RELEASE false)
  51. if(RMLUI_VERSION_RELEASE)
  52. set(RMLUI_VERSION_SUFFIX "")
  53. else()
  54. set(RMLUI_VERSION_SUFFIX "-dev")
  55. endif()
  56. set(RMLUI_VERSION_SHORT ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}${RMLUI_VERSION_SUFFIX})
  57. list(APPEND CORE_PRIVATE_DEFS RMLUI_VERSION="${RMLUI_VERSION_SHORT}")
  58. if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
  59. option(BUILD_TESTING "" OFF)
  60. include(CTest)
  61. if(BUILD_TESTING)
  62. set(RMLUI_TESTS_ENABLED ON)
  63. set(VISUAL_TESTS_RML_DIRECTORIES "" CACHE PATH "Specify additional directories containing *.rml test documents for VisualTests. Separate multiple directories by comma.")
  64. set(VISUAL_TESTS_COMPARE_DIRECTORY "" CACHE PATH "Set the input directory for screenshot comparison performed by VisualTests.")
  65. set(VISUAL_TESTS_CAPTURE_DIRECTORY "" CACHE PATH "Set the output directory for screenshots generated by VisualTests.")
  66. endif()
  67. endif()
  68. # paths
  69. include(GNUInstallDirs)
  70. # Search in the 'cmake' directory for additional CMake modules.
  71. list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake;${PROJECT_SOURCE_DIR}/CMake/Modules)
  72. #===================================
  73. # Environment tests ================
  74. #===================================
  75. include(TestForANSIForScope)
  76. include(TestForANSIStreamHeaders)
  77. include(TestForSTDNamespace)
  78. #===================================
  79. # Provide hints as to where depends=
  80. # might be found =
  81. #===================================
  82. if(NOT DEFINED ENV{FREETYPE_DIR})
  83. set(ENV{FREETYPE_DIR} "${PROJECT_SOURCE_DIR}/Dependencies")
  84. endif()
  85. if(NOT DEFINED ENV{LUA_DIR})
  86. set(ENV{LUA_DIR} "${PROJECT_SOURCE_DIR}/Dependencies")
  87. endif()
  88. if(NOT DEFINED ENV{SDL2DIR})
  89. set(ENV{SDL2DIR} "${PROJECT_SOURCE_DIR}/Dependencies")
  90. endif()
  91. if(NOT DEFINED ENV{SDL2_IMAGE_DIR})
  92. set(ENV{SDL2_IMAGE_DIR} "${PROJECT_SOURCE_DIR}/Dependencies")
  93. endif()
  94. if(NOT DEFINED ENV{SFML_ROOT})
  95. set(ENV{SFML_ROOT} "${PROJECT_SOURCE_DIR}/Dependencies")
  96. endif()
  97. if(NOT DEFINED ENV{TRACY_DIR})
  98. set(ENV{TRACY_DIR} "${PROJECT_SOURCE_DIR}/Dependencies")
  99. endif()
  100. if(NOT DEFINED ENV{RLOTTIE_DIR})
  101. set(ENV{RLOTTIE_DIR} "${PROJECT_SOURCE_DIR}/Dependencies/rlottie")
  102. endif()
  103. if(NOT DEFINED ENV{LUNASVG_DIR})
  104. set(ENV{LUNASVG_DIR} "${PROJECT_SOURCE_DIR}/Dependencies/lunasvg")
  105. endif()
  106. #===================================
  107. # Plaform specific global hacks ====
  108. #===================================
  109. if(APPLE)
  110. # Disables naked builtins from AssertMacros.h which
  111. # This prevents naming collisions such as those from the check()
  112. # function macro with LuaType::check
  113. add_definitions(-D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0)
  114. endif(APPLE)
  115. #===================================
  116. # Build options ====================
  117. #===================================
  118. if(NOT CMAKE_BUILD_TYPE)
  119. set(CMAKE_BUILD_TYPE Release CACHE STRING
  120. "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
  121. FORCE)
  122. endif()
  123. if(NOT IOS)
  124. option(BUILD_SHARED_LIBS "Build shared (dynamic) libraries" ON)
  125. endif(NOT IOS)
  126. option(BUILD_LUA_BINDINGS "Build Lua bindings" OFF)
  127. if(APPLE)
  128. option(BUILD_FRAMEWORK "Build Framework bundle for OSX" OFF)
  129. endif()
  130. option(BUILD_SAMPLES "Build samples" OFF)
  131. set(SAMPLES_BACKEND "auto" CACHE STRING "Backend platform and renderer used for the samples.")
  132. set_property(CACHE SAMPLES_BACKEND PROPERTY STRINGS auto Win32_GL2 Win32_VK X11_GL2 SDL_GL2 SDL_GL3 SDL_VK SDL_SDLrenderer SFML_GL2 GLFW_GL2 GLFW_GL3 GLFW_VK)
  133. if(SAMPLES_BACKEND STREQUAL "auto")
  134. if(EMSCRIPTEN)
  135. set(SAMPLES_BACKEND SDL_GL3)
  136. elseif(WIN32)
  137. set(SAMPLES_BACKEND Win32_GL2)
  138. elseif(APPLE)
  139. set(SAMPLES_BACKEND SDL_SDLrenderer)
  140. else()
  141. set(SAMPLES_BACKEND X11_GL2)
  142. endif()
  143. endif()
  144. option(MATRIX_ROW_MAJOR "Use row-major matrices. Column-major matrices are used by default." OFF)
  145. if(APPLE)
  146. if(IOS)
  147. if(BUILD_SHARED_LIBS)
  148. message(FATAL_ERROR "BUILD_SHARED_LIBS must be OFF for iOS builds. iOS does not support shared libraries.")
  149. endif(BUILD_SHARED_LIBS)
  150. endif(IOS)
  151. if(BUILD_FRAMEWORK)
  152. if(NOT "${CMAKE_GENERATOR}" STREQUAL "Xcode")
  153. message(FATAL_ERROR "You should use Xcode generator with BUILD_FRAMEWORK enabled")
  154. endif()
  155. if(NOT BUILD_SHARED_LIBS)
  156. message(FATAL_ERROR "BUILD_SHARED_LIBS must be ON with BUILD_FRAMEWORK enabled")
  157. endif()
  158. endif()
  159. else(APPLE)
  160. if(BUILD_FRAMEWORK)
  161. message(FATAL_ERROR "BUILD_FRAMEWORK is only supported on Mac OS X with the Xcode generator")
  162. endif()
  163. endif(APPLE)
  164. option(NO_FONT_INTERFACE_DEFAULT "Do not include the default font engine in the build. Allows building without the FreeType dependency, but a custom font engine must be created and set." OFF)
  165. if(NO_FONT_INTERFACE_DEFAULT)
  166. list(APPEND CORE_PRIVATE_DEFS RMLUI_NO_FONT_INTERFACE_DEFAULT)
  167. endif()
  168. if(WIN32 AND BUILD_SHARED_LIBS AND BUILD_TESTING)
  169. message(FATAL_ERROR "-- The RmlUi testing framework cannot be built when using shared libraries on Windows. Please disable either BUILD_SHARED_LIBS or BUILD_TESTING.")
  170. endif()
  171. if(EMSCRIPTEN AND BUILD_SHARED_LIBS)
  172. message(FATAL_ERROR "-- Dynamic libraries not supported when using Emscripten. Please disable BUILD_SHARED_LIBS.")
  173. endif()
  174. if(NOT BUILD_SHARED_LIBS)
  175. list(APPEND CORE_PUBLIC_DEFS -DRMLUI_STATIC_LIB)
  176. message("-- Building static libraries. Make sure to #define RMLUI_STATIC_LIB before including RmlUi in your project.")
  177. endif()
  178. option(NO_THIRDPARTY_CONTAINERS "Only use standard library containers." OFF)
  179. if( NO_THIRDPARTY_CONTAINERS )
  180. list(APPEND CORE_PUBLIC_DEFS -DRMLUI_NO_THIRDPARTY_CONTAINERS)
  181. message("-- No third-party containers will be used: Make sure to #define RMLUI_NO_THIRDPARTY_CONTAINERS before including RmlUi in your project.")
  182. endif()
  183. option(CUSTOM_CONFIGURATION "Customize RmlUi configuration files for overriding the default configuration and types." OFF)
  184. set(CUSTOM_CONFIGURATION_FILE "" CACHE STRING "Custom configuration file to be included in place of <RmlUi/Config/Config.h>.")
  185. if( CUSTOM_CONFIGURATION AND CUSTOM_CONFIGURATION_FILE )
  186. list(APPEND CORE_PUBLIC_DEFS -DRMLUI_CUSTOM_CONFIGURATION_FILE="${CUSTOM_CONFIGURATION_FILE}")
  187. message("-- Including ${CUSTOM_CONFIGURATION_FILE} instead of <RmlUi/Config/Config.h>")
  188. endif ()
  189. set(CUSTOM_INCLUDE_DIRS "" CACHE STRING "Extra include directories (use with CUSTOM_CONFIGURATION_FILE).")
  190. if( CUSTOM_CONFIGURATION AND CUSTOM_INCLUDE_DIRS )
  191. include_directories(${CUSTOM_INCLUDE_DIRS})
  192. endif ()
  193. set(CUSTOM_LINK_LIBRARIES "" CACHE STRING "Extra link libraries (use with CUSTOM_CONFIGURATION_FILE).")
  194. if( CUSTOM_CONFIGURATION )
  195. mark_as_advanced( CLEAR CUSTOM_CONFIGURATION_FILE CUSTOM_INCLUDE_DIRS CUSTOM_LINK_LIBRARIES )
  196. else()
  197. mark_as_advanced( FORCE CUSTOM_CONFIGURATION_FILE CUSTOM_INCLUDE_DIRS CUSTOM_LINK_LIBRARIES )
  198. if( CUSTOM_CONFIGURATION_FILE OR CUSTOM_INCLUDE_DIRS OR CUSTOM_LINK_LIBRARIES )
  199. message("-- CUSTOM_CONFIGURATION disabled, but custom configuration variables are set. They will have no effect.")
  200. endif()
  201. endif()
  202. option(ENABLE_TRACY_PROFILING "Enable profiling with Tracy. Source files can be placed in Dependencies/tracy." OFF)
  203. if( ENABLE_TRACY_PROFILING )
  204. find_package(Tracy REQUIRED)
  205. include_directories(${TRACY_INCLUDE_DIR})
  206. if( CMAKE_CONFIGURATION_TYPES )
  207. list(APPEND CMAKE_CONFIGURATION_TYPES Tracy)
  208. list(REMOVE_DUPLICATES CMAKE_CONFIGURATION_TYPES)
  209. set(CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE STRING
  210. "Add the configurations that we need"
  211. FORCE)
  212. set(CMAKE_C_FLAGS_TRACY "${CMAKE_CXX_FLAGS_RELEASE} -DRMLUI_ENABLE_PROFILING")
  213. set(CMAKE_CXX_FLAGS_TRACY "${CMAKE_CXX_FLAGS_RELEASE} -DRMLUI_ENABLE_PROFILING")
  214. set(CMAKE_EXE_LINKER_FLAGS_TRACY "${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
  215. set(CMAKE_SHARED_LINKER_FLAGS_TRACY "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}")
  216. message("-- Tracy profiling enabled in configuration 'Tracy'.")
  217. else()
  218. message("-- Tracy profiling enabled.")
  219. list(APPEND CORE_PUBLIC_DEFS -DRMLUI_ENABLE_PROFILING)
  220. endif()
  221. elseif( CMAKE_CONFIGURATION_TYPES )
  222. list(REMOVE_ITEM CMAKE_CONFIGURATION_TYPES Tracy)
  223. endif()
  224. option(ENABLE_LOTTIE_PLUGIN "Enable plugin for Lottie animations. Requires the rlottie library." OFF)
  225. option(ENABLE_SVG_PLUGIN "Enable plugin for SVG images. Requires the lunasvg library." OFF)
  226. option(DISABLE_RTTI_AND_EXCEPTIONS "Build with rtti and exceptions disabled." OFF)
  227. if(DISABLE_RTTI_AND_EXCEPTIONS)
  228. list(APPEND CORE_PUBLIC_DEFS -DRMLUI_USE_CUSTOM_RTTI)
  229. message("-- C++ RTTI and exceptions will be disabled: Make sure to #define RMLUI_USE_CUSTOM_RTTI before including RmlUi in your project.")
  230. endif()
  231. option(ENABLE_PRECOMPILED_HEADERS "Enable precompiled headers" ON)
  232. set(PRECOMPILED_HEADERS_ENABLED OFF)
  233. if (ENABLE_PRECOMPILED_HEADERS AND (CMAKE_VERSION VERSION_LESS 3.16.0))
  234. message("-- Could not enable precompiled headers. Need CMake version 3.16.0 or greater.")
  235. elseif (ENABLE_PRECOMPILED_HEADERS)
  236. set(PRECOMPILED_HEADERS_ENABLED ON)
  237. endif()
  238. option(WARNINGS_AS_ERRORS "Treat compiler warnings as errors." OFF)
  239. mark_as_advanced(WARNINGS_AS_ERRORS)
  240. macro(add_common_target_options NAME)
  241. # C++ language version
  242. if(CMAKE_VERSION VERSION_LESS 3.8.0)
  243. set_target_properties(${NAME} PROPERTIES
  244. CXX_STANDARD 14
  245. CXX_STANDARD_REQUIRED YES
  246. )
  247. else()
  248. target_compile_features(${NAME} PUBLIC cxx_std_14)
  249. endif()
  250. set_target_properties(${NAME} PROPERTIES CXX_EXTENSIONS OFF)
  251. # Compiler warnings
  252. if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU")
  253. target_compile_options(${NAME} PRIVATE -Wall -pedantic -Wextra)
  254. if(WARNINGS_AS_ERRORS)
  255. target_compile_options(${NAME} PRIVATE -Werror)
  256. endif()
  257. elseif(MSVC)
  258. target_compile_options(${NAME} PRIVATE /MP /W4 /w44062 /permissive-)
  259. target_compile_definitions(${NAME} PRIVATE _CRT_SECURE_NO_WARNINGS)
  260. if(WARNINGS_AS_ERRORS)
  261. target_compile_options(${NAME} PRIVATE /WX)
  262. endif()
  263. endif()
  264. endmacro()
  265. #===================================
  266. # Setup paths ======================
  267. #===================================
  268. include_directories(
  269. ${PROJECT_SOURCE_DIR}/Include
  270. )
  271. # Include list of source files
  272. include(FileList)
  273. #===================================
  274. # Find dependencies ================
  275. #===================================
  276. # FreeType
  277. if(NOT NO_FONT_INTERFACE_DEFAULT)
  278. if(EMSCRIPTEN)
  279. set(EMSCRIPTEN_FLAGS "${EMSCRIPTEN_FLAGS} -sUSE_FREETYPE=1")
  280. else()
  281. find_package(Freetype REQUIRED)
  282. if(MSVC AND FREETYPE_VERSION_STRING STREQUAL "2.11.0")
  283. message(WARNING "You are using FreeType version 2.11.0 which introduced an issue that causes a crash on startup on some of the samples. Please avoid this version specifically.")
  284. endif()
  285. list(APPEND CORE_LINK_LIBS ${FREETYPE_LIBRARIES})
  286. list(APPEND CORE_INCLUDE_DIRS ${FREETYPE_INCLUDE_DIRS})
  287. endif()
  288. endif()
  289. # Lua
  290. if(BUILD_LUA_BINDINGS)
  291. find_package(Lua REQUIRED)
  292. list(APPEND LUA_BINDINGS_INCLUDE_DIRS ${LUA_INCLUDE_DIR})
  293. list(APPEND LUA_BINDINGS_LINK_LIBS ${LUA_LIBRARIES})
  294. endif()
  295. # rlottie
  296. if( ENABLE_LOTTIE_PLUGIN )
  297. # Try to find the rlottie library.
  298. if(NOT DEFINED rlottie_DIR)
  299. set(rlottie_DIR $ENV{RLOTTIE_DIR})
  300. endif()
  301. list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/Dependencies/rlottie/build)
  302. find_package(rlottie CONFIG)
  303. find_path(rlottie_INCLUDE_DIR rlottie.h HINTS ${rlottie_DIR} $ENV{rlottie_DIR} PATH_SUFFIXES inc rlottie/inc )
  304. if(rlottie_FOUND AND rlottie_INCLUDE_DIR)
  305. message("-- Can Lottie plugin be added to RmlCore - yes - rlottie library found")
  306. list(APPEND CORE_LINK_LIBS rlottie::rlottie)
  307. list(APPEND CORE_INCLUDE_DIRS ${rlottie_INCLUDE_DIR})
  308. list(APPEND CORE_PRIVATE_DEFS RMLUI_ENABLE_LOTTIE_PLUGIN)
  309. list(APPEND Core_HDR_FILES ${Lottie_HDR_FILES})
  310. list(APPEND Core_PUB_HDR_FILES ${Lottie_PUB_HDR_FILES})
  311. list(APPEND Core_SRC_FILES ${Lottie_SRC_FILES})
  312. else()
  313. if(rlottie_FOUND)
  314. message(FATAL_ERROR "-- Can Lottie plugin be added to RmlCore - no - rlottie library found - rlottie include directory not found")
  315. elseif(rlottie_INCLUDE_DIR)
  316. message(FATAL_ERROR "-- Can Lottie plugin be added to RmlCore - no - rlottie library not found - rlottie include directory found at ${rlottie_INCLUDE_DIR}")
  317. else()
  318. message(FATAL_ERROR "-- Can Lottie plugin be added to RmlCore - no - rlottie not found")
  319. endif()
  320. endif()
  321. endif()
  322. # lunasvg
  323. if( ENABLE_SVG_PLUGIN )
  324. if(NOT DEFINED LUNASVG_DIR)
  325. set(LUNASVG_DIR $ENV{LUNASVG_DIR})
  326. endif()
  327. message("-- Can SVG plugin be enabled - looking for lunasvg library")
  328. find_package(lunasvg REQUIRED)
  329. list(APPEND CORE_LINK_LIBS ${LUNASVG_LIBRARIES})
  330. list(APPEND CORE_INCLUDE_DIRS ${LUNASVG_INCLUDE_DIR})
  331. list(APPEND CORE_PRIVATE_DEFS RMLUI_ENABLE_SVG_PLUGIN)
  332. list(APPEND Core_HDR_FILES ${SVG_HDR_FILES})
  333. list(APPEND Core_PUB_HDR_FILES ${SVG_PUB_HDR_FILES})
  334. list(APPEND Core_SRC_FILES ${SVG_SRC_FILES})
  335. message("-- Can SVG plugin be enabled - yes - lunasvg library found")
  336. endif()
  337. if(NOT BUILD_FRAMEWORK)
  338. #===================================
  339. # Build libraries ==================
  340. #===================================
  341. set(LIBRARIES Core Debugger)
  342. foreach(library ${LIBRARIES})
  343. set(NAME Rml${library})
  344. add_library(${NAME}
  345. ${${library}_HDR_FILES}
  346. ${${library}_PUB_HDR_FILES}
  347. ${MASTER_${library}_PUB_HDR_FILES}
  348. ${${library}_SRC_FILES}
  349. )
  350. set_target_properties(${NAME} PROPERTIES
  351. VERSION ${PROJECT_VERSION}
  352. SOVERSION ${PROJECT_VERSION_MAJOR}
  353. )
  354. add_common_target_options(${NAME})
  355. install(TARGETS ${NAME}
  356. EXPORT RmlUiTargets
  357. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  358. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  359. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  360. )
  361. set(RMLUI_EXPORTED_TARGETS ${RMLUI_EXPORTED_TARGETS} ${NAME})
  362. endforeach(library)
  363. if( CUSTOM_CONFIGURATION )
  364. foreach(library ${CUSTOM_LINK_LIBRARIES})
  365. install(TARGETS ${library}
  366. EXPORT RmlUiTargets
  367. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  368. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  369. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  370. )
  371. set(RMLUI_EXPORTED_TARGETS ${RMLUI_EXPORTED_TARGETS} ${library})
  372. endforeach(library ${CUSTOM_LINK_LIBRARIES})
  373. endif()
  374. if( MATRIX_ROW_MAJOR )
  375. list(APPEND CORE_PUBLIC_DEFS -DRMLUI_MATRIX_ROW_MAJOR)
  376. endif ()
  377. if( CUSTOM_CONFIGURATION AND CUSTOM_LINK_LIBRARIES )
  378. target_link_libraries(RmlCore PUBLIC ${CUSTOM_LINK_LIBRARIES})
  379. endif ()
  380. if (PRECOMPILED_HEADERS_ENABLED)
  381. target_precompile_headers(RmlCore PRIVATE ${PROJECT_SOURCE_DIR}/Source/Core/precompiled.h)
  382. endif()
  383. else(NOT BUILD_FRAMEWORK)
  384. #===================================
  385. # Build combined Framework =========
  386. #===================================
  387. set(NAME RmlUi)
  388. set(MASTER_PUB_HDR_FILES
  389. ${MASTER_Core_PUB_HDR_FILES}
  390. ${MASTER_Debugger_PUB_HDR_FILES}
  391. )
  392. add_library(${NAME}
  393. ${Core_HDR_FILES}
  394. ${MASTER_Core_PUB_HDR_FILES}
  395. ${Core_PUB_HDR_FILES}
  396. ${Core_SRC_FILES}
  397. ${Debugger_HDR_FILES}
  398. ${MASTER_Debugger_PUB_HDR_FILES}
  399. ${Debugger_PUB_HDR_FILES}
  400. ${Debugger_SRC_FILES}
  401. )
  402. set_target_properties(${NAME} PROPERTIES
  403. VERSION ${PROJECT_VERSION}
  404. SOVERSION ${PROJECT_VERSION_MAJOR}
  405. )
  406. set_property(SOURCE ${MASTER_PUB_HDR_FILES}
  407. PROPERTY MACOSX_PACKAGE_LOCATION Headers
  408. )
  409. set_property(SOURCE ${Core_PUB_HDR_FILES}
  410. PROPERTY MACOSX_PACKAGE_LOCATION Headers/Core
  411. )
  412. set_property(SOURCE ${Debugger_PUB_HDR_FILES}
  413. PROPERTY MACOSX_PACKAGE_LOCATION Headers/Debugger
  414. )
  415. set_target_properties(${NAME} PROPERTIES
  416. FRAMEWORK TRUE
  417. FRAMEWORK_VERSION ${PROJECT_VERSION}
  418. MACOSX_FRAMEWORK_IDENTIFIER com.rmlui.${NAME}
  419. MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${RMLUI_VERSION_SHORT}
  420. MACOSX_FRAMEWORK_BUNDLE_VERSION ${PROJECT_VERSION}
  421. XCODE_ATTRIBUTE_INSTALL_PATH "@rpath"
  422. PUBLIC_HEADER ${MASTER_PUB_HDR_FILES}
  423. )
  424. install(TARGETS ${NAME}
  425. EXPORT RmlUiTargets
  426. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  427. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  428. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  429. FRAMEWORK DESTINATION Library/Frameworks
  430. )
  431. set(RMLUI_EXPORTED_TARGETS ${RMLUI_EXPORTED_TARGETS} ${NAME})
  432. endif(NOT BUILD_FRAMEWORK)
  433. # Build Lua bindings
  434. if(BUILD_LUA_BINDINGS)
  435. set(NAME RmlLua)
  436. add_library(${NAME} ${Lua_SRC_FILES}
  437. ${Lua_HDR_FILES}
  438. ${Lua_PUB_HDR_FILES}
  439. )
  440. set_target_properties(${NAME} PROPERTIES
  441. VERSION ${PROJECT_VERSION}
  442. SOVERSION ${PROJECT_VERSION_MAJOR}
  443. )
  444. add_common_target_options(${NAME})
  445. install(TARGETS ${NAME}
  446. EXPORT RmlUiTargets
  447. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  448. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  449. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  450. )
  451. set(RMLUI_EXPORTED_TARGETS ${RMLUI_EXPORTED_TARGETS} ${NAME})
  452. endif()
  453. if(DISABLE_RTTI_AND_EXCEPTIONS)
  454. if( CMAKE_COMPILER_IS_GNUCXX )
  455. add_definitions( -fno-rtti -fno-exceptions )
  456. elseif( MSVC )
  457. add_definitions( -D_HAS_EXCEPTIONS=0 /GR- )
  458. if(CMAKE_CXX_FLAGS MATCHES "/EHsc ")
  459. string(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
  460. message(STATUS "CMAKE_CXX_FLAGS matches /EHsc before end of string replaced...")
  461. endif()
  462. if(CMAKE_CXX_FLAGS MATCHES "/EHsc$")
  463. string(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
  464. message(STATUS "CMAKE_CXX_FLAGS matches /EHsc at end of string replaced...")
  465. endif()
  466. else()
  467. message(STATUS "Could not create build configuration without rtti and exceptions...")
  468. endif()
  469. endif()
  470. #===================================
  471. # Link libraries ===================
  472. #===================================
  473. if(NOT BUILD_FRAMEWORK)
  474. target_include_directories(RmlCore PRIVATE ${CORE_INCLUDE_DIRS})
  475. target_include_directories(RmlCore INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/Include> $<INSTALL_INTERFACE:include>)
  476. target_link_libraries(RmlCore PRIVATE ${CORE_LINK_LIBS})
  477. target_link_libraries(RmlDebugger RmlCore)
  478. target_compile_definitions(RmlCore PRIVATE ${CORE_PRIVATE_DEFS})
  479. target_compile_definitions(RmlCore PUBLIC ${CORE_PUBLIC_DEFS})
  480. else()
  481. target_include_directories(RmlUi PRIVATE ${CORE_INCLUDE_DIRS})
  482. target_link_libraries(RmlUi PRIVATE ${CORE_LINK_LIBS})
  483. target_compile_definitions(RmlUi PRIVATE ${CORE_PRIVATE_DEFS})
  484. target_compile_definitions(RmlUi PUBLIC ${CORE_PUBLIC_DEFS})
  485. endif()
  486. if(BUILD_LUA_BINDINGS)
  487. if(NOT BUILD_FRAMEWORK)
  488. target_link_libraries(RmlLua RmlCore ${LUA_BINDINGS_LINK_LIBS})
  489. target_include_directories(RmlLua PUBLIC ${LUA_BINDINGS_INCLUDE_DIRS})
  490. else()
  491. target_link_libraries(RmlUi ${LUA_BINDINGS_LINK_LIBS})
  492. target_include_directories(RmlUi PUBLIC ${LUA_BINDINGS_INCLUDE_DIRS})
  493. endif()
  494. endif()
  495. #===================================
  496. # Build samples ====================
  497. #===================================
  498. # Build and link the samples
  499. macro(bl_sample NAME)
  500. if (WIN32)
  501. add_executable(${NAME} WIN32 ${${NAME}_SRC_FILES} ${${NAME}_HDR_FILES} )
  502. elseif(APPLE)
  503. add_executable(${NAME} MACOSX_BUNDLE ${${NAME}_SRC_FILES} ${${NAME}_HDR_FILES} )
  504. # The first rpath is to the proper location where the framework/library SHOULD be, the second is to the location actually seen
  505. # in the build environment
  506. if(BUILD_FRAMEWORK)
  507. set_target_properties(${NAME} PROPERTIES LINK_FLAGS "-rpath @executable_path/../Frameworks")
  508. else()
  509. set_target_properties(${NAME} PROPERTIES LINK_FLAGS "-rpath @executable_path/../lib")
  510. endif()
  511. else()
  512. add_executable(${NAME} ${${NAME}_SRC_FILES} ${${NAME}_HDR_FILES} )
  513. endif()
  514. add_common_target_options(${NAME})
  515. target_link_libraries(${NAME} ${ARGN})
  516. endmacro()
  517. # Build shell
  518. if(BUILD_SAMPLES OR BUILD_TESTING)
  519. message("-- Adding shell with '${SAMPLES_BACKEND}' backend.")
  520. include(SampleFileList)
  521. include(BackendFileList)
  522. if(NOT BUILD_FRAMEWORK)
  523. set(sample_LIBRARIES
  524. shell
  525. RmlCore
  526. RmlDebugger
  527. )
  528. else()
  529. set(sample_LIBRARIES
  530. shell
  531. RmlUi
  532. )
  533. endif()
  534. set(SAMPLES_DIR opt/RmlUi/Samples CACHE PATH "Path to samples directory.")
  535. if(WIN32)
  536. mark_as_advanced(SAMPLES_DIR)
  537. endif()
  538. set(BACKEND_SRC_FILES "${${SAMPLES_BACKEND}_SRC_FILES}")
  539. set(BACKEND_HDR_FILES "${${SAMPLES_BACKEND}_HDR_FILES}")
  540. if("${BACKEND_SRC_FILES}" STREQUAL "" OR "${BACKEND_HDR_FILES}" STREQUAL "")
  541. message(FATAL_ERROR "Unknown samples backend '${SAMPLES_BACKEND}'.")
  542. endif()
  543. list(APPEND shell_SRC_FILES ${BACKEND_SRC_FILES})
  544. list(APPEND shell_HDR_FILES ${BACKEND_HDR_FILES} ${BACKEND_COMMON_HDR_FILES})
  545. add_library(shell STATIC ${shell_SRC_FILES} ${shell_HDR_FILES})
  546. target_include_directories(shell PUBLIC
  547. ${PROJECT_SOURCE_DIR}/Backends
  548. ${PROJECT_SOURCE_DIR}/Samples/shell/include
  549. )
  550. add_common_target_options(shell)
  551. target_link_libraries(shell PUBLIC RmlCore RmlDebugger)
  552. # Add OS dependencies.
  553. if (WIN32)
  554. target_link_libraries(shell PRIVATE shlwapi imm32)
  555. elseif(APPLE)
  556. target_link_libraries(shell PRIVATE "-framework Cocoa")
  557. elseif(UNIX AND NOT APPLE AND NOT EMSCRIPTEN)
  558. find_package(X11)
  559. if (X11_FOUND)
  560. message("-- Found X11 library.")
  561. target_link_libraries(shell PRIVATE ${X11_LIBRARIES})
  562. # Platform_X11 uses Xkb if possible instead of XGetKeyboardMapping for performance.
  563. if(X11_Xkb_FOUND)
  564. FIND_PACKAGE_MESSAGE(X11 "Found X11 KBlib: ${X11_X11_LIB}" "[${X11_X11_LIB}][${X11_XkbINCLUDE_DIR}]")
  565. target_compile_definitions(shell PRIVATE HAS_X11XKBLIB)
  566. endif()
  567. endif()
  568. endif()
  569. # Add platform dependencies.
  570. if(SAMPLES_BACKEND MATCHES "^X11")
  571. if(NOT X11_FOUND)
  572. message(FATAL_ERROR "X11 not found or not supported on this platform, select a different sample backend.")
  573. endif()
  574. endif()
  575. if(SAMPLES_BACKEND MATCHES "^SDL")
  576. message("-- Looking for SDL2 library for samples backend.")
  577. if(EMSCRIPTEN)
  578. set(EMSCRIPTEN_FLAGS "${EMSCRIPTEN_FLAGS} -sUSE_SDL=2 -sUSE_SDL_IMAGE=2 -sSDL2_IMAGE_FORMATS='[tga]'")
  579. else()
  580. find_package(SDL2 REQUIRED)
  581. if(NOT SDL2_FOUND)
  582. message(FATAL_ERROR "SDL2 not found")
  583. endif()
  584. if(SAMPLES_BACKEND STREQUAL "SDL_GL2")
  585. find_package(GLEW REQUIRED)
  586. if(NOT GLEW_FOUND)
  587. message(FATAL_ERROR "GLEW not found")
  588. endif()
  589. endif()
  590. # Check version requirement for the SDL renderer.
  591. if(SAMPLES_BACKEND STREQUAL "SDL_SDLrenderer" AND "${SDL2_VERSION}" VERSION_LESS "2.0.20")
  592. message(FATAL_ERROR "SDL2 native renderer backend (${SAMPLES_BACKEND}) requires SDL 2.0.20 (found ${SDL2_VERSION}).")
  593. endif()
  594. if(SAMPLES_BACKEND STREQUAL "SDL_GL2" OR SAMPLES_BACKEND STREQUAL "SDL_GL3" OR SAMPLES_BACKEND STREQUAL "SDL_SDLrenderer")
  595. find_package(SDL2_image REQUIRED)
  596. if(NOT SDL2_IMAGE_FOUND)
  597. message(FATAL_ERROR "SDL2_image not found")
  598. endif()
  599. endif()
  600. target_include_directories(shell PRIVATE ${SDL2_INCLUDE_DIR} ${SDL2_IMAGE_INCLUDE_DIR} ${GLEW_INCLUDE_DIR})
  601. target_link_libraries(shell PRIVATE ${SDL2_LIBRARY} ${SDL2_IMAGE_LIBRARY} ${GLEW_LIBRARIES})
  602. endif()
  603. endif()
  604. if(SAMPLES_BACKEND MATCHES "^SFML")
  605. message("-- Looking for SFML 2.x library for samples backend.")
  606. if (WIN32)
  607. find_package(SFML 2 REQUIRED COMPONENTS graphics window system main)
  608. else()
  609. find_package(SFML 2 REQUIRED COMPONENTS graphics window system)
  610. endif()
  611. target_include_directories(shell PRIVATE ${SFML_INCLUDE_DIR})
  612. target_link_libraries(shell PRIVATE ${SFML_LIBRARIES})
  613. endif()
  614. if(SAMPLES_BACKEND MATCHES "^GLFW")
  615. message("-- Looking for GLFW3 library for samples backend.")
  616. find_package(glfw3 3.3 CONFIG REQUIRED)
  617. target_link_libraries(shell PRIVATE glfw)
  618. message("-- Found GLFW version ${glfw3_VERSION}.")
  619. endif()
  620. # Add renderer dependencies.
  621. if(SAMPLES_BACKEND MATCHES "GL2$")
  622. message("-- Adding OpenGL 2 renderer backend.")
  623. find_package(OpenGL REQUIRED)
  624. target_include_directories(shell PRIVATE ${OPENGL_INCLUDE_DIR})
  625. target_link_libraries(shell PRIVATE ${OPENGL_LIBRARIES})
  626. target_compile_definitions(shell PRIVATE RMLUI_RENDERER_GL2)
  627. if(APPLE)
  628. target_compile_definitions(shell PRIVATE GL_SILENCE_DEPRECATION)
  629. endif()
  630. endif()
  631. if(SAMPLES_BACKEND MATCHES "VK$")
  632. message("-- Using Vulkan renderer backend.")
  633. option(RMLUI_VK_DEBUG "Enable debugging mode for Vulkan renderer." OFF)
  634. mark_as_advanced(RMLUI_VK_DEBUG)
  635. if(RMLUI_VK_DEBUG)
  636. target_compile_definitions(shell PRIVATE RMLUI_VK_DEBUG)
  637. endif()
  638. target_link_libraries(shell PRIVATE ${CMAKE_DL_LIBS})
  639. endif()
  640. if(SAMPLES_BACKEND MATCHES "GL3$")
  641. message("-- Adding OpenGL 3 renderer backend.")
  642. if(EMSCRIPTEN)
  643. set(EMSCRIPTEN_EXE_FLAGS "${EMSCRIPTEN_EXE_FLAGS} -sMAX_WEBGL_VERSION=2")
  644. else()
  645. find_package(OpenGL REQUIRED)
  646. target_include_directories(shell PRIVATE ${OPENGL_INCLUDE_DIR})
  647. target_link_libraries(shell PRIVATE ${OPENGL_LIBRARIES} ${CMAKE_DL_LIBS})
  648. target_compile_definitions(shell PRIVATE RMLUI_RENDERER_GL3)
  649. if(APPLE)
  650. target_compile_definitions(shell PRIVATE GL_SILENCE_DEPRECATION)
  651. endif()
  652. endif()
  653. endif()
  654. endif()
  655. if(BUILD_SAMPLES)
  656. set(samples treeview customlog drag loaddocument transform bitmapfont animation benchmark demo databinding)
  657. set(tutorials template datagrid datagrid_tree drag)
  658. if(ENABLE_LOTTIE_PLUGIN)
  659. list(APPEND samples "lottie")
  660. endif()
  661. if(ENABLE_SVG_PLUGIN)
  662. list(APPEND samples "svg")
  663. endif()
  664. # Build and install the basic samples
  665. foreach(sample ${samples})
  666. bl_sample(${sample} ${sample_LIBRARIES})
  667. # The samples always set this as their current working directory
  668. install(DIRECTORY DESTINATION ${SAMPLES_DIR}/basic/${sample})
  669. install(TARGETS ${sample}
  670. RUNTIME DESTINATION ${SAMPLES_DIR}/${sample}
  671. BUNDLE DESTINATION ${SAMPLES_DIR})
  672. endforeach()
  673. # Build and install the tutorials
  674. foreach(tutorial ${tutorials})
  675. set(tutorial_fullname tutorial_${tutorial})
  676. bl_sample(${tutorial_fullname} ${sample_LIBRARIES})
  677. # The tutorials always set this as their current working directory
  678. install(DIRECTORY DESTINATION ${SAMPLES_DIR}/tutorial/${tutorial})
  679. install(TARGETS ${tutorial_fullname}
  680. RUNTIME DESTINATION ${SAMPLES_DIR}/${tutorial}
  681. BUNDLE DESTINATION ${SAMPLES_DIR})
  682. endforeach()
  683. # Build and install invaders sample
  684. bl_sample(invaders ${sample_LIBRARIES})
  685. install(DIRECTORY DESTINATION ${SAMPLES_DIR}/invaders)
  686. install(TARGETS invaders
  687. RUNTIME DESTINATION ${SAMPLES_DIR}/invaders
  688. BUNDLE DESTINATION ${SAMPLES_DIR})
  689. if(BUILD_LUA_BINDINGS)
  690. bl_sample(luainvaders RmlLua ${sample_LIBRARIES} ${LUA_BINDINGS_LINK_LIBS})
  691. install(DIRECTORY DESTINATION ${SAMPLES_DIR}/luainvaders)
  692. install(TARGETS luainvaders
  693. RUNTIME DESTINATION ${SAMPLES_DIR}/luainvaders
  694. BUNDLE DESTINATION ${SAMPLES_DIR})
  695. endif()
  696. # Add assets to emscripten binaries
  697. if(EMSCRIPTEN)
  698. message("-- Preloading emscipten sample assets")
  699. set(COMMON_ASSET_FOLDER "Samples/assets/")
  700. set(EMSCRIPTEN_EXE_FLAGS "${EMSCRIPTEN_EXE_FLAGS} --preload-file ${CMAKE_CURRENT_SOURCE_DIR}/${COMMON_ASSET_FOLDER}@/${COMMON_ASSET_FOLDER}")
  701. foreach(sample ${samples})
  702. set(SAMPLE_DATA_FOLDER "Samples/basic/${sample}/data/")
  703. set(ABS_SAMPLE_DATA_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}/${SAMPLE_DATA_FOLDER}")
  704. if(EXISTS ${ABS_SAMPLE_DATA_FOLDER})
  705. target_link_libraries(${sample} "--preload-file ${ABS_SAMPLE_DATA_FOLDER}@/${SAMPLE_DATA_FOLDER}")
  706. endif()
  707. endforeach()
  708. foreach(tutorial ${tutorials})
  709. set(TUTORIAL_DATA_FOLDER "Samples/tutorial/${tutorial}/data/")
  710. set(ABS_TUTORIAL_DATA_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}/${TUTORIAL_DATA_FOLDER}")
  711. if(EXISTS ${ABS_TUTORIAL_DATA_FOLDER})
  712. target_link_libraries("tutorial_${tutorial}" "--preload-file ${ABS_TUTORIAL_DATA_FOLDER}@/${TUTORIAL_DATA_FOLDER}")
  713. endif()
  714. endforeach()
  715. set(INVADER_DATA_FOLDER "Samples/invaders/data/")
  716. target_link_libraries(invaders "-sALLOW_MEMORY_GROWTH --preload-file ${CMAKE_CURRENT_SOURCE_DIR}/${INVADER_DATA_FOLDER}@/${INVADER_DATA_FOLDER}")
  717. endif()
  718. endif()
  719. #===================================
  720. # Add global options ===============
  721. #===================================
  722. if(EMSCRIPTEN)
  723. # Enables Asyncify which we only need since the backend doesn't control the main loop. This enables us to yield to the browser during the backend call to
  724. # Backend::ProcessEvents(). Asyncify results in larger and slower code, users are instead encouraged to use 'emscripten_set_main_loop()' and family.
  725. set(EMSCRIPTEN_EXE_FLAGS "${EMSCRIPTEN_EXE_FLAGS} -sASYNCIFY")
  726. message(STATUS "Compiling for Emscripten.\n\t- Flags:${EMSCRIPTEN_FLAGS}\n\t- ExeFlags:${EMSCRIPTEN_EXE_FLAGS}")
  727. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EMSCRIPTEN_FLAGS}")
  728. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EMSCRIPTEN_FLAGS}")
  729. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${EMSCRIPTEN_FLAGS} ${EMSCRIPTEN_EXE_FLAGS}")
  730. set(CMAKE_EXECUTABLE_SUFFIX .html)
  731. endif()
  732. #===================================
  733. # Add tests ========================
  734. #===================================
  735. if(RMLUI_TESTS_ENABLED)
  736. add_subdirectory(Tests)
  737. endif()
  738. #===================================
  739. # Installation =====================
  740. #===================================
  741. if(BUILD_LUA_BINDINGS)
  742. install(DIRECTORY ${PROJECT_SOURCE_DIR}/Include/RmlUi
  743. DESTINATION include
  744. )
  745. else()
  746. install(DIRECTORY ${PROJECT_SOURCE_DIR}/Include/RmlUi
  747. DESTINATION include
  748. PATTERN "Lua" EXCLUDE
  749. )
  750. endif()
  751. if(BUILD_SAMPLES)
  752. install(DIRECTORY ${PROJECT_SOURCE_DIR}/Samples/assets
  753. DESTINATION ${SAMPLES_DIR}
  754. )
  755. install(DIRECTORY ${PROJECT_SOURCE_DIR}/Samples/tutorial/template/data
  756. DESTINATION ${SAMPLES_DIR}/tutorial/template
  757. )
  758. install(DIRECTORY ${PROJECT_SOURCE_DIR}/Samples/tutorial/datagrid/data
  759. DESTINATION ${SAMPLES_DIR}/tutorial/datagrid
  760. )
  761. install(DIRECTORY ${PROJECT_SOURCE_DIR}/Samples/tutorial/datagrid_tree/data
  762. DESTINATION ${SAMPLES_DIR}/tutorial/datagrid_tree
  763. )
  764. install(DIRECTORY ${PROJECT_SOURCE_DIR}/Samples/tutorial/drag/data
  765. DESTINATION ${SAMPLES_DIR}/tutorial/drag
  766. )
  767. install(DIRECTORY ${PROJECT_SOURCE_DIR}/Samples/basic/animation/data
  768. DESTINATION ${SAMPLES_DIR}/basic/animation
  769. )
  770. install(DIRECTORY ${PROJECT_SOURCE_DIR}/Samples/basic/benchmark/data
  771. DESTINATION ${SAMPLES_DIR}/basic/benchmark
  772. )
  773. install(DIRECTORY ${PROJECT_SOURCE_DIR}/Samples/basic/bitmapfont/data
  774. DESTINATION ${SAMPLES_DIR}/basic/bitmapfont
  775. )
  776. install(DIRECTORY ${PROJECT_SOURCE_DIR}/Samples/basic/databinding/data
  777. DESTINATION ${SAMPLES_DIR}/basic/databinding
  778. )
  779. install(DIRECTORY ${PROJECT_SOURCE_DIR}/Samples/basic/demo/data
  780. DESTINATION ${SAMPLES_DIR}/basic/demo
  781. )
  782. install(DIRECTORY ${PROJECT_SOURCE_DIR}/Samples/basic/transform/data
  783. DESTINATION ${SAMPLES_DIR}/basic/transform
  784. )
  785. install(DIRECTORY ${PROJECT_SOURCE_DIR}/Samples/basic/treeview/data
  786. DESTINATION ${SAMPLES_DIR}/basic/treeview
  787. )
  788. install(DIRECTORY ${PROJECT_SOURCE_DIR}/Samples/basic/drag/data
  789. DESTINATION ${SAMPLES_DIR}/basic/drag
  790. )
  791. install(DIRECTORY ${PROJECT_SOURCE_DIR}/Samples/invaders/data
  792. DESTINATION ${SAMPLES_DIR}/invaders
  793. )
  794. if(TARGET lottie)
  795. install(DIRECTORY ${PROJECT_SOURCE_DIR}/Samples/basic/lottie/data
  796. DESTINATION ${SAMPLES_DIR}/basic/lottie
  797. )
  798. endif()
  799. if(TARGET svg)
  800. install(DIRECTORY ${PROJECT_SOURCE_DIR}/Samples/basic/svg/data
  801. DESTINATION ${SAMPLES_DIR}/basic/svg
  802. )
  803. endif()
  804. if(BUILD_LUA_BINDINGS)
  805. install(DIRECTORY ${PROJECT_SOURCE_DIR}/Samples/luainvaders/data
  806. DESTINATION ${SAMPLES_DIR}/luainvaders
  807. )
  808. install(DIRECTORY ${PROJECT_SOURCE_DIR}/Samples/luainvaders/lua
  809. DESTINATION ${SAMPLES_DIR}/luainvaders
  810. )
  811. endif()
  812. endif()
  813. #===================================
  814. # Generate Config.cmake files ======
  815. #===================================
  816. # Try to include helper module
  817. include(CMakePackageConfigHelpers OPTIONAL RESULT_VARIABLE PkgHelpers_AVAILABLE)
  818. # guard against older versions of cmake which do not provide it
  819. if(PkgHelpers_AVAILABLE)
  820. set (INCLUDE_INSTALL_DIR "include")
  821. set (LIB_INSTALL_DIR "lib")
  822. set (INCLUDE_DIR "${PROJECT_SOURCE_DIR}/Include")
  823. # generate configuration for install tree
  824. configure_package_config_file(${PROJECT_SOURCE_DIR}/CMake/RmlUiConfig.cmake.install.in
  825. ${CMAKE_CURRENT_BINARY_DIR}/install/RmlUiConfig.cmake
  826. INSTALL_DESTINATION ${LIB_INSTALL_DIR}/RmlUi/cmake
  827. PATH_VARS INCLUDE_INSTALL_DIR LIB_INSTALL_DIR)
  828. write_basic_package_version_file(
  829. ${CMAKE_CURRENT_BINARY_DIR}/install/RmlUiConfigVersion.cmake
  830. VERSION ${PROJECT_VERSION}
  831. COMPATIBILITY SameMajorVersion )
  832. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/install/RmlUiConfig.cmake
  833. ${CMAKE_CURRENT_BINARY_DIR}/install/RmlUiConfigVersion.cmake
  834. DESTINATION ${LIB_INSTALL_DIR}/RmlUi/cmake )
  835. install(EXPORT RmlUiTargets
  836. DESTINATION ${LIB_INSTALL_DIR}/RmlUi/cmake)
  837. # generate configuration for build tree
  838. configure_package_config_file(${PROJECT_SOURCE_DIR}/CMake/RmlUiConfig.cmake.build.in
  839. ${CMAKE_CURRENT_BINARY_DIR}/RmlUiConfig.cmake
  840. INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
  841. PATH_VARS INCLUDE_DIR CMAKE_CURRENT_BINARY_DIR)
  842. export(TARGETS ${RMLUI_EXPORTED_TARGETS}
  843. FILE "${CMAKE_CURRENT_BINARY_DIR}/RmlUiTargets.cmake")
  844. write_basic_package_version_file(
  845. ${CMAKE_CURRENT_BINARY_DIR}/RmlUiConfigVersion.cmake
  846. VERSION ${PROJECT_VERSION}
  847. COMPATIBILITY SameMajorVersion )
  848. set(RmlUi_DIR "${CMAKE_CURRENT_BINARY_DIR}" CACHE PATH "The directory containing a CMake configuration file for RmlUi.")
  849. else()
  850. message("If you wish to use find_package(RmlUi) in your own project to find RmlUi library"
  851. " please update cmake to version which provides CMakePackageConfighelpers module"
  852. " or write generators for RmlUiConfig.cmake by yourself.")
  853. endif()