CMakeLists.txt 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  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. cmake_parse_arguments(BASIC_TEST "DEFS" "NAME" "SOURCES" ${ARGN})
  84. add_executable(${BASIC_TEST_NAME} $<TARGET_OBJECTS:odr> ${BASIC_TEST_SOURCES})
  85. target_link_libraries(${BASIC_TEST_NAME} PRIVATE GTest::Main Threads::Threads)
  86. SETUP_TARGET(${BASIC_TEST_NAME} ${BASIC_TEST_UNPARSED_ARGUMENTS})
  87. add_test(NAME ${BASIC_TEST_NAME} COMMAND ${BASIC_TEST_NAME})
  88. set_tests_properties(${BASIC_TEST_NAME} PROPERTIES TIMEOUT 60)
  89. endfunction()
  90. function(SETUP_LIB_SHARED_TEST TEST_NAME SUB_PATH)
  91. set(TARGET_NAME ${TEST_NAME}_${SUB_PATH})
  92. add_library(_${TARGET_NAME} SHARED $<TARGET_OBJECTS:odr> lib/${TEST_NAME}/${SUB_PATH}/lib.cpp)
  93. SETUP_TARGET(_${TARGET_NAME} ENTT_API_EXPORT)
  94. SETUP_BASIC_TEST(NAME lib_${TARGET_NAME} SOURCES lib/${TEST_NAME}/${SUB_PATH}/main.cpp DEFS ENTT_API_IMPORT)
  95. set_target_properties(lib_${TARGET_NAME} PROPERTIES CXX_CLANG_TIDY "")
  96. target_link_libraries(lib_${TARGET_NAME} PRIVATE _${TARGET_NAME})
  97. endfunction()
  98. function(SETUP_LIB_PLUGIN_TEST TEST_NAME SUB_PATH)
  99. set(TARGET_NAME ${TEST_NAME}_${SUB_PATH})
  100. add_library(_${TARGET_NAME} MODULE $<TARGET_OBJECTS:odr> lib/${TEST_NAME}/${SUB_PATH}/plugin.cpp)
  101. SETUP_TARGET(_${TARGET_NAME} ${ARGVN})
  102. SETUP_BASIC_TEST(NAME lib_${TARGET_NAME} SOURCES lib/${TEST_NAME}/${SUB_PATH}/main.cpp DEFS PLUGIN="$<TARGET_FILE:_${TARGET_NAME}>" ${ARGVN})
  103. target_link_libraries(_${TARGET_NAME} PRIVATE cr::cr)
  104. target_link_libraries(lib_${TARGET_NAME} PRIVATE cr::cr ${CMAKE_DL_LIBS})
  105. set_target_properties(_${TARGET_NAME} PROPERTIES CXX_CLANG_TIDY "")
  106. set_target_properties(lib_${TARGET_NAME} PROPERTIES CXX_CLANG_TIDY "")
  107. target_compile_options(_${TARGET_NAME} PRIVATE $<$<NOT:$<STREQUAL:"${CMAKE_CXX_COMPILER_ID}","MSVC">>:-Wno-conversion>)
  108. target_compile_options(lib_${TARGET_NAME} PRIVATE $<$<NOT:$<STREQUAL:"${CMAKE_CXX_COMPILER_ID}","MSVC">>:-Wno-conversion>)
  109. add_dependencies(lib_${TARGET_NAME} _${TARGET_NAME})
  110. endfunction()
  111. # Test benchmark
  112. if(ENTT_BUILD_BENCHMARK)
  113. SETUP_BASIC_TEST(
  114. NAME benchmark
  115. SOURCES benchmark/benchmark.cpp
  116. )
  117. set_target_properties(benchmark PROPERTIES CXX_CLANG_TIDY "")
  118. endif()
  119. # Test example
  120. if(ENTT_BUILD_EXAMPLE)
  121. SETUP_BASIC_TEST(
  122. NAME example
  123. SOURCES
  124. example/custom_identifier.cpp
  125. example/entity_copy.cpp
  126. example/reserved_bits.cpp
  127. example/signal_less.cpp
  128. )
  129. endif()
  130. # Test lib
  131. if(ENTT_BUILD_LIB)
  132. FetchContent_Declare(
  133. cr
  134. GIT_REPOSITORY https://github.com/fungos/cr.git
  135. GIT_TAG master
  136. GIT_SHALLOW 1
  137. )
  138. FetchContent_MakeAvailable(cr)
  139. add_library(cr::cr ALIAS cr)
  140. SETUP_LIB_SHARED_TEST(dispatcher shared)
  141. SETUP_LIB_PLUGIN_TEST(dispatcher plugin)
  142. SETUP_LIB_SHARED_TEST(emitter shared)
  143. SETUP_LIB_PLUGIN_TEST(emitter plugin)
  144. SETUP_LIB_SHARED_TEST(locator shared)
  145. SETUP_LIB_PLUGIN_TEST(locator plugin)
  146. SETUP_LIB_SHARED_TEST(meta shared)
  147. SETUP_LIB_PLUGIN_TEST(meta plugin)
  148. SETUP_LIB_PLUGIN_TEST(meta plugin_std ENTT_STANDARD_CPP)
  149. SETUP_LIB_SHARED_TEST(registry shared)
  150. SETUP_LIB_PLUGIN_TEST(registry plugin)
  151. SETUP_LIB_SHARED_TEST(view shared)
  152. SETUP_LIB_PLUGIN_TEST(view plugin)
  153. endif()
  154. # Test snapshot
  155. if(ENTT_BUILD_SNAPSHOT)
  156. FetchContent_Declare(
  157. cereal
  158. GIT_REPOSITORY https://github.com/USCiLab/cereal.git
  159. GIT_TAG v1.3.2
  160. GIT_SHALLOW 1
  161. )
  162. set(BUILD_DOC OFF CACHE BOOL "" FORCE)
  163. set(BUILD_SANDBOX OFF CACHE BOOL "" FORCE)
  164. set(SKIP_PORTABILITY_TEST ON CACHE BOOL "" FORCE)
  165. set(SKIP_PERFORMANCE_COMPARISON ON CACHE BOOL "" FORCE)
  166. FetchContent_MakeAvailable(cereal)
  167. SETUP_BASIC_TEST(
  168. NAME snapshot
  169. SOURCES snapshot/snapshot.cpp
  170. )
  171. target_link_libraries(snapshot PRIVATE cereal)
  172. target_compile_options(snapshot PRIVATE $<$<NOT:$<STREQUAL:"${CMAKE_CXX_COMPILER_ID}","MSVC">>:-Wno-conversion>)
  173. set_target_properties(snapshot PROPERTIES CXX_CLANG_TIDY "")
  174. endif()
  175. # Test config
  176. SETUP_BASIC_TEST(
  177. NAME config
  178. SOURCES entt/config/version.cpp
  179. )
  180. # Test container
  181. SETUP_BASIC_TEST(
  182. NAME container
  183. SOURCES
  184. entt/container/dense_map.cpp
  185. entt/container/dense_set.cpp
  186. entt/container/table.cpp
  187. )
  188. # Test core
  189. SETUP_BASIC_TEST(
  190. NAME core
  191. SOURCES
  192. entt/core/algorithm.cpp
  193. entt/core/any.cpp
  194. entt/core/bit.cpp
  195. entt/core/compressed_pair.cpp
  196. entt/core/concepts.cpp
  197. entt/core/enum.cpp
  198. entt/core/family.cpp
  199. entt/core/hashed_string.cpp
  200. entt/core/ident.cpp
  201. entt/core/iterator.cpp
  202. entt/core/memory.cpp
  203. entt/core/monostate.cpp
  204. entt/core/tuple.cpp
  205. entt/core/type_info.cpp
  206. entt/core/type_traits.cpp
  207. entt/core/utility.cpp
  208. )
  209. # Test entity
  210. SETUP_BASIC_TEST(
  211. NAME entity
  212. SOURCES
  213. entt/entity/component.cpp
  214. entt/entity/entity.cpp
  215. entt/entity/group.cpp
  216. entt/entity/handle.cpp
  217. entt/entity/helper.cpp
  218. entt/entity/organizer.cpp
  219. entt/entity/reactive_mixin.cpp
  220. entt/entity/registry.cpp
  221. entt/entity/runtime_view.cpp
  222. entt/entity/sigh_mixin.cpp
  223. entt/entity/snapshot.cpp
  224. entt/entity/sparse_set.cpp
  225. entt/entity/storage.cpp
  226. entt/entity/storage_entity.cpp
  227. entt/entity/storage_no_instance.cpp
  228. entt/entity/storage_utility.cpp
  229. entt/entity/view.cpp
  230. )
  231. SETUP_BASIC_TEST(
  232. NAME entity_no_mixin
  233. SOURCES
  234. entt/entity/storage_utility.cpp
  235. DEFS ENTT_NO_MIXIN
  236. )
  237. # Test graph
  238. SETUP_BASIC_TEST(
  239. NAME graph
  240. SOURCES
  241. entt/graph/adjacency_matrix.cpp
  242. entt/graph/dot.cpp
  243. entt/graph/flow.cpp
  244. )
  245. # Test locator
  246. SETUP_BASIC_TEST(
  247. NAME locator
  248. SOURCES entt/locator/locator.cpp
  249. )
  250. # Test meta
  251. SETUP_BASIC_TEST(
  252. NAME meta
  253. SOURCES
  254. entt/meta/meta_any.cpp
  255. entt/meta/meta_base.cpp
  256. entt/meta/meta_container.cpp
  257. entt/meta/meta_context.cpp
  258. entt/meta/meta_conv.cpp
  259. entt/meta/meta_ctor.cpp
  260. entt/meta/meta_custom.cpp
  261. entt/meta/meta_data.cpp
  262. entt/meta/meta_dereference.cpp
  263. entt/meta/meta_factory.cpp
  264. entt/meta/meta_func.cpp
  265. entt/meta/meta_handle.cpp
  266. entt/meta/meta_range.cpp
  267. entt/meta/meta_template.cpp
  268. entt/meta/meta_type.cpp
  269. entt/meta/meta_utility.cpp
  270. )
  271. # Test poly
  272. SETUP_BASIC_TEST(
  273. NAME poly
  274. SOURCES entt/poly/poly.cpp
  275. )
  276. # Test process
  277. SETUP_BASIC_TEST(
  278. NAME process
  279. SOURCES
  280. entt/process/process.cpp
  281. entt/process/scheduler.cpp
  282. )
  283. # Test resource
  284. SETUP_BASIC_TEST(
  285. NAME resource
  286. SOURCES
  287. entt/resource/resource.cpp
  288. entt/resource/resource_cache.cpp
  289. entt/resource/resource_loader.cpp
  290. )
  291. # Test signal
  292. SETUP_BASIC_TEST(
  293. NAME signal
  294. SOURCES
  295. entt/signal/delegate.cpp
  296. entt/signal/dispatcher.cpp
  297. entt/signal/emitter.cpp
  298. entt/signal/sigh.cpp
  299. )
  300. # Test stl
  301. SETUP_BASIC_TEST(
  302. NAME stl
  303. SOURCES
  304. entt/stl/functional.cpp
  305. entt/stl/iterator.cpp
  306. entt/stl/memory.cpp
  307. DEFS ENTT_USE_STL
  308. )