144 lines
6.3 KiB
CMake
144 lines
6.3 KiB
CMake
# Copyright Louis Dionne 2013-2017
|
|
# Distributed under the Boost Software License, Version 1.0.
|
|
# (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
|
|
|
|
add_custom_target(tests COMMENT "Build all the unit tests.")
|
|
add_dependencies(hana_check tests)
|
|
|
|
|
|
##############################################################################
|
|
# Take note of files that depend on Boost
|
|
##############################################################################
|
|
file(GLOB_RECURSE TESTS_REQUIRING_BOOST "ext/boost/*.cpp"
|
|
"experimental/printable/*.cpp")
|
|
|
|
file(GLOB_RECURSE PUBLIC_HEADERS_REQUIRING_BOOST
|
|
RELATIVE "${Boost.Hana_SOURCE_DIR}/include"
|
|
"${Boost.Hana_SOURCE_DIR}/include/boost/hana/ext/boost/*.hpp"
|
|
"${Boost.Hana_SOURCE_DIR}/include/boost/hana/ext/boost.hpp"
|
|
"${Boost.Hana_SOURCE_DIR}/include/boost/hana/experimental/printable.hpp"
|
|
)
|
|
|
|
|
|
##############################################################################
|
|
# Caveats: Take note of public headers and tests that are not supported.
|
|
##############################################################################
|
|
if (NOT Boost_FOUND)
|
|
list(APPEND EXCLUDED_UNIT_TESTS ${TESTS_REQUIRING_BOOST})
|
|
list(APPEND EXCLUDED_PUBLIC_HEADERS ${PUBLIC_HEADERS_REQUIRING_BOOST})
|
|
endif()
|
|
|
|
# The experimental::type_name test is only supported on Clang and AppleClang >= 7.0
|
|
if (NOT (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang"
|
|
OR (${CMAKE_CXX_COMPILER_ID} STREQUAL "AppleClang" AND
|
|
NOT ${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 7)))
|
|
list(APPEND EXCLUDED_PUBLIC_HEADERS
|
|
"boost/hana/experimental/type_name.hpp")
|
|
list(APPEND EXCLUDED_UNIT_TESTS "experimental/type_name.cpp")
|
|
endif()
|
|
|
|
# On Windows, Clang-cl emulates a MSVC bug that causes EBO not to be applied
|
|
# properly. We disable the tests that check for EBO.
|
|
if (MSVC AND ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
|
|
list(APPEND EXCLUDED_UNIT_TESTS
|
|
"detail/ebo.cpp"
|
|
"issues/github_202.cpp"
|
|
"pair/empty_storage.cpp"
|
|
"tuple/empty_member.cpp"
|
|
)
|
|
endif()
|
|
|
|
|
|
##############################################################################
|
|
# Generate tests that include each public header.
|
|
# The headers that were excluded above due to caveats are ignored here.
|
|
##############################################################################
|
|
add_custom_target(test.headers COMMENT "Build all the header-inclusion unit tests.")
|
|
add_dependencies(tests test.headers)
|
|
|
|
file(GLOB_RECURSE PUBLIC_HEADERS
|
|
RELATIVE "${Boost.Hana_SOURCE_DIR}/include"
|
|
"${Boost.Hana_SOURCE_DIR}/include/*.hpp"
|
|
)
|
|
list(REMOVE_ITEM PUBLIC_HEADERS ${PUBLIC_HEADERS_REQUIRING_BOOST})
|
|
|
|
include(TestHeaders)
|
|
add_header_test(test.headers.standalone EXCLUDE_FROM_ALL
|
|
HEADERS ${PUBLIC_HEADERS}
|
|
EXCLUDE ${EXCLUDED_PUBLIC_HEADERS})
|
|
target_link_libraries(test.headers.standalone PRIVATE hana)
|
|
add_dependencies(test.headers test.headers.standalone)
|
|
|
|
if (Boost_FOUND)
|
|
add_header_test(test.headers.boost EXCLUDE_FROM_ALL
|
|
HEADERS ${PUBLIC_HEADERS_REQUIRING_BOOST}
|
|
EXCLUDE ${EXCLUDED_PUBLIC_HEADERS})
|
|
target_link_libraries(test.headers.boost PRIVATE hana Boost::boost)
|
|
add_dependencies(test.headers test.headers.boost)
|
|
endif()
|
|
|
|
|
|
##############################################################################
|
|
# Check for ODR violations when linking several translation units
|
|
# (GitHub issue 75)
|
|
##############################################################################
|
|
list(APPEND EXCLUDED_UNIT_TESTS "issues/github_75/*.cpp")
|
|
boost_hana_target_name_for(github_75 "${CMAKE_CURRENT_LIST_DIR}/issues/github_75")
|
|
add_executable(${github_75} EXCLUDE_FROM_ALL "issues/github_75/tu1.cpp" "issues/github_75/tu2.cpp")
|
|
boost_hana_set_test_properties(${github_75})
|
|
add_test(${github_75} "${CMAKE_CURRENT_BINARY_DIR}/${github_75}")
|
|
add_dependencies(tests ${github_75})
|
|
|
|
|
|
##############################################################################
|
|
# Add all the remaining unit tests
|
|
##############################################################################
|
|
file(GLOB_RECURSE UNIT_TESTS "*.cpp")
|
|
file(GLOB_RECURSE EXCLUDED_UNIT_TESTS ${EXCLUDED_UNIT_TESTS})
|
|
list(REMOVE_ITEM UNIT_TESTS ${EXCLUDED_UNIT_TESTS})
|
|
|
|
foreach(_file IN LISTS UNIT_TESTS)
|
|
boost_hana_target_name_for(_target "${_file}")
|
|
add_executable(${_target} EXCLUDE_FROM_ALL "${_file}")
|
|
boost_hana_set_test_properties(${_target})
|
|
if (_file IN_LIST TESTS_REQUIRING_BOOST)
|
|
target_link_libraries(${_target} PRIVATE Boost::boost)
|
|
endif()
|
|
target_include_directories(${_target} PRIVATE _include)
|
|
add_test(${_target} "${CMAKE_CURRENT_BINARY_DIR}/${_target}")
|
|
add_dependencies(tests ${_target})
|
|
endforeach()
|
|
|
|
|
|
##############################################################################
|
|
# Add the deployment test, which checks that we can indeed install `hana` and
|
|
# then use the provided `HanaConfig.cmake` config file to use `hana` from an
|
|
# external project.
|
|
##############################################################################
|
|
include(ExternalProject)
|
|
set(HANA_FAKE_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/deploy/fakeroot")
|
|
ExternalProject_Add(test.deploy.fakeroot
|
|
SOURCE_DIR "${PROJECT_SOURCE_DIR}"
|
|
EXCLUDE_FROM_ALL TRUE
|
|
BUILD_ALWAYS TRUE
|
|
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${HANA_FAKE_INSTALL_DIR}
|
|
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
|
|
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
|
|
TEST_COMMAND "" # Disable test step
|
|
UPDATE_COMMAND "" # Disable source work-tree update
|
|
)
|
|
|
|
add_custom_target(test.deploy
|
|
DEPENDS test.deploy.fakeroot
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/deploy/build"
|
|
COMMAND ${CMAKE_COMMAND} -E chdir "${CMAKE_CURRENT_BINARY_DIR}/deploy/build"
|
|
${CMAKE_COMMAND} "${CMAKE_CURRENT_SOURCE_DIR}/deploy"
|
|
-DCMAKE_CXX_COMPILER="${CMAKE_CXX_COMPILER}"
|
|
-DCMAKE_PREFIX_PATH="${HANA_FAKE_INSTALL_DIR}"
|
|
-DCMAKE_GENERATOR=${CMAKE_GENERATOR}
|
|
-DCMAKE_TOOLCHAIN_FILE="${CMAKE_TOOLCHAIN_FILE}"
|
|
COMMAND ${CMAKE_COMMAND} --build "${CMAKE_CURRENT_BINARY_DIR}/deploy/build"
|
|
USES_TERMINAL
|
|
)
|
|
add_dependencies(hana_check test.deploy)
|