CMakeLists.txt 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. #
  2. # EnTT
  3. #
  4. cmake_minimum_required(VERSION 3.7.2)
  5. #
  6. # Building in-tree is not allowed (we take care of your craziness).
  7. #
  8. if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
  9. message(FATAL_ERROR "Prevented in-tree built. Please create a build directory outside of the source code and call cmake from there. Thank you.")
  10. endif()
  11. #
  12. # Project configuration
  13. #
  14. project(EnTT VERSION 3.2.0 LANGUAGES CXX)
  15. include(GNUInstallDirs)
  16. if(NOT CMAKE_BUILD_TYPE)
  17. set(CMAKE_BUILD_TYPE Debug)
  18. endif()
  19. set(SETTINGS_ORGANIZATION "Michele Caini")
  20. set(SETTINGS_APPLICATION ${PROJECT_NAME})
  21. set(PROJECT_AUTHOR "Michele Caini")
  22. set(PROJECT_AUTHOR_EMAIL "michele.caini@gmail.com")
  23. message("*")
  24. message("* ${PROJECT_NAME} v${PROJECT_VERSION} (${CMAKE_BUILD_TYPE})")
  25. message("* Copyright (c) 2017-2019 ${PROJECT_AUTHOR} <${PROJECT_AUTHOR_EMAIL}>")
  26. message("*")
  27. option(USE_LIBCPP "Use libc++ by adding -stdlib=libc++ flag if availbale." ON)
  28. option(USE_ASAN "Use address sanitizer by adding -fsanitize=address -fno-omit-frame-pointer flags" OFF)
  29. option(USE_COMPILE_OPTIONS "Use compile options from EnTT." ON)
  30. #
  31. # Compiler stuff
  32. #
  33. if(NOT WIN32 AND USE_LIBCPP)
  34. include(CheckCXXSourceCompiles)
  35. include(CMakePushCheckState)
  36. cmake_push_check_state()
  37. set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -stdlib=libc++")
  38. check_cxx_source_compiles("
  39. #include<type_traits>
  40. int main() { return std::is_same_v<int, char>; }
  41. " HAS_LIBCPP)
  42. if(NOT HAS_LIBCPP)
  43. message(WARNING "The option USE_LIBCPP is set (by default) but libc++ is not available. The flag will not be added to the target.")
  44. endif()
  45. cmake_pop_check_state()
  46. endif()
  47. #
  48. # Add EnTT target
  49. #
  50. add_library(EnTT INTERFACE)
  51. add_library(EnTT::EnTT ALIAS EnTT)
  52. configure_file(${EnTT_SOURCE_DIR}/cmake/in/version.h.in ${EnTT_SOURCE_DIR}/src/entt/config/version.h @ONLY)
  53. target_include_directories(
  54. EnTT INTERFACE
  55. $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>
  56. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  57. )
  58. target_compile_definitions(
  59. EnTT
  60. INTERFACE $<$<AND:$<CONFIG:Debug>,$<NOT:$<CXX_COMPILER_ID:MSVC>>>:DEBUG>
  61. INTERFACE $<$<AND:$<CONFIG:Release>,$<NOT:$<CXX_COMPILER_ID:MSVC>>>:RELEASE>
  62. )
  63. if(USE_ASAN)
  64. target_compile_options(EnTT INTERFACE $<$<AND:$<CONFIG:Debug>,$<NOT:$<PLATFORM_ID:Windows>>>:-fsanitize=address -fno-omit-frame-pointer>)
  65. target_link_libraries(EnTT INTERFACE $<$<AND:$<CONFIG:Debug>,$<NOT:$<PLATFORM_ID:Windows>>>:-fsanitize=address -fno-omit-frame-pointer>)
  66. endif()
  67. if(USE_COMPILE_OPTIONS)
  68. target_compile_options(
  69. EnTT
  70. INTERFACE $<$<AND:$<CONFIG:Debug>,$<NOT:$<PLATFORM_ID:Windows>>>:-O0 -g>
  71. # it seems that -O3 ruins a bit the performance when using clang ...
  72. INTERFACE $<$<AND:$<CONFIG:Release>,$<CXX_COMPILER_ID:Clang>,$<OR:$<PLATFORM_ID:Darwin>,$<PLATFORM_ID:Linux>>>:-O2>
  73. # ... on the other side, GCC is incredibly comfortable with it.
  74. INTERFACE $<$<AND:$<CONFIG:Release>,$<CXX_COMPILER_ID:GNU>>:-O3>
  75. )
  76. endif()
  77. if(HAS_LIBCPP)
  78. target_compile_options(EnTT BEFORE INTERFACE -stdlib=libc++)
  79. endif()
  80. target_compile_features(EnTT INTERFACE cxx_std_17)
  81. #
  82. # Install EnTT
  83. #
  84. if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
  85. set(CUSTOM_INSTALL_CONFIGDIR cmake)
  86. else()
  87. set(CUSTOM_INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/entt)
  88. endif()
  89. install(DIRECTORY src/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
  90. install(TARGETS EnTT EXPORT EnTTTargets)
  91. export(EXPORT EnTTTargets FILE ${EnTT_BINARY_DIR}/EnTTTargets.cmake)
  92. install(
  93. EXPORT EnTTTargets
  94. FILE EnTTTargets.cmake
  95. DESTINATION ${CUSTOM_INSTALL_CONFIGDIR}
  96. NAMESPACE EnTT::
  97. )
  98. #
  99. # Build tree package config file
  100. #
  101. configure_file(cmake/in/EnTTBuildConfig.cmake.in EnTTConfig.cmake @ONLY)
  102. include(CMakePackageConfigHelpers)
  103. #
  104. # Install tree package config file
  105. #
  106. configure_package_config_file(
  107. cmake/in/EnTTConfig.cmake.in
  108. ${CUSTOM_INSTALL_CONFIGDIR}/EnTTConfig.cmake
  109. INSTALL_DESTINATION ${CUSTOM_INSTALL_CONFIGDIR}
  110. PATH_VARS CMAKE_INSTALL_INCLUDEDIR
  111. )
  112. write_basic_package_version_file(
  113. ${EnTT_BINARY_DIR}/EnTTConfigVersion.cmake
  114. VERSION ${PROJECT_VERSION}
  115. COMPATIBILITY AnyNewerVersion
  116. )
  117. install(
  118. FILES
  119. ${EnTT_BINARY_DIR}/${CUSTOM_INSTALL_CONFIGDIR}/EnTTConfig.cmake
  120. ${EnTT_BINARY_DIR}/EnTTConfigVersion.cmake
  121. DESTINATION ${CUSTOM_INSTALL_CONFIGDIR}
  122. )
  123. export(PACKAGE EnTT)
  124. #
  125. # Tests
  126. #
  127. option(BUILD_TESTING "Enable testing with ctest." OFF)
  128. if(BUILD_TESTING)
  129. set(THREADS_PREFER_PTHREAD_FLAG ON)
  130. find_package(Threads REQUIRED)
  131. option(FIND_GTEST_PACKAGE "Enable finding gtest package." OFF)
  132. if(FIND_GTEST_PACKAGE)
  133. find_package(GTest REQUIRED)
  134. else()
  135. # gtest, gtest_main, gmock and gmock_main targets are available from now on
  136. set(GOOGLETEST_DEPS_DIR ${EnTT_SOURCE_DIR}/deps/googletest)
  137. configure_file(${EnTT_SOURCE_DIR}/cmake/in/googletest.in ${GOOGLETEST_DEPS_DIR}/CMakeLists.txt)
  138. execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . WORKING_DIRECTORY ${GOOGLETEST_DEPS_DIR})
  139. execute_process(COMMAND ${CMAKE_COMMAND} --build . WORKING_DIRECTORY ${GOOGLETEST_DEPS_DIR})
  140. set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
  141. add_subdirectory(${GOOGLETEST_DEPS_DIR}/src ${GOOGLETEST_DEPS_DIR}/build)
  142. target_compile_features(gmock_main PRIVATE $<TARGET_PROPERTY:EnTT,INTERFACE_COMPILE_FEATURES>)
  143. target_compile_features(gmock PRIVATE $<TARGET_PROPERTY:EnTT,INTERFACE_COMPILE_FEATURES>)
  144. add_library(GTest::Main ALIAS gtest_main)
  145. endif()
  146. option(BUILD_BENCHMARK "Build benchmark." OFF)
  147. option(BUILD_LIB "Build lib example." OFF)
  148. option(BUILD_MOD "Build mod example." OFF)
  149. option(BUILD_SNAPSHOT "Build snapshot example." OFF)
  150. if(BUILD_MOD)
  151. enable_language(C)
  152. endif()
  153. enable_testing()
  154. add_subdirectory(test)
  155. endif()
  156. #
  157. # Documentation
  158. #
  159. option(BUILD_DOCS "Enable building with documentation." OFF)
  160. if(BUILD_DOCS)
  161. find_package(Doxygen 1.8)
  162. if(DOXYGEN_FOUND)
  163. add_subdirectory(docs)
  164. endif()
  165. endif()
  166. #
  167. # AOB
  168. #
  169. FILE(GLOB GH_WORKFLOWS .github/workflows/*.yml)
  170. add_custom_target(
  171. entt_aob
  172. SOURCES
  173. ${GH_WORKFLOWS}
  174. .github/FUNDING.yml
  175. AUTHORS
  176. CONTRIBUTING.md
  177. LICENSE
  178. README.md
  179. TODO
  180. )