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