CMakeLists.txt 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. # Tests configuration
  2. include(FetchContent)
  3. include(CheckCXXSourceCompiles)
  4. check_cxx_source_compiles("
  5. #include<version>
  6. int main() { return 0; }
  7. " ENTT_HAS_HEADER_VERSION)
  8. set(THREADS_PREFER_PTHREAD_FLAG ON)
  9. find_package(Threads REQUIRED)
  10. if(ENTT_FIND_GTEST_PACKAGE)
  11. find_package(GTest REQUIRED)
  12. else()
  13. FetchContent_Declare(
  14. googletest
  15. GIT_REPOSITORY https://github.com/google/googletest.git
  16. GIT_TAG main
  17. GIT_SHALLOW 1
  18. )
  19. FetchContent_GetProperties(googletest)
  20. if(NOT googletest_POPULATED)
  21. FetchContent_Populate(googletest)
  22. set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
  23. add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR})
  24. endif()
  25. add_library(GTest::Main ALIAS gtest_main)
  26. target_compile_features(gtest PUBLIC cxx_std_17)
  27. set_target_properties(gtest PROPERTIES CXX_CLANG_TIDY "")
  28. target_compile_features(gtest_main PUBLIC cxx_std_17)
  29. set_target_properties(gtest_main PROPERTIES CXX_CLANG_TIDY "")
  30. target_compile_features(gmock PUBLIC cxx_std_17)
  31. set_target_properties(gmock PROPERTIES CXX_CLANG_TIDY "")
  32. target_compile_features(gmock_main PUBLIC cxx_std_17)
  33. set_target_properties(gmock_main PROPERTIES CXX_CLANG_TIDY "")
  34. endif()
  35. include_directories($<TARGET_PROPERTY:EnTT,INTERFACE_INCLUDE_DIRECTORIES>)
  36. add_compile_options($<TARGET_PROPERTY:EnTT,INTERFACE_COMPILE_OPTIONS>)
  37. function(SETUP_TARGET TARGET_NAME)
  38. set_target_properties(${TARGET_NAME} PROPERTIES CXX_EXTENSIONS OFF)
  39. target_compile_features(${TARGET_NAME} PRIVATE ${ENTT_CXX_STD})
  40. target_link_libraries(${TARGET_NAME} PRIVATE EnTT)
  41. if(MSVC)
  42. target_compile_options(
  43. ${TARGET_NAME}
  44. PRIVATE
  45. # vs2017 emits too many false positives for my tastes
  46. $<IF:$<EQUAL:${MSVC_TOOLSET_VERSION},141>, /W1, /W4>
  47. # clang-cl goes a little wrong with some warnings instead
  48. $<$<STREQUAL:"${CMAKE_CXX_COMPILER_ID}","Clang">:
  49. -Wno-deprecated-declarations
  50. -Wno-ignored-qualifiers
  51. -Wno-unknown-warning-option
  52. -Wno-exceptions
  53. -Wno-unused-local-typedef
  54. -Wno-unused-private-field
  55. >
  56. # documentation diagnostic turned on for clang-cl only
  57. $<$<STREQUAL:"${CMAKE_CXX_COMPILER_ID}","Clang">:-Wdocumentation>
  58. # warnings from compilers that think I don't know what I'm doing
  59. $<$<STREQUAL:"${CMAKE_CXX_COMPILER_ID}","Clang">:-Wcomma>
  60. /EHsc /wd4324 /wd4996
  61. # disabling INCREMENTAL is required by SizeBench
  62. $<$<CONFIG:Debug>:/Od /INCREMENTAL:NO>
  63. $<$<CONFIG:Release>:/O2>
  64. )
  65. target_link_options(
  66. ${TARGET_NAME}
  67. PRIVATE
  68. # disabling INCREMENTAL is required by SizeBench
  69. $<$<CONFIG:Debug>:/INCREMENTAL:NO>
  70. )
  71. else()
  72. target_compile_options(
  73. ${TARGET_NAME}
  74. PRIVATE
  75. -pedantic -fvisibility=hidden -Wall -Wshadow -Wno-deprecated-declarations
  76. $<$<CONFIG:Debug>:-O0 -g>
  77. $<$<CONFIG:Release>:-O2>
  78. )
  79. endif()
  80. target_compile_definitions(
  81. ${TARGET_NAME}
  82. PRIVATE
  83. ENTT_ID_TYPE=${ENTT_ID_TYPE}
  84. _ENABLE_EXTENDED_ALIGNED_STORAGE
  85. NOMINMAX
  86. ${ARGN}
  87. )
  88. if(ENTT_HAS_HEADER_VERSION)
  89. target_compile_definitions(
  90. ${TARGET_NAME}
  91. PRIVATE
  92. ENTT_HAS_HEADER_VERSION
  93. )
  94. endif()
  95. endfunction()
  96. add_library(odr OBJECT odr.cpp)
  97. set_target_properties(odr PROPERTIES POSITION_INDEPENDENT_CODE ON)
  98. SETUP_TARGET(odr)
  99. function(SETUP_BASIC_TEST TEST_NAME TEST_SOURCES)
  100. add_executable(${TEST_NAME} $<TARGET_OBJECTS:odr> ${TEST_SOURCES})
  101. target_link_libraries(${TEST_NAME} PRIVATE GTest::Main Threads::Threads)
  102. SETUP_TARGET(${TEST_NAME} ${ARGN})
  103. add_test(NAME ${TEST_NAME} COMMAND ${TEST_NAME})
  104. set_tests_properties(${TEST_NAME} PROPERTIES TIMEOUT 60)
  105. endfunction()
  106. function(SETUP_LIB_SHARED_TEST TEST_NAME SUB_PATH)
  107. set(TARGET_NAME ${TEST_NAME}_${SUB_PATH})
  108. add_library(_${TARGET_NAME} SHARED $<TARGET_OBJECTS:odr> lib/${TEST_NAME}/${SUB_PATH}/lib.cpp)
  109. SETUP_TARGET(_${TARGET_NAME} ENTT_API_EXPORT)
  110. SETUP_BASIC_TEST(lib_${TARGET_NAME} lib/${TEST_NAME}/${SUB_PATH}/main.cpp ENTT_API_IMPORT)
  111. set_target_properties(lib_${TARGET_NAME} PROPERTIES CXX_CLANG_TIDY "")
  112. target_link_libraries(lib_${TARGET_NAME} PRIVATE _${TARGET_NAME})
  113. endfunction()
  114. function(SETUP_LIB_PLUGIN_TEST TEST_NAME SUB_PATH)
  115. set(TARGET_NAME ${TEST_NAME}_${SUB_PATH})
  116. add_library(_${TARGET_NAME} MODULE $<TARGET_OBJECTS:odr> lib/${TEST_NAME}/${SUB_PATH}/plugin.cpp)
  117. SETUP_TARGET(_${TARGET_NAME} ${ARGVN})
  118. SETUP_BASIC_TEST(lib_${TARGET_NAME} lib/${TEST_NAME}/${SUB_PATH}/main.cpp PLUGIN="$<TARGET_FILE:_${TARGET_NAME}>" ${ARGVN})
  119. set_target_properties(_${TARGET_NAME} PROPERTIES CXX_CLANG_TIDY "")
  120. set_target_properties(lib_${TARGET_NAME} PROPERTIES CXX_CLANG_TIDY "")
  121. target_include_directories(_${TARGET_NAME} PRIVATE ${cr_INCLUDE_DIR})
  122. target_include_directories(lib_${TARGET_NAME} PRIVATE ${cr_INCLUDE_DIR})
  123. target_link_libraries(lib_${TARGET_NAME} PRIVATE ${CMAKE_DL_LIBS})
  124. add_dependencies(lib_${TARGET_NAME} _${TARGET_NAME})
  125. endfunction()
  126. # Test benchmark
  127. if(ENTT_BUILD_BENCHMARK)
  128. SETUP_BASIC_TEST(benchmark benchmark/benchmark.cpp)
  129. set_target_properties(benchmark PROPERTIES CXX_CLANG_TIDY "")
  130. endif()
  131. # Test example
  132. if(ENTT_BUILD_EXAMPLE)
  133. SETUP_BASIC_TEST(custom_identifier example/custom_identifier.cpp)
  134. SETUP_BASIC_TEST(entity_copy example/entity_copy.cpp)
  135. SETUP_BASIC_TEST(reserved_bits example/reserved_bits.cpp)
  136. SETUP_BASIC_TEST(signal_less example/signal_less.cpp)
  137. endif()
  138. # Test lib
  139. if(ENTT_BUILD_LIB)
  140. FetchContent_Declare(
  141. cr
  142. GIT_REPOSITORY https://github.com/fungos/cr.git
  143. GIT_TAG master
  144. GIT_SHALLOW 1
  145. )
  146. FetchContent_GetProperties(cr)
  147. if(NOT cr_POPULATED)
  148. FetchContent_Populate(cr)
  149. set(cr_INCLUDE_DIR ${cr_SOURCE_DIR})
  150. endif()
  151. SETUP_LIB_SHARED_TEST(dispatcher shared)
  152. SETUP_LIB_PLUGIN_TEST(dispatcher plugin)
  153. SETUP_LIB_SHARED_TEST(emitter shared)
  154. SETUP_LIB_PLUGIN_TEST(emitter plugin)
  155. SETUP_LIB_SHARED_TEST(locator shared)
  156. SETUP_LIB_PLUGIN_TEST(locator plugin)
  157. SETUP_LIB_SHARED_TEST(meta shared)
  158. SETUP_LIB_PLUGIN_TEST(meta plugin)
  159. SETUP_LIB_PLUGIN_TEST(meta plugin_std ENTT_STANDARD_CPP)
  160. SETUP_LIB_SHARED_TEST(registry shared)
  161. SETUP_LIB_PLUGIN_TEST(registry plugin)
  162. endif()
  163. # Test snapshot
  164. if(ENTT_BUILD_SNAPSHOT)
  165. FetchContent_Declare(
  166. cereal
  167. GIT_REPOSITORY https://github.com/USCiLab/cereal.git
  168. GIT_TAG v1.3.2
  169. GIT_SHALLOW 1
  170. )
  171. FetchContent_GetProperties(cereal)
  172. if(NOT cereal_POPULATED)
  173. FetchContent_Populate(cereal)
  174. set(cereal_INCLUDE_DIR ${cereal_SOURCE_DIR}/include)
  175. endif()
  176. SETUP_BASIC_TEST(cereal snapshot/snapshot.cpp)
  177. set_target_properties(cereal PROPERTIES CXX_CLANG_TIDY "")
  178. target_include_directories(cereal PRIVATE ${cereal_INCLUDE_DIR})
  179. endif()
  180. # Test config
  181. SETUP_BASIC_TEST(version entt/config/version.cpp)
  182. # Test container
  183. SETUP_BASIC_TEST(dense_map entt/container/dense_map.cpp)
  184. SETUP_BASIC_TEST(dense_set entt/container/dense_set.cpp)
  185. # Test core
  186. SETUP_BASIC_TEST(algorithm entt/core/algorithm.cpp)
  187. SETUP_BASIC_TEST(any entt/core/any.cpp)
  188. SETUP_BASIC_TEST(compressed_pair entt/core/compressed_pair.cpp)
  189. SETUP_BASIC_TEST(enum entt/core/enum.cpp)
  190. SETUP_BASIC_TEST(family entt/core/family.cpp)
  191. SETUP_BASIC_TEST(hashed_string entt/core/hashed_string.cpp)
  192. SETUP_BASIC_TEST(ident entt/core/ident.cpp)
  193. SETUP_BASIC_TEST(iterator entt/core/iterator.cpp)
  194. SETUP_BASIC_TEST(memory entt/core/memory.cpp)
  195. SETUP_BASIC_TEST(monostate entt/core/monostate.cpp)
  196. SETUP_BASIC_TEST(tuple entt/core/tuple.cpp)
  197. SETUP_BASIC_TEST(type_info entt/core/type_info.cpp)
  198. SETUP_BASIC_TEST(type_traits entt/core/type_traits.cpp)
  199. SETUP_BASIC_TEST(utility entt/core/utility.cpp)
  200. # Test entity
  201. SETUP_BASIC_TEST(component entt/entity/component.cpp)
  202. SETUP_BASIC_TEST(entity entt/entity/entity.cpp)
  203. SETUP_BASIC_TEST(group entt/entity/group.cpp)
  204. SETUP_BASIC_TEST(handle entt/entity/handle.cpp)
  205. SETUP_BASIC_TEST(helper entt/entity/helper.cpp)
  206. SETUP_BASIC_TEST(observer entt/entity/observer.cpp)
  207. SETUP_BASIC_TEST(organizer entt/entity/organizer.cpp)
  208. SETUP_BASIC_TEST(registry entt/entity/registry.cpp)
  209. SETUP_BASIC_TEST(runtime_view entt/entity/runtime_view.cpp)
  210. SETUP_BASIC_TEST(sigh_mixin entt/entity/sigh_mixin.cpp)
  211. SETUP_BASIC_TEST(snapshot entt/entity/snapshot.cpp)
  212. SETUP_BASIC_TEST(sparse_set entt/entity/sparse_set.cpp)
  213. SETUP_BASIC_TEST(storage entt/entity/storage.cpp)
  214. SETUP_BASIC_TEST(storage_entity entt/entity/storage_entity.cpp)
  215. SETUP_BASIC_TEST(storage_no_instance entt/entity/storage_no_instance.cpp)
  216. SETUP_BASIC_TEST(storage_utility entt/entity/storage_utility.cpp)
  217. SETUP_BASIC_TEST(view entt/entity/view.cpp)
  218. # Test graph
  219. SETUP_BASIC_TEST(adjacency_matrix entt/graph/adjacency_matrix.cpp)
  220. SETUP_BASIC_TEST(dot entt/graph/dot.cpp)
  221. SETUP_BASIC_TEST(flow entt/graph/flow.cpp)
  222. # Test locator
  223. SETUP_BASIC_TEST(locator entt/locator/locator.cpp)
  224. # Test meta
  225. SETUP_BASIC_TEST(meta_any entt/meta/meta_any.cpp)
  226. SETUP_BASIC_TEST(meta_base entt/meta/meta_base.cpp)
  227. SETUP_BASIC_TEST(meta_container entt/meta/meta_container.cpp)
  228. SETUP_BASIC_TEST(meta_context entt/meta/meta_context.cpp)
  229. SETUP_BASIC_TEST(meta_conv entt/meta/meta_conv.cpp)
  230. SETUP_BASIC_TEST(meta_ctor entt/meta/meta_ctor.cpp)
  231. SETUP_BASIC_TEST(meta_data entt/meta/meta_data.cpp)
  232. SETUP_BASIC_TEST(meta_dtor entt/meta/meta_dtor.cpp)
  233. SETUP_BASIC_TEST(meta_func entt/meta/meta_func.cpp)
  234. SETUP_BASIC_TEST(meta_handle entt/meta/meta_handle.cpp)
  235. SETUP_BASIC_TEST(meta_pointer entt/meta/meta_pointer.cpp)
  236. SETUP_BASIC_TEST(meta_prop entt/meta/meta_prop.cpp)
  237. SETUP_BASIC_TEST(meta_range entt/meta/meta_range.cpp)
  238. SETUP_BASIC_TEST(meta_template entt/meta/meta_template.cpp)
  239. SETUP_BASIC_TEST(meta_type entt/meta/meta_type.cpp)
  240. SETUP_BASIC_TEST(meta_utility entt/meta/meta_utility.cpp)
  241. # Test poly
  242. SETUP_BASIC_TEST(poly entt/poly/poly.cpp)
  243. # Test process
  244. SETUP_BASIC_TEST(process entt/process/process.cpp)
  245. SETUP_BASIC_TEST(scheduler entt/process/scheduler.cpp)
  246. # Test resource
  247. SETUP_BASIC_TEST(resource entt/resource/resource.cpp)
  248. SETUP_BASIC_TEST(resource_cache entt/resource/resource_cache.cpp)
  249. SETUP_BASIC_TEST(resource_loader entt/resource/resource_loader.cpp)
  250. # Test signal
  251. SETUP_BASIC_TEST(delegate entt/signal/delegate.cpp)
  252. SETUP_BASIC_TEST(dispatcher entt/signal/dispatcher.cpp)
  253. SETUP_BASIC_TEST(emitter entt/signal/emitter.cpp)
  254. SETUP_BASIC_TEST(sigh entt/signal/sigh.cpp)