blob: c7fd3a89dedabe7a683229fcac9244615b5d7c9d [file] [edit]
# SPDX-FileCopyrightText: The Eigen Authors
# SPDX-License-Identifier: MPL-2.0
# Script-mode driver for the tests that ei_add_failtest() and
# ei_add_failtest_fixture() register (cmake/EigenTesting.cmake).
#
# build: deletes every failtest executable, then builds them all, so that an
# executable exists afterwards exactly when its target built in this run. It
# always succeeds; the verdicts belong to the check tests.
# check: <name>_ok passes when its executable exists. <name>_ko passes when its
# executable is missing and the _ok twin's exists: a toolchain or build-system
# failure breaks both variants, and must not pass as the asserted compile error.
cmake_minimum_required(VERSION 3.17)
set(config_args "")
if(NOT EIGEN_FAILTEST_CONFIG STREQUAL "")
set(config_args --config "${EIGEN_FAILTEST_CONFIG}")
endif()
if(EIGEN_FAILTEST_ACTION STREQUAL "build")
include("${EIGEN_FAILTEST_LIST}")
file(REMOVE ${EIGEN_FAILTEST_FILES})
set(keep_going "")
set(parallel "")
if(EIGEN_FAILTEST_GENERATOR MATCHES "Ninja")
set(keep_going -k 0)
elseif(EIGEN_FAILTEST_GENERATOR MATCHES "^(Unix|MinGW|MSYS) Makefiles$")
set(keep_going -k)
# Unlike Ninja, make is serial without -j.
if(NOT DEFINED ENV{CMAKE_BUILD_PARALLEL_LEVEL})
cmake_host_system_information(RESULT jobs QUERY NUMBER_OF_LOGICAL_CORES)
set(parallel --parallel ${jobs})
endif()
endif()
if(keep_going)
execute_process(COMMAND "${CMAKE_COMMAND}" --build "${EIGEN_FAILTEST_BINARY_DIR}" ${config_args}
--target buildfailtests ${parallel} -- ${keep_going})
else()
# Without a known keep-going flag, the first _ko failure would stop the
# batch, so build one target at a time.
foreach(target IN LISTS EIGEN_FAILTEST_TARGETS)
execute_process(COMMAND "${CMAKE_COMMAND}" --build "${EIGEN_FAILTEST_BINARY_DIR}" ${config_args}
--target ${target})
endforeach()
endif()
elseif(EIGEN_FAILTEST_ACTION STREQUAL "check")
if(DEFINED EIGEN_FAILTEST_KO)
if(EXISTS "${EIGEN_FAILTEST_KO_FILE}")
message(FATAL_ERROR "${EIGEN_FAILTEST_KO} built, but EIGEN_SHOULD_FAIL_TO_BUILD must break its compile.")
endif()
if(NOT EXISTS "${EIGEN_FAILTEST_OK_FILE}")
message(FATAL_ERROR "${EIGEN_FAILTEST_OK} did not build either, so the failure of "
"${EIGEN_FAILTEST_KO} proves nothing; see the ${EIGEN_FAILTEST_OK} test.")
endif()
elseif(NOT EXISTS "${EIGEN_FAILTEST_OK_FILE}")
# Rebuild the target alone to put its errors in this test's output. The
# lock keeps these builds from running concurrently in one binary directory.
file(LOCK "${EIGEN_FAILTEST_LOCK}" GUARD PROCESS)
execute_process(COMMAND "${CMAKE_COMMAND}" --build "${EIGEN_FAILTEST_BINARY_DIR}" ${config_args}
--target ${EIGEN_FAILTEST_OK})
message(FATAL_ERROR "${EIGEN_FAILTEST_OK} did not build in the buildfailtests fixture.")
endif()
else()
message(FATAL_ERROR "Unknown EIGEN_FAILTEST_ACTION '${EIGEN_FAILTEST_ACTION}'.")
endif()