CMakeLists.txt 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. # Copyright Eric Niebler 2014
  2. # Copyright Gonzalo Brito Gadeschi 2014, 2017
  3. # Copyright Louis Dionne 2015
  4. # Copyright Casey Carter 2016
  5. # Distributed under the Boost Software License, Version 1.0.
  6. # (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
  7. cmake_minimum_required(VERSION 3.6)
  8. get_directory_property(is_subproject PARENT_DIRECTORY)
  9. if(NOT is_subproject)
  10. set(is_standalone YES)
  11. else()
  12. set(is_standalone NO)
  13. endif()
  14. project(Range-v3 CXX)
  15. list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
  16. set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # Export compilation data-base
  17. set_property(GLOBAL PROPERTY USE_FOLDERS ON)
  18. include(ranges_options)
  19. include(ranges_env)
  20. include(ranges_flags)
  21. add_library(range-v3-meta INTERFACE)
  22. add_library(range-v3::meta ALIAS range-v3-meta)
  23. target_include_directories(range-v3-meta INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/>)
  24. target_include_directories(range-v3-meta SYSTEM INTERFACE $<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>)
  25. target_compile_options(range-v3-meta INTERFACE $<$<COMPILE_LANG_AND_ID:CXX,MSVC>:/permissive->
  26. $<$<COMPILE_LANG_AND_ID:CUDA,MSVC>:-Xcompiler=/permissive->)
  27. add_library(range-v3-concepts INTERFACE)
  28. add_library(range-v3::concepts ALIAS range-v3-concepts)
  29. target_include_directories(range-v3-concepts INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/>)
  30. target_include_directories(range-v3-concepts SYSTEM INTERFACE $<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>)
  31. target_compile_options(range-v3-concepts INTERFACE $<$<COMPILE_LANG_AND_ID:CXX,MSVC>:/permissive->
  32. $<$<COMPILE_LANG_AND_ID:CUDA,MSVC>:-Xcompiler=/permissive->)
  33. target_link_libraries(range-v3-concepts INTERFACE range-v3::meta)
  34. add_library(range-v3 INTERFACE)
  35. add_library(range-v3::range-v3 ALIAS range-v3)
  36. target_include_directories(range-v3 INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/>)
  37. target_include_directories(range-v3 SYSTEM INTERFACE $<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>)
  38. target_compile_options(range-v3 INTERFACE $<$<COMPILE_LANG_AND_ID:CXX,MSVC>:/permissive->
  39. $<$<COMPILE_LANG_AND_ID:CUDA,MSVC>:-Xcompiler=/permissive->)
  40. target_link_libraries(range-v3 INTERFACE range-v3::concepts range-v3::meta)
  41. function(rv3_add_test TESTNAME EXENAME FIRSTSOURCE)
  42. add_executable(range.v3.${EXENAME} ${FIRSTSOURCE} ${ARGN})
  43. target_link_libraries(range.v3.${EXENAME} range-v3)
  44. add_test(range.v3.${TESTNAME} range.v3.${EXENAME})
  45. endfunction(rv3_add_test)
  46. if(RANGE_V3_DOCS)
  47. add_subdirectory(doc)
  48. endif()
  49. if(RANGE_V3_TESTS)
  50. include(CTest)
  51. add_subdirectory(test)
  52. endif()
  53. if(RANGE_V3_EXAMPLES)
  54. add_subdirectory(example)
  55. endif()
  56. if(RANGE_V3_PERF)
  57. include(gtest)
  58. include(gbenchmark)
  59. add_subdirectory(perf)
  60. endif()
  61. # Add header files as sources to fix MSVS 2017 not finding source during debugging
  62. file(GLOB_RECURSE RANGE_V3_PUBLIC_HEADERS_ABSOLUTE
  63. "${CMAKE_CURRENT_SOURCE_DIR}/include/*.hpp")
  64. add_custom_target(range.v3.headers SOURCES ${RANGE_V3_PUBLIC_HEADERS_ABSOLUTE})
  65. set_target_properties(range.v3.headers PROPERTIES FOLDER "header")
  66. # Test all headers
  67. if(RANGE_V3_HEADER_CHECKS)
  68. include(TestHeaders)
  69. file(GLOB_RECURSE RANGE_V3_PUBLIC_HEADERS
  70. RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/include"
  71. "${CMAKE_CURRENT_SOURCE_DIR}/include/*.hpp")
  72. # These headers are not meant to be included directly:
  73. list(REMOVE_ITEM RANGE_V3_PUBLIC_HEADERS std/detail/associated_types.hpp)
  74. list(REMOVE_ITEM RANGE_V3_PUBLIC_HEADERS range/v3/detail/epilogue.hpp)
  75. # Deprecated headers
  76. if(CMAKE_CXX_COMPILER_ID STREQUAL GNU)
  77. foreach(header ${RANGE_V3_PUBLIC_HEADERS})
  78. file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/include/${header}" is_deprecated
  79. LIMIT_COUNT 1
  80. REGEX ".*RANGES_DEPRECATED_HEADER.*")
  81. if(is_deprecated)
  82. list(APPEND RANGE_V3_DEPRECATED_PUBLIC_HEADERS "${header}")
  83. endif()
  84. endforeach()
  85. endif()
  86. if(NOT RANGE_V3_COROUTINE_FLAGS)
  87. # Can't test this header if we can't even compile it
  88. list(APPEND RANGE_V3_DEPRECATED_PUBLIC_HEADERS range/v3/experimental/utility/generator.hpp)
  89. endif()
  90. add_header_test(test.range.v3.headers
  91. EXCLUDE ${RANGE_V3_DEPRECATED_PUBLIC_HEADERS}
  92. HEADERS ${RANGE_V3_PUBLIC_HEADERS})
  93. target_link_libraries(test.range.v3.headers PRIVATE range-v3)
  94. endif()
  95. # Grab the range-v3 version numbers:
  96. include(${CMAKE_CURRENT_SOURCE_DIR}/Version.cmake)
  97. set(RANGE_V3_VERSION ${RANGE_V3_MAJOR}.${RANGE_V3_MINOR}.${RANGE_V3_PATCHLEVEL})
  98. # Try to build a new version.hpp
  99. configure_file(version.hpp.in include/range/v3/version.hpp @ONLY)
  100. file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/include/range/v3/version.hpp RANGE_V3_OLD_VERSION_HPP)
  101. file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/include/range/v3/version.hpp RANGE_V3_NEW_VERSION_HPP)
  102. # If the new version.hpp is materially different from the one in the source
  103. # directory, update it, commit, and tag.
  104. if(NOT RANGE_V3_NEW_VERSION_HPP STREQUAL RANGE_V3_OLD_VERSION_HPP)
  105. # Check that doc/release_notes.md and Version.cmake are the only changed file:
  106. execute_process(
  107. COMMAND ${GIT_EXECUTABLE} -C "${CMAKE_CURRENT_SOURCE_DIR}" status --porcelain -uno
  108. OUTPUT_VARIABLE RANGE_V3_GIT_STATUS
  109. OUTPUT_STRIP_TRAILING_WHITESPACE
  110. )
  111. string(REPLACE "\n" ";" RANGE_V3_GIT_STATUS ${RANGE_V3_GIT_STATUS})
  112. if (NOT "x${RANGE_V3_GIT_STATUS}" STREQUAL "x M Version.cmake; M doc/release_notes.md")
  113. message(FATAL_ERROR "Cannot update version.hpp: range-v3 source directory has a dirty status")
  114. endif()
  115. file(
  116. COPY ${CMAKE_CURRENT_BINARY_DIR}/include/range/v3/version.hpp
  117. DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/include/range/v3
  118. )
  119. execute_process(
  120. COMMAND ${GIT_EXECUTABLE} -C "${CMAKE_CURRENT_SOURCE_DIR}" add -u
  121. )
  122. execute_process(
  123. COMMAND ${GIT_EXECUTABLE} -C "${CMAKE_CURRENT_SOURCE_DIR}" commit -m "${RANGE_V3_VERSION}"
  124. )
  125. execute_process(
  126. COMMAND ${GIT_EXECUTABLE} -C "${CMAKE_CURRENT_SOURCE_DIR}" tag -f -a "${RANGE_V3_VERSION}" -m "${RANGE_V3_VERSION}"
  127. )
  128. find_program(CONAN_EXECUTABLE NAMES conan conan.exe)
  129. if (NOT "x${CONAN_EXECUTABLE}" STREQUAL "xCONAN_EXECUTABLE-NOTFOUND")
  130. message(STATUS "Exporting conanfile for new version")
  131. execute_process(
  132. COMMAND ${CONAN_EXECUTABLE} create . range-v3/${RANGE_V3_VERSION}@ericniebler/stable
  133. WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
  134. )
  135. endif()
  136. message(STATUS "Version updated to ${RANGE_V3_VERSION}. Don't forget to:")
  137. message(STATUS " git push origin <feature-branch>")
  138. message(STATUS "and (after that is merged to master) then:")
  139. message(STATUS " conan remote add range-v3 https://api.bintray.com/conan/range-v3/range-v3")
  140. message(STATUS " conan create ${CMAKE_CURRENT_SOURCE_DIR} range-v3/${RANGE_V3_VERSION}@ericniebler/stable")
  141. message(STATUS " conan upload --all range-v3/${RANGE_V3_VERSION}@ericniebler/stable -r=range-v3")
  142. endif()
  143. include(CMakePackageConfigHelpers)
  144. # write_basic_package_version_file(...) gained ARCH_INDEPENDENT in CMake 3.14.
  145. # For CMake 3.6, this workaround makes the version file ARCH_INDEPENDENT
  146. # by making CMAKE_SIZEOF_VOID_P empty.
  147. set(OLD_CMAKE_SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
  148. set(CMAKE_SIZEOF_VOID_P "")
  149. write_basic_package_version_file(
  150. ${CMAKE_CURRENT_BINARY_DIR}/range-v3-config-version.cmake
  151. VERSION ${RANGE_V3_VERSION}
  152. COMPATIBILITY ExactVersion
  153. )
  154. set(CMAKE_SIZEOF_VOID_P ${OLD_CMAKE_SIZEOF_VOID_P})
  155. include(GNUInstallDirs)
  156. install(TARGETS range-v3-concepts range-v3-meta range-v3 EXPORT range-v3-targets DESTINATION ${CMAKE_INSTALL_LIBDIR})
  157. install(EXPORT range-v3-targets FILE range-v3-targets.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/range-v3)
  158. install(FILES
  159. ${CMAKE_CURRENT_BINARY_DIR}/range-v3-config-version.cmake
  160. cmake/range-v3-config.cmake
  161. DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/range-v3)
  162. install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} FILES_MATCHING PATTERN "*")
  163. export(EXPORT range-v3-targets FILE range-v3-config.cmake)