CMakeLists.txt 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. # Copyright Louis Dionne 2013-2017
  2. # Distributed under the Boost Software License, Version 1.0.
  3. # (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
  4. add_custom_target(tests COMMENT "Build all the unit tests.")
  5. add_dependencies(hana_check tests)
  6. ##############################################################################
  7. # Take note of files that depend on Boost
  8. ##############################################################################
  9. file(GLOB_RECURSE TESTS_REQUIRING_BOOST "ext/boost/*.cpp"
  10. "experimental/printable/*.cpp")
  11. file(GLOB_RECURSE PUBLIC_HEADERS_REQUIRING_BOOST
  12. RELATIVE "${Boost.Hana_SOURCE_DIR}/include"
  13. "${Boost.Hana_SOURCE_DIR}/include/boost/hana/ext/boost/*.hpp"
  14. "${Boost.Hana_SOURCE_DIR}/include/boost/hana/ext/boost.hpp"
  15. "${Boost.Hana_SOURCE_DIR}/include/boost/hana/experimental/printable.hpp"
  16. )
  17. ##############################################################################
  18. # Caveats: Take note of public headers and tests that are not supported.
  19. ##############################################################################
  20. if (NOT Boost_FOUND)
  21. list(APPEND EXCLUDED_UNIT_TESTS ${TESTS_REQUIRING_BOOST})
  22. list(APPEND EXCLUDED_PUBLIC_HEADERS ${PUBLIC_HEADERS_REQUIRING_BOOST})
  23. endif()
  24. # The experimental::type_name test is only supported on Clang and AppleClang >= 7.0
  25. if (NOT (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang"
  26. OR (${CMAKE_CXX_COMPILER_ID} STREQUAL "AppleClang" AND
  27. NOT ${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 7)))
  28. list(APPEND EXCLUDED_PUBLIC_HEADERS
  29. "boost/hana/experimental/type_name.hpp")
  30. list(APPEND EXCLUDED_UNIT_TESTS "experimental/type_name.cpp")
  31. endif()
  32. # On Windows, Clang-cl emulates a MSVC bug that causes EBO not to be applied
  33. # properly. We disable the tests that check for EBO.
  34. if (MSVC AND ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
  35. list(APPEND EXCLUDED_UNIT_TESTS
  36. "detail/ebo.cpp"
  37. "issues/github_202.cpp"
  38. "pair/empty_storage.cpp"
  39. "tuple/empty_member.cpp"
  40. )
  41. endif()
  42. ##############################################################################
  43. # Generate tests that include each public header.
  44. # The headers that were excluded above due to caveats are ignored here.
  45. ##############################################################################
  46. add_custom_target(test.headers COMMENT "Build all the header-inclusion unit tests.")
  47. add_dependencies(tests test.headers)
  48. file(GLOB_RECURSE PUBLIC_HEADERS
  49. RELATIVE "${Boost.Hana_SOURCE_DIR}/include"
  50. "${Boost.Hana_SOURCE_DIR}/include/*.hpp"
  51. )
  52. list(REMOVE_ITEM PUBLIC_HEADERS ${PUBLIC_HEADERS_REQUIRING_BOOST})
  53. include(TestHeaders)
  54. add_header_test(test.headers.standalone EXCLUDE_FROM_ALL
  55. HEADERS ${PUBLIC_HEADERS}
  56. EXCLUDE ${EXCLUDED_PUBLIC_HEADERS})
  57. target_link_libraries(test.headers.standalone PRIVATE hana)
  58. add_dependencies(test.headers test.headers.standalone)
  59. if (Boost_FOUND)
  60. add_header_test(test.headers.boost EXCLUDE_FROM_ALL
  61. HEADERS ${PUBLIC_HEADERS_REQUIRING_BOOST}
  62. EXCLUDE ${EXCLUDED_PUBLIC_HEADERS})
  63. target_link_libraries(test.headers.boost PRIVATE hana Boost::boost)
  64. add_dependencies(test.headers test.headers.boost)
  65. endif()
  66. ##############################################################################
  67. # Check for ODR violations when linking several translation units
  68. # (GitHub issue 75)
  69. ##############################################################################
  70. list(APPEND EXCLUDED_UNIT_TESTS "issues/github_75/*.cpp")
  71. boost_hana_target_name_for(github_75 "${CMAKE_CURRENT_LIST_DIR}/issues/github_75")
  72. add_executable(${github_75} EXCLUDE_FROM_ALL "issues/github_75/tu1.cpp" "issues/github_75/tu2.cpp")
  73. boost_hana_set_test_properties(${github_75})
  74. add_test(${github_75} "${CMAKE_CURRENT_BINARY_DIR}/${github_75}")
  75. add_dependencies(tests ${github_75})
  76. ##############################################################################
  77. # Add all the remaining unit tests
  78. ##############################################################################
  79. file(GLOB_RECURSE UNIT_TESTS "*.cpp")
  80. file(GLOB_RECURSE EXCLUDED_UNIT_TESTS ${EXCLUDED_UNIT_TESTS})
  81. list(REMOVE_ITEM UNIT_TESTS ${EXCLUDED_UNIT_TESTS})
  82. foreach(_file IN LISTS UNIT_TESTS)
  83. boost_hana_target_name_for(_target "${_file}")
  84. add_executable(${_target} EXCLUDE_FROM_ALL "${_file}")
  85. boost_hana_set_test_properties(${_target})
  86. if (_file IN_LIST TESTS_REQUIRING_BOOST)
  87. target_link_libraries(${_target} PRIVATE Boost::boost)
  88. endif()
  89. target_include_directories(${_target} PRIVATE _include)
  90. add_test(${_target} "${CMAKE_CURRENT_BINARY_DIR}/${_target}")
  91. add_dependencies(tests ${_target})
  92. endforeach()
  93. ##############################################################################
  94. # Add the deployment test, which checks that we can indeed install `hana` and
  95. # then use the provided `HanaConfig.cmake` config file to use `hana` from an
  96. # external project.
  97. ##############################################################################
  98. include(ExternalProject)
  99. set(HANA_FAKE_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/deploy/fakeroot")
  100. ExternalProject_Add(test.deploy.fakeroot
  101. SOURCE_DIR "${PROJECT_SOURCE_DIR}"
  102. EXCLUDE_FROM_ALL TRUE
  103. BUILD_ALWAYS TRUE
  104. CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${HANA_FAKE_INSTALL_DIR}
  105. -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
  106. -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
  107. TEST_COMMAND "" # Disable test step
  108. UPDATE_COMMAND "" # Disable source work-tree update
  109. )
  110. add_custom_target(test.deploy
  111. DEPENDS test.deploy.fakeroot
  112. COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/deploy/build"
  113. COMMAND ${CMAKE_COMMAND} -E chdir "${CMAKE_CURRENT_BINARY_DIR}/deploy/build"
  114. ${CMAKE_COMMAND} "${CMAKE_CURRENT_SOURCE_DIR}/deploy"
  115. -DCMAKE_CXX_COMPILER="${CMAKE_CXX_COMPILER}"
  116. -DCMAKE_PREFIX_PATH="${HANA_FAKE_INSTALL_DIR}"
  117. -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
  118. -DCMAKE_TOOLCHAIN_FILE="${CMAKE_TOOLCHAIN_FILE}"
  119. COMMAND ${CMAKE_COMMAND} --build "${CMAKE_CURRENT_BINARY_DIR}/deploy/build"
  120. USES_TERMINAL
  121. )
  122. add_dependencies(hana_check test.deploy)