]>
Commit | Line | Data |
---|---|---|
b32b8144 | 1 | # Copyright Louis Dionne 2013-2017 |
7c673cae FG |
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 | ||
5 | add_custom_target(tests COMMENT "Build all the unit tests.") | |
92f5a8d4 | 6 | add_dependencies(hana_check tests) |
7c673cae FG |
7 | |
8 | ||
b32b8144 FG |
9 | ############################################################################## |
10 | # Take note of files that depend on Boost | |
11 | ############################################################################## | |
12 | file(GLOB_RECURSE TESTS_REQUIRING_BOOST "ext/boost/*.cpp" | |
13 | "experimental/printable/*.cpp") | |
14 | ||
15 | file(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 | ||
7c673cae FG |
23 | ############################################################################## |
24 | # Caveats: Take note of public headers and tests that are not supported. | |
25 | ############################################################################## | |
26 | if (NOT Boost_FOUND) | |
b32b8144 FG |
27 | list(APPEND EXCLUDED_UNIT_TESTS ${TESTS_REQUIRING_BOOST}) |
28 | list(APPEND EXCLUDED_PUBLIC_HEADERS ${PUBLIC_HEADERS_REQUIRING_BOOST}) | |
7c673cae FG |
29 | endif() |
30 | ||
92f5a8d4 TL |
31 | # The experimental::type_name test is only supported on Clang and AppleClang >= 7.0 |
32 | if (NOT (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang" | |
7c673cae FG |
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") | |
38 | endif() | |
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. | |
42 | if (MSVC AND ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") | |
43 | list(APPEND EXCLUDED_UNIT_TESTS | |
b32b8144 | 44 | "detail/ebo.cpp" |
7c673cae | 45 | "issues/github_202.cpp" |
b32b8144 FG |
46 | "pair/empty_storage.cpp" |
47 | "tuple/empty_member.cpp" | |
7c673cae FG |
48 | ) |
49 | endif() | |
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 | ############################################################################## | |
11fdf7f2 TL |
56 | add_custom_target(test.headers COMMENT "Build all the header-inclusion unit tests.") |
57 | add_dependencies(tests test.headers) | |
58 | ||
7c673cae FG |
59 | file(GLOB_RECURSE PUBLIC_HEADERS |
60 | RELATIVE "${Boost.Hana_SOURCE_DIR}/include" | |
61 | "${Boost.Hana_SOURCE_DIR}/include/*.hpp" | |
62 | ) | |
b32b8144 | 63 | list(REMOVE_ITEM PUBLIC_HEADERS ${PUBLIC_HEADERS_REQUIRING_BOOST}) |
7c673cae | 64 | |
7c673cae | 65 | include(TestHeaders) |
11fdf7f2 TL |
66 | add_header_test(test.headers.standalone EXCLUDE_FROM_ALL |
67 | HEADERS ${PUBLIC_HEADERS} | |
68 | EXCLUDE ${EXCLUDED_PUBLIC_HEADERS}) | |
69 | target_link_libraries(test.headers.standalone PRIVATE hana) | |
70 | add_dependencies(test.headers test.headers.standalone) | |
71 | ||
72 | if (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) | |
78 | endif() | |
7c673cae FG |
79 | |
80 | ||
81 | ############################################################################## | |
82 | # Check for ODR violations when linking several translation units | |
83 | # (GitHub issue 75) | |
84 | ############################################################################## | |
85 | list(APPEND EXCLUDED_UNIT_TESTS "issues/github_75/*.cpp") | |
86 | boost_hana_target_name_for(github_75 "${CMAKE_CURRENT_LIST_DIR}/issues/github_75") | |
87 | add_executable(${github_75} EXCLUDE_FROM_ALL "issues/github_75/tu1.cpp" "issues/github_75/tu2.cpp") | |
b32b8144 FG |
88 | boost_hana_set_test_properties(${github_75}) |
89 | add_test(${github_75} "${CMAKE_CURRENT_BINARY_DIR}/${github_75}") | |
7c673cae FG |
90 | add_dependencies(tests ${github_75}) |
91 | ||
92 | ||
93 | ############################################################################## | |
94 | # Add all the remaining unit tests | |
95 | ############################################################################## | |
96 | file(GLOB_RECURSE UNIT_TESTS "*.cpp") | |
97 | file(GLOB_RECURSE EXCLUDED_UNIT_TESTS ${EXCLUDED_UNIT_TESTS}) | |
98 | list(REMOVE_ITEM UNIT_TESTS ${EXCLUDED_UNIT_TESTS}) | |
99 | ||
100 | foreach(_file IN LISTS UNIT_TESTS) | |
101 | boost_hana_target_name_for(_target "${_file}") | |
102 | add_executable(${_target} EXCLUDE_FROM_ALL "${_file}") | |
b32b8144 FG |
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() | |
7c673cae | 107 | target_include_directories(${_target} PRIVATE _include) |
b32b8144 | 108 | add_test(${_target} "${CMAKE_CURRENT_BINARY_DIR}/${_target}") |
7c673cae FG |
109 | add_dependencies(tests ${_target}) |
110 | endforeach() | |
11fdf7f2 TL |
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 | ############################################################################## | |
118 | include(ExternalProject) | |
119 | set(HANA_FAKE_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/deploy/fakeroot") | |
120 | ExternalProject_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 | ||
131 | add_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 | ) | |
92f5a8d4 | 143 | add_dependencies(hana_check test.deploy) |