CMakeLists.txt 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. #
  2. # EnTT
  3. #
  4. cmake_minimum_required(VERSION 3.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 2.6.1)
  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) 2018 ${PROJECT_AUTHOR} <${PROJECT_AUTHOR_EMAIL}>")
  26. message("*")
  27. option(ENTT_COMPILE_OPTIONS "Use compile options from EnTT." ON)
  28. option(USE_LIBCPP "Use libc++ by adding -stdlib=libc++ flag if availbale." ON)
  29. #
  30. # Compiler stuff
  31. #
  32. if(NOT MSVC AND USE_LIBCPP)
  33. include(CheckCXXSourceCompiles)
  34. include(CMakePushCheckState)
  35. cmake_push_check_state()
  36. set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -stdlib=libc++")
  37. check_cxx_source_compiles("
  38. #include<type_traits>
  39. int main() { return std::is_same<int, int>::value ? 0 : 1; }
  40. " HAS_LIBCPP)
  41. if(NOT HAS_LIBCPP)
  42. message(WARNING "The option USE_LIBCPP is set (by default) but libc++ is not available. The flag will not be added to the target.")
  43. endif()
  44. cmake_pop_check_state()
  45. endif()
  46. #
  47. # Add EnTT target
  48. #
  49. add_library(EnTT INTERFACE)
  50. target_include_directories(
  51. EnTT INTERFACE
  52. $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>
  53. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  54. )
  55. target_compile_definitions(
  56. EnTT
  57. INTERFACE $<$<AND:$<CONFIG:Debug>,$<NOT:$<CXX_COMPILER_ID:MSVC>>>:DEBUG>
  58. INTERFACE $<$<AND:$<CONFIG:Release>,$<NOT:$<CXX_COMPILER_ID:MSVC>>>:RELEASE>
  59. )
  60. if(ENTT_COMPILE_OPTIONS)
  61. target_compile_options(
  62. EnTT
  63. INTERFACE $<$<AND:$<CONFIG:Debug>,$<NOT:$<CXX_COMPILER_ID:MSVC>>>:-O0 -g>
  64. # it seems that -O3 ruins the performance when using clang ...
  65. INTERFACE $<$<AND:$<CONFIG:Release>,$<CXX_COMPILER_ID:Clang>>:-O2>
  66. # ... on the other side, GCC is incredibly comfortable with it.
  67. INTERFACE $<$<AND:$<CONFIG:Release>,$<CXX_COMPILER_ID:GNU>>:-O3>
  68. )
  69. endif()
  70. if(USE_LIBCPP AND HAS_LIBCPP)
  71. target_compile_options(EnTT BEFORE INTERFACE -stdlib=libc++)
  72. endif()
  73. target_compile_features(EnTT INTERFACE cxx_std_14)
  74. #
  75. # Install EnTT
  76. #
  77. if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
  78. set(ENTT_INSTALL_CONFIGDIR cmake)
  79. else()
  80. set(ENTT_INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/entt)
  81. endif()
  82. install(DIRECTORY src/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
  83. install(TARGETS EnTT EXPORT EnTTTargets)
  84. export(EXPORT EnTTTargets FILE ${entt_BINARY_DIR}/EnTTTargets.cmake)
  85. install(
  86. EXPORT EnTTTargets
  87. FILE EnTTTargets.cmake
  88. DESTINATION ${ENTT_INSTALL_CONFIGDIR}
  89. )
  90. #
  91. # Build tree package config file
  92. #
  93. configure_file(cmake/in/EnTTBuildConfig.cmake.in EnTTConfig.cmake @ONLY)
  94. include(CMakePackageConfigHelpers)
  95. #
  96. # Install tree package config file
  97. #
  98. configure_package_config_file(
  99. cmake/in/EnTTConfig.cmake.in
  100. ${ENTT_INSTALL_CONFIGDIR}/EnTTConfig.cmake
  101. INSTALL_DESTINATION ${ENTT_INSTALL_CONFIGDIR}
  102. PATH_VARS CMAKE_INSTALL_INCLUDEDIR
  103. NO_CHECK_REQUIRED_COMPONENTS_MACRO
  104. )
  105. write_basic_package_version_file(
  106. ${entt_BINARY_DIR}/EnTTConfigVersion.cmake
  107. VERSION ${PROJECT_VERSION}
  108. COMPATIBILITY AnyNewerVersion
  109. )
  110. install(
  111. FILES
  112. ${entt_BINARY_DIR}/${ENTT_INSTALL_CONFIGDIR}/EnTTConfig.cmake
  113. ${entt_BINARY_DIR}/EnTTConfigVersion.cmake
  114. DESTINATION ${ENTT_INSTALL_CONFIGDIR}
  115. )
  116. export(PACKAGE EnTT)
  117. #
  118. # Tests
  119. #
  120. option(BUILD_TESTING "Enable testing with ctest." ON)
  121. if(BUILD_TESTING)
  122. set(THREADS_PREFER_PTHREAD_FLAG ON)
  123. find_package(Threads REQUIRED)
  124. option(BUILD_BENCHMARK "Build benchmark." OFF)
  125. option(BUILD_MOD "Build mod example." OFF)
  126. option(BUILD_SNAPSHOT "Build snapshot example." OFF)
  127. # gtest, gtest_main, gmock and gmock_main targets are available from now on
  128. set(GOOGLETEST_DEPS_DIR ${entt_SOURCE_DIR}/deps/googletest)
  129. configure_file(${entt_SOURCE_DIR}/cmake/in/googletest.in ${GOOGLETEST_DEPS_DIR}/CMakeLists.txt)
  130. execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . WORKING_DIRECTORY ${GOOGLETEST_DEPS_DIR})
  131. execute_process(COMMAND ${CMAKE_COMMAND} --build . WORKING_DIRECTORY ${GOOGLETEST_DEPS_DIR})
  132. set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
  133. add_subdirectory(${GOOGLETEST_DEPS_DIR}/src ${GOOGLETEST_DEPS_DIR}/build)
  134. enable_testing()
  135. add_subdirectory(test)
  136. endif()
  137. #
  138. # Documentation
  139. #
  140. option(BUILD_DOCS "Enable building with documentation." OFF)
  141. if(BUILD_DOCS)
  142. find_package(Doxygen 1.8)
  143. if(DOXYGEN_FOUND)
  144. add_subdirectory(docs)
  145. endif()
  146. endif()
  147. #
  148. # AOB
  149. #
  150. add_custom_target(
  151. entt_aob
  152. SOURCES
  153. appveyor.yml
  154. AUTHORS
  155. CONTRIBUTING
  156. LICENSE
  157. README.md
  158. TODO
  159. .travis.yml
  160. )