CMakeLists.txt 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. # Tests configuration
  2. include(FetchContent)
  3. include(CheckCXXSourceCompiles)
  4. set(THREADS_PREFER_PTHREAD_FLAG ON)
  5. find_package(Threads REQUIRED)
  6. if(ENTT_FIND_GTEST_PACKAGE)
  7. find_package(GTest REQUIRED)
  8. else()
  9. FetchContent_Declare(
  10. googletest
  11. GIT_REPOSITORY https://github.com/google/googletest.git
  12. GIT_TAG main
  13. GIT_SHALLOW 1
  14. )
  15. set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
  16. FetchContent_MakeAvailable(googletest)
  17. add_library(GTest::Main ALIAS gtest_main)
  18. target_compile_features(gtest PUBLIC cxx_std_20)
  19. set_target_properties(gtest PROPERTIES CXX_CLANG_TIDY "")
  20. target_compile_features(gtest_main PUBLIC cxx_std_20)
  21. set_target_properties(gtest_main PROPERTIES CXX_CLANG_TIDY "")
  22. target_compile_features(gmock PUBLIC cxx_std_20)
  23. set_target_properties(gmock PROPERTIES CXX_CLANG_TIDY "")
  24. target_compile_features(gmock_main PUBLIC cxx_std_20)
  25. set_target_properties(gmock_main PROPERTIES CXX_CLANG_TIDY "")
  26. endif()
  27. include_directories($<TARGET_PROPERTY:EnTT,INTERFACE_INCLUDE_DIRECTORIES>)
  28. add_compile_options($<TARGET_PROPERTY:EnTT,INTERFACE_COMPILE_OPTIONS>)
  29. function(SETUP_TARGET TARGET_NAME)
  30. set_target_properties(${TARGET_NAME} PROPERTIES CXX_EXTENSIONS OFF)
  31. target_compile_features(${TARGET_NAME} PRIVATE ${ENTT_CXX_STD})
  32. target_link_libraries(${TARGET_NAME} PRIVATE EnTT)
  33. if(MSVC)
  34. set_target_properties(${TARGET_NAME} PROPERTIES LINK_FLAGS_RELWITHDEBINFO "/PROFILE")
  35. target_compile_options(
  36. ${TARGET_NAME}
  37. PRIVATE
  38. $<$<STREQUAL:"${CMAKE_CXX_COMPILER_ID}","Clang">:
  39. -Wdocumentation
  40. -Wno-deprecated-declarations
  41. -Wno-exceptions
  42. -Wconversion
  43. >
  44. /EHsc /wd4324 /wd4996 /bigobj
  45. # disabling INCREMENTAL is required by SizeBench
  46. $<$<CONFIG:Debug>:/Od /INCREMENTAL:NO>
  47. $<$<CONFIG:Release>:/O2>
  48. )
  49. target_link_options(
  50. ${TARGET_NAME}
  51. PRIVATE
  52. # disabling INCREMENTAL is required by SizeBench
  53. $<$<CONFIG:Debug>:/INCREMENTAL:NO>
  54. $<$<CONFIG:Release>:/OPT:NOICF>
  55. )
  56. else()
  57. target_compile_options(
  58. ${TARGET_NAME}
  59. PRIVATE
  60. -fvisibility=hidden
  61. -pedantic
  62. -Wall
  63. -Wconversion
  64. -Wno-deprecated-declarations
  65. -Wshadow
  66. $<$<CONFIG:Debug>:-O0 -g>
  67. $<$<CONFIG:Release>:-O2>
  68. )
  69. endif()
  70. target_compile_definitions(
  71. ${TARGET_NAME}
  72. PRIVATE
  73. ENTT_ID_TYPE=${ENTT_ID_TYPE}
  74. _ENABLE_EXTENDED_ALIGNED_STORAGE
  75. NOMINMAX
  76. ${ARGN}
  77. )
  78. endfunction()
  79. add_library(odr OBJECT odr.cpp)
  80. set_target_properties(odr PROPERTIES POSITION_INDEPENDENT_CODE ON)
  81. SETUP_TARGET(odr)
  82. function(SETUP_BASIC_TEST)
  83. set(options DEFS)
  84. set(oneValueArgs NAME)
  85. set(multiValueArgs SOURCES INCLUDE)
  86. cmake_parse_arguments(BASIC_TEST "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  87. add_executable(${BASIC_TEST_NAME} $<TARGET_OBJECTS:odr> ${BASIC_TEST_SOURCES})
  88. target_link_libraries(${BASIC_TEST_NAME} PRIVATE GTest::Main Threads::Threads)
  89. target_include_directories(${BASIC_TEST_NAME} PRIVATE ${BASIC_TEST_INCLUDE})
  90. SETUP_TARGET(${BASIC_TEST_NAME} ${BASIC_TEST_UNPARSED_ARGUMENTS})
  91. add_test(NAME ${BASIC_TEST_NAME} COMMAND ${BASIC_TEST_NAME})
  92. set_tests_properties(${BASIC_TEST_NAME} PROPERTIES TIMEOUT 60)
  93. endfunction()
  94. function(SETUP_LIB_SHARED_TEST TEST_NAME SUB_PATH)
  95. set(TARGET_NAME ${TEST_NAME}_${SUB_PATH})
  96. add_library(_${TARGET_NAME} SHARED $<TARGET_OBJECTS:odr> lib/${TEST_NAME}/${SUB_PATH}/lib.cpp)
  97. SETUP_TARGET(_${TARGET_NAME} ENTT_API_EXPORT)
  98. SETUP_BASIC_TEST(NAME lib_${TARGET_NAME} SOURCES lib/${TEST_NAME}/${SUB_PATH}/main.cpp DEFS ENTT_API_IMPORT)
  99. set_target_properties(lib_${TARGET_NAME} PROPERTIES CXX_CLANG_TIDY "")
  100. target_link_libraries(lib_${TARGET_NAME} PRIVATE _${TARGET_NAME})
  101. endfunction()
  102. function(SETUP_LIB_PLUGIN_TEST TEST_NAME SUB_PATH)
  103. set(TARGET_NAME ${TEST_NAME}_${SUB_PATH})
  104. add_library(_${TARGET_NAME} MODULE $<TARGET_OBJECTS:odr> lib/${TEST_NAME}/${SUB_PATH}/plugin.cpp)
  105. SETUP_TARGET(_${TARGET_NAME} ${ARGVN})
  106. SETUP_BASIC_TEST(NAME lib_${TARGET_NAME} SOURCES lib/${TEST_NAME}/${SUB_PATH}/main.cpp DEFS PLUGIN="$<TARGET_FILE:_${TARGET_NAME}>" ${ARGVN})
  107. target_link_libraries(_${TARGET_NAME} PRIVATE cr::cr)
  108. target_link_libraries(lib_${TARGET_NAME} PRIVATE cr::cr ${CMAKE_DL_LIBS})
  109. set_target_properties(_${TARGET_NAME} PROPERTIES CXX_CLANG_TIDY "")
  110. set_target_properties(lib_${TARGET_NAME} PROPERTIES CXX_CLANG_TIDY "")
  111. target_compile_options(_${TARGET_NAME} PRIVATE $<$<NOT:$<STREQUAL:"${CMAKE_CXX_COMPILER_ID}","MSVC">>:-Wno-conversion>)
  112. target_compile_options(lib_${TARGET_NAME} PRIVATE $<$<NOT:$<STREQUAL:"${CMAKE_CXX_COMPILER_ID}","MSVC">>:-Wno-conversion>)
  113. add_dependencies(lib_${TARGET_NAME} _${TARGET_NAME})
  114. endfunction()
  115. # Test benchmark
  116. if(ENTT_BUILD_BENCHMARK)
  117. SETUP_BASIC_TEST(
  118. NAME benchmark
  119. SOURCES benchmark/benchmark.cpp
  120. )
  121. set_target_properties(benchmark PROPERTIES CXX_CLANG_TIDY "")
  122. endif()
  123. # Test example
  124. if(ENTT_BUILD_EXAMPLE)
  125. SETUP_BASIC_TEST(
  126. NAME example
  127. SOURCES
  128. example/custom_identifier.cpp
  129. example/entity_copy.cpp
  130. example/reserved_bits.cpp
  131. example/signal_less.cpp
  132. )
  133. endif()
  134. # Test lib
  135. if(ENTT_BUILD_LIB)
  136. FetchContent_Declare(
  137. cr
  138. GIT_REPOSITORY https://github.com/fungos/cr.git
  139. GIT_TAG master
  140. GIT_SHALLOW 1
  141. )
  142. FetchContent_MakeAvailable(cr)
  143. add_library(cr::cr ALIAS cr)
  144. SETUP_LIB_SHARED_TEST(dispatcher shared)
  145. SETUP_LIB_PLUGIN_TEST(dispatcher plugin)
  146. SETUP_LIB_SHARED_TEST(emitter shared)
  147. SETUP_LIB_PLUGIN_TEST(emitter plugin)
  148. SETUP_LIB_SHARED_TEST(locator shared)
  149. SETUP_LIB_PLUGIN_TEST(locator plugin)
  150. SETUP_LIB_SHARED_TEST(meta shared)
  151. SETUP_LIB_PLUGIN_TEST(meta plugin)
  152. SETUP_LIB_PLUGIN_TEST(meta plugin_std ENTT_STANDARD_CPP)
  153. SETUP_LIB_SHARED_TEST(registry shared)
  154. SETUP_LIB_PLUGIN_TEST(registry plugin)
  155. SETUP_LIB_SHARED_TEST(view shared)
  156. SETUP_LIB_PLUGIN_TEST(view plugin)
  157. endif()
  158. # Test snapshot
  159. if(ENTT_BUILD_SNAPSHOT)
  160. FetchContent_Declare(
  161. cereal
  162. GIT_REPOSITORY https://github.com/USCiLab/cereal.git
  163. GIT_TAG v1.3.2
  164. GIT_SHALLOW 1
  165. )
  166. set(BUILD_DOC OFF CACHE BOOL "" FORCE)
  167. set(BUILD_SANDBOX OFF CACHE BOOL "" FORCE)
  168. set(SKIP_PORTABILITY_TEST ON CACHE BOOL "" FORCE)
  169. set(SKIP_PERFORMANCE_COMPARISON ON CACHE BOOL "" FORCE)
  170. FetchContent_MakeAvailable(cereal)
  171. SETUP_BASIC_TEST(
  172. NAME snapshot
  173. SOURCES snapshot/snapshot.cpp
  174. )
  175. target_link_libraries(snapshot PRIVATE cereal)
  176. target_compile_options(snapshot PRIVATE $<$<NOT:$<STREQUAL:"${CMAKE_CXX_COMPILER_ID}","MSVC">>:-Wno-conversion>)
  177. set_target_properties(snapshot PROPERTIES CXX_CLANG_TIDY "")
  178. endif()
  179. # Test config
  180. SETUP_BASIC_TEST(
  181. NAME config_ext
  182. SOURCES entt/config/config.cpp
  183. INCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/include
  184. )
  185. SETUP_BASIC_TEST(
  186. NAME config
  187. SOURCES entt/config/version.cpp
  188. )
  189. # Test container
  190. SETUP_BASIC_TEST(
  191. NAME container
  192. SOURCES
  193. entt/container/dense_map.cpp
  194. entt/container/dense_set.cpp
  195. entt/container/table.cpp
  196. )
  197. # Test core
  198. SETUP_BASIC_TEST(
  199. NAME core
  200. SOURCES
  201. entt/core/algorithm.cpp
  202. entt/core/any.cpp
  203. entt/core/bit.cpp
  204. entt/core/compressed_pair.cpp
  205. entt/core/concepts.cpp
  206. entt/core/enum.cpp
  207. entt/core/family.cpp
  208. entt/core/hashed_string.cpp
  209. entt/core/ident.cpp
  210. entt/core/iterator.cpp
  211. entt/core/memory.cpp
  212. entt/core/monostate.cpp
  213. entt/core/tuple.cpp
  214. entt/core/type_info.cpp
  215. entt/core/type_traits.cpp
  216. entt/core/utility.cpp
  217. )
  218. # Test entity
  219. SETUP_BASIC_TEST(
  220. NAME entity
  221. SOURCES
  222. entt/entity/component.cpp
  223. entt/entity/entity.cpp
  224. entt/entity/group.cpp
  225. entt/entity/handle.cpp
  226. entt/entity/helper.cpp
  227. entt/entity/organizer.cpp
  228. entt/entity/reactive_mixin.cpp
  229. entt/entity/registry.cpp
  230. entt/entity/runtime_view.cpp
  231. entt/entity/sigh_mixin.cpp
  232. entt/entity/snapshot.cpp
  233. entt/entity/sparse_set.cpp
  234. entt/entity/storage.cpp
  235. entt/entity/storage_entity.cpp
  236. entt/entity/storage_no_instance.cpp
  237. entt/entity/storage_utility.cpp
  238. entt/entity/view.cpp
  239. )
  240. SETUP_BASIC_TEST(
  241. NAME entity_no_mixin
  242. SOURCES
  243. entt/entity/storage_utility.cpp
  244. DEFS ENTT_NO_MIXIN
  245. )
  246. # Test graph
  247. SETUP_BASIC_TEST(
  248. NAME graph
  249. SOURCES
  250. entt/graph/adjacency_matrix.cpp
  251. entt/graph/dot.cpp
  252. entt/graph/flow.cpp
  253. )
  254. # Test locator
  255. SETUP_BASIC_TEST(
  256. NAME locator
  257. SOURCES entt/locator/locator.cpp
  258. )
  259. # Test meta
  260. SETUP_BASIC_TEST(
  261. NAME meta
  262. SOURCES
  263. entt/meta/meta_any.cpp
  264. entt/meta/meta_base.cpp
  265. entt/meta/meta_container.cpp
  266. entt/meta/meta_context.cpp
  267. entt/meta/meta_conv.cpp
  268. entt/meta/meta_ctor.cpp
  269. entt/meta/meta_custom.cpp
  270. entt/meta/meta_data.cpp
  271. entt/meta/meta_dereference.cpp
  272. entt/meta/meta_factory.cpp
  273. entt/meta/meta_func.cpp
  274. entt/meta/meta_handle.cpp
  275. entt/meta/meta_range.cpp
  276. entt/meta/meta_template.cpp
  277. entt/meta/meta_type.cpp
  278. entt/meta/meta_utility.cpp
  279. )
  280. # Test poly
  281. SETUP_BASIC_TEST(
  282. NAME poly
  283. SOURCES entt/poly/poly.cpp
  284. )
  285. # Test process
  286. SETUP_BASIC_TEST(
  287. NAME process
  288. SOURCES
  289. entt/process/process.cpp
  290. entt/process/scheduler.cpp
  291. )
  292. # Test resource
  293. SETUP_BASIC_TEST(
  294. NAME resource
  295. SOURCES
  296. entt/resource/resource.cpp
  297. entt/resource/resource_cache.cpp
  298. entt/resource/resource_loader.cpp
  299. )
  300. # Test signal
  301. SETUP_BASIC_TEST(
  302. NAME signal
  303. SOURCES
  304. entt/signal/delegate.cpp
  305. entt/signal/dispatcher.cpp
  306. entt/signal/emitter.cpp
  307. entt/signal/sigh.cpp
  308. )
  309. # Test stl
  310. SETUP_BASIC_TEST(
  311. NAME stl
  312. SOURCES
  313. entt/stl/functional.cpp
  314. entt/stl/iterator.cpp
  315. entt/stl/memory.cpp
  316. DEFS ENTT_USE_STL
  317. )