diff --git a/CMakeLists.txt b/CMakeLists.txt index 3a1bcd117..0d05cf892 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,87 +1,88 @@ # Copyright (c) 2017 The Bitcoin developers cmake_minimum_required(VERSION 3.12) set(CMAKE_USER_MAKE_RULES_OVERRIDE "${CMAKE_SOURCE_DIR}/cmake/modules/OverrideInitFlags.cmake" ) project(bitcoin-abc VERSION 0.20.10 DESCRIPTION "Bitcoin ABC is a full node implementation of the Bitcoin Cash protocol." HOMEPAGE_URL "https://www.bitcoinabc.org" ) # Package information set(PACKAGE_NAME "Bitcoin ABC") # Copyright set(COPYRIGHT_YEAR 2019) set(COPYRIGHT_HOLDERS "The %s developers") set(COPYRIGHT_HOLDERS_SUBSTITUTION Bitcoin) string(REPLACE "%s" ${COPYRIGHT_HOLDERS_SUBSTITUTION} COPYRIGHT_HOLDERS_FINAL ${COPYRIGHT_HOLDERS}) # Add path for custom modules set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules ) # Make contrib script accessible. set(CONTRIB_PATH ${CMAKE_CURRENT_SOURCE_DIR}/contrib) # If ccache is available, then use it. find_program(CCACHE ccache) if(CCACHE) message(STATUS "Using ccache: ${CCACHE}") set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE}) set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE}) endif(CCACHE) # Default to RelWithDebInfo configuration if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Select the configuration for the build" FORCE) endif() # Find the python interpreter. This is required for several targets. find_package(PythonInterp 3.5 REQUIRED) # Add the magic targets `check-*` add_custom_target(check-all) add_custom_target(check) +add_custom_target(check-upgrade-activated) add_custom_target(check-symbols) add_custom_target(check-security) include(PackageHelper) exclude_git_ignored_files_from_source_package() # Ignore hidden files and directories (starting with a '.') set_property(GLOBAL APPEND PROPERTY SOURCE_PACKAGE_IGNORE_FILES "/\\\\.") # If the build is out-of-tree, then the build directory can be ignored. if(NOT CMAKE_BINARY_DIR STREQUAL CMAKE_SOURCE_DIR) set_property(GLOBAL APPEND PROPERTY SOURCE_PACKAGE_IGNORE_FILES "${CMAKE_BINARY_DIR}/" ) endif() exclude_from_source_package( # Subdirectories "arcanist/" "depends/" # Files "[^.]+[.]md$" "Dockerfile-doxygen" ) add_subdirectory(src) add_subdirectory(test) add_subdirectory(contrib) add_subdirectory(doc) include(PackageOptions) get_property(CPACK_SOURCE_IGNORE_FILES GLOBAL PROPERTY SOURCE_PACKAGE_IGNORE_FILES) include(CPack) diff --git a/cmake/modules/TestSuite.cmake b/cmake/modules/TestSuite.cmake index 755f4524f..df46b1738 100644 --- a/cmake/modules/TestSuite.cmake +++ b/cmake/modules/TestSuite.cmake @@ -1,94 +1,101 @@ # Allow to easily build test suites -macro(create_test_suite NAME) +function(create_test_suite_with_parent_target NAME PARENT_TARGET) set(TARGET "check-${NAME}") + add_custom_target(${TARGET} COMMENT "Running ${NAME} test suite" COMMAND cmake -E echo "PASSED: ${NAME} test suite" ) - # If the magic target check-all exists, attach to it. - if(TARGET check-all) - add_dependencies(check-all ${TARGET}) + if(TARGET ${PARENT_TARGET}) + add_dependencies(${PARENT_TARGET} ${TARGET}) endif() -endmacro(create_test_suite) +endfunction(create_test_suite_with_parent_target) + +macro(create_test_suite NAME) + create_test_suite_with_parent_target(${NAME} check-all) +endmacro() set(TEST_RUNNER_TEMPLATE "${CMAKE_CURRENT_LIST_DIR}/../templates/TestRunner.cmake.in") function(_add_test_runner SUITE NAME COMMAND) set(TARGET "check-${SUITE}-${NAME}") set(LOG "${NAME}.log") set(RUNNER "${CMAKE_CURRENT_BINARY_DIR}/run-${NAME}.sh") list(JOIN ARGN " " ARGS) configure_file( "${TEST_RUNNER_TEMPLATE}" "${RUNNER}" ) add_custom_target(${TARGET} COMMAND ${RUNNER} COMMENT "${SUITE}: testing ${NAME}" DEPENDS ${COMMAND} ${RUNNER} ) add_dependencies("check-${SUITE}" ${TARGET}) endfunction() function(add_test_to_suite SUITE NAME) add_executable(${NAME} EXCLUDE_FROM_ALL ${ARGN}) _add_test_runner(${SUITE} ${NAME} ${NAME}) endfunction(add_test_to_suite) function(add_boost_unit_tests_to_suite SUITE NAME) cmake_parse_arguments(ARG "" "" "TESTS" ${ARGN} ) add_executable(${NAME} EXCLUDE_FROM_ALL ${ARG_UNPARSED_ARGUMENTS}) add_dependencies("check-${SUITE}" ${NAME}) foreach(_test_source ${ARG_TESTS}) target_sources(${NAME} PRIVATE "${_test_source}") get_filename_component(_test_name "${_test_source}" NAME_WE) _add_test_runner( ${SUITE} ${_test_name} ${NAME} -t "${_test_name}" ) set(SUITE_UPGRADE_ACTIVATED "${SUITE}-upgrade-activated") set(TARGET_UPGRADE_ACTIVATED "check-${SUITE_UPGRADE_ACTIVATED}") if(NOT TARGET ${TARGET_UPGRADE_ACTIVATED}) - create_test_suite(${SUITE_UPGRADE_ACTIVATED}) + create_test_suite_with_parent_target( + ${SUITE_UPGRADE_ACTIVATED} + check-upgrade-activated + ) add_dependencies(${TARGET_UPGRADE_ACTIVATED} ${NAME}) endif() _add_test_runner( ${SUITE_UPGRADE_ACTIVATED} "${_test_name}" ${NAME} -t "${_test_name}" # Dec. 1st, 2019 at 00:00:00 -- -phononactivationtime=1575158400 ) endforeach() find_package(Boost 1.58 REQUIRED unit_test_framework) target_link_libraries(${NAME} Boost::unit_test_framework) # We need to detect if the BOOST_TEST_DYN_LINK flag is required include(CheckCXXSourceCompiles) set(CMAKE_REQUIRED_LIBRARIES Boost::unit_test_framework) check_cxx_source_compiles(" #define BOOST_TEST_DYN_LINK #define BOOST_TEST_MAIN #include " BOOST_TEST_DYN_LINK) if(BOOST_TEST_DYN_LINK) target_compile_definitions(${NAME} PRIVATE BOOST_TEST_DYN_LINK) endif(BOOST_TEST_DYN_LINK) endfunction(add_boost_unit_tests_to_suite)