# Distributed under the OSI-approved BSD 3-Clause License. See accompanying | |
# file Copyright.txt or https://cmake.org/licensing for details. | |
#[=======================================================================[.rst: | |
CTest | |
----- | |
Configure a project for testing with CTest/CDash | |
Include this module in the top CMakeLists.txt file of a project to | |
enable testing with CTest and dashboard submissions to CDash:: | |
project(MyProject) | |
... | |
include(CTest) | |
The module automatically creates a ``BUILD_TESTING`` option that selects | |
whether to enable testing support (``ON`` by default). After including | |
the module, use code like:: | |
if(BUILD_TESTING) | |
# ... CMake code to create tests ... | |
endif() | |
to creating tests when testing is enabled. | |
To enable submissions to a CDash server, create a ``CTestConfig.cmake`` | |
file at the top of the project with content such as:: | |
set(CTEST_NIGHTLY_START_TIME "01:00:00 UTC") | |
set(CTEST_SUBMIT_URL "http://my.cdash.org/submit.php?project=MyProject") | |
(the CDash server can provide the file to a project administrator who | |
configures ``MyProject``). Settings in the config file are shared by | |
both this ``CTest`` module and the :manual:`ctest(1)` command-line | |
:ref:`Dashboard Client` mode (``ctest -S``). | |
While building a project for submission to CDash, CTest scans the | |
build output for errors and warnings and reports them with surrounding | |
context from the build log. This generic approach works for all build | |
tools, but does not give details about the command invocation that | |
produced a given problem. One may get more detailed reports by setting | |
the :variable:`CTEST_USE_LAUNCHERS` variable:: | |
set(CTEST_USE_LAUNCHERS 1) | |
in the ``CTestConfig.cmake`` file. | |
#]=======================================================================] | |
option(BUILD_TESTING "Build the testing tree." ON) | |
# function to turn generator name into a version string | |
# like vs9 or vs10 | |
function(GET_VS_VERSION_STRING generator var) | |
string(REGEX REPLACE "Visual Studio ([0-9][0-9]?)($|.*)" "\\1" | |
NUMBER "${generator}") | |
set(ver_string "vs${NUMBER}") | |
set(${var} ${ver_string} PARENT_SCOPE) | |
endfunction() | |
include(CTestUseLaunchers) | |
if(BUILD_TESTING) | |
# Setup some auxiliary macros | |
macro(SET_IF_NOT_SET var val) | |
if(NOT DEFINED "${var}") | |
set("${var}" "${val}") | |
endif() | |
endmacro() | |
macro(SET_IF_SET var val) | |
if(NOT "${val}" STREQUAL "") | |
set("${var}" "${val}") | |
endif() | |
endmacro() | |
macro(SET_IF_SET_AND_NOT_SET var val) | |
if(NOT "${val}" STREQUAL "") | |
SET_IF_NOT_SET("${var}" "${val}") | |
endif() | |
endmacro() | |
# Make sure testing is enabled | |
enable_testing() | |
if(EXISTS "${PROJECT_SOURCE_DIR}/CTestConfig.cmake") | |
include("${PROJECT_SOURCE_DIR}/CTestConfig.cmake") | |
SET_IF_SET_AND_NOT_SET(NIGHTLY_START_TIME "${CTEST_NIGHTLY_START_TIME}") | |
SET_IF_SET_AND_NOT_SET(SUBMIT_URL "${CTEST_SUBMIT_URL}") | |
SET_IF_SET_AND_NOT_SET(DROP_METHOD "${CTEST_DROP_METHOD}") | |
SET_IF_SET_AND_NOT_SET(DROP_SITE "${CTEST_DROP_SITE}") | |
SET_IF_SET_AND_NOT_SET(DROP_SITE_USER "${CTEST_DROP_SITE_USER}") | |
SET_IF_SET_AND_NOT_SET(DROP_SITE_PASSWORD "${CTEST_DROP_SITE_PASWORD}") | |
SET_IF_SET_AND_NOT_SET(DROP_SITE_MODE "${CTEST_DROP_SITE_MODE}") | |
SET_IF_SET_AND_NOT_SET(DROP_LOCATION "${CTEST_DROP_LOCATION}") | |
SET_IF_SET_AND_NOT_SET(TRIGGER_SITE "${CTEST_TRIGGER_SITE}") | |
SET_IF_SET_AND_NOT_SET(UPDATE_TYPE "${CTEST_UPDATE_TYPE}") | |
endif() | |
# the project can have a DartConfig.cmake file | |
if(EXISTS "${PROJECT_SOURCE_DIR}/DartConfig.cmake") | |
include("${PROJECT_SOURCE_DIR}/DartConfig.cmake") | |
else() | |
# Dashboard is opened for submissions for a 24 hour period starting at | |
# the specified NIGHTLY_START_TIME. Time is specified in 24 hour format. | |
SET_IF_NOT_SET (NIGHTLY_START_TIME "00:00:00 EDT") | |
SET_IF_NOT_SET(DROP_METHOD "http") | |
SET_IF_NOT_SET (COMPRESS_SUBMISSION ON) | |
endif() | |
SET_IF_NOT_SET (NIGHTLY_START_TIME "00:00:00 EDT") | |
if(NOT SUBMIT_URL) | |
set(SUBMIT_URL "${DROP_METHOD}://") | |
if(DROP_SITE_USER) | |
string(APPEND SUBMIT_URL "${DROP_SITE_USER}") | |
if(DROP_SITE_PASSWORD) | |
string(APPEND SUBMIT_URL ":${DROP_SITE_PASSWORD}") | |
endif() | |
string(APPEND SUBMIT_URL "@") | |
endif() | |
string(APPEND SUBMIT_URL "${DROP_SITE}${DROP_LOCATION}") | |
endif() | |
if(NOT UPDATE_TYPE) | |
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CVS") | |
set(UPDATE_TYPE cvs) | |
elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.svn") | |
set(UPDATE_TYPE svn) | |
elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.bzr") | |
set(UPDATE_TYPE bzr) | |
elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.hg") | |
set(UPDATE_TYPE hg) | |
elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git") | |
set(UPDATE_TYPE git) | |
endif() | |
endif() | |
string(TOLOWER "${UPDATE_TYPE}" _update_type) | |
if("${_update_type}" STREQUAL "cvs") | |
find_program(CVSCOMMAND cvs ) | |
set(CVS_UPDATE_OPTIONS "-d -A -P" CACHE STRING | |
"Options passed to the cvs update command.") | |
set(UPDATE_COMMAND "${CVSCOMMAND}") | |
set(UPDATE_OPTIONS "${CVS_UPDATE_OPTIONS}") | |
elseif("${_update_type}" STREQUAL "svn") | |
find_program(SVNCOMMAND svn) | |
set(UPDATE_COMMAND "${SVNCOMMAND}") | |
set(UPDATE_OPTIONS "${SVN_UPDATE_OPTIONS}") | |
elseif("${_update_type}" STREQUAL "bzr") | |
find_program(BZRCOMMAND bzr) | |
set(UPDATE_COMMAND "${BZRCOMMAND}") | |
set(UPDATE_OPTIONS "${BZR_UPDATE_OPTIONS}") | |
elseif("${_update_type}" STREQUAL "hg") | |
find_program(HGCOMMAND hg) | |
set(UPDATE_COMMAND "${HGCOMMAND}") | |
set(UPDATE_OPTIONS "${HG_UPDATE_OPTIONS}") | |
elseif("${_update_type}" STREQUAL "git") | |
find_program(GITCOMMAND git) | |
set(UPDATE_COMMAND "${GITCOMMAND}") | |
set(UPDATE_OPTIONS "${GIT_UPDATE_OPTIONS}") | |
elseif("${_update_type}" STREQUAL "p4") | |
find_program(P4COMMAND p4) | |
set(UPDATE_COMMAND "${P4COMMAND}") | |
set(UPDATE_OPTIONS "${P4_UPDATE_OPTIONS}") | |
endif() | |
set(DART_TESTING_TIMEOUT 1500 CACHE STRING | |
"Maximum time allowed before CTest will kill the test.") | |
set(CTEST_SUBMIT_RETRY_DELAY 5 CACHE STRING | |
"How long to wait between timed-out CTest submissions.") | |
set(CTEST_SUBMIT_RETRY_COUNT 3 CACHE STRING | |
"How many times to retry timed-out CTest submissions.") | |
find_program(MEMORYCHECK_COMMAND | |
NAMES purify valgrind boundscheck drmemory cuda-memcheck compute-sanitizer | |
PATHS | |
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Rational Software\\Purify\\Setup;InstallFolder]" | |
DOC "Path to the memory checking command, used for memory error detection." | |
) | |
set(MEMORYCHECK_SUPPRESSIONS_FILE "" CACHE FILEPATH | |
"File that contains suppressions for the memory checker") | |
find_program(COVERAGE_COMMAND gcov DOC | |
"Path to the coverage program that CTest uses for performing coverage inspection" | |
) | |
set(COVERAGE_EXTRA_FLAGS "-l" CACHE STRING | |
"Extra command line flags to pass to the coverage tool") | |
# set the site name | |
if(COMMAND cmake_host_system_information) | |
cmake_host_system_information(RESULT _ctest_hostname QUERY HOSTNAME) | |
set(SITE "${_ctest_hostname}" CACHE STRING "Name of the computer/site where compile is being run") | |
unset(_ctest_hostname) | |
else() | |
# This code path is needed for CMake itself during bootstrap. | |
site_name(SITE) | |
endif() | |
# set the build name | |
if(NOT BUILDNAME) | |
set(DART_COMPILER "${CMAKE_CXX_COMPILER}") | |
if(NOT DART_COMPILER) | |
set(DART_COMPILER "${CMAKE_C_COMPILER}") | |
endif() | |
if(NOT DART_COMPILER) | |
set(DART_COMPILER "unknown") | |
endif() | |
if(WIN32) | |
set(DART_NAME_COMPONENT "NAME_WE") | |
else() | |
set(DART_NAME_COMPONENT "NAME") | |
endif() | |
if(NOT BUILD_NAME_SYSTEM_NAME) | |
set(BUILD_NAME_SYSTEM_NAME "${CMAKE_SYSTEM_NAME}") | |
endif() | |
if(WIN32) | |
set(BUILD_NAME_SYSTEM_NAME "Win32") | |
endif() | |
if(UNIX OR BORLAND) | |
get_filename_component(DART_COMPILER_NAME | |
"${DART_COMPILER}" ${DART_NAME_COMPONENT}) | |
else() | |
get_filename_component(DART_COMPILER_NAME | |
"${CMAKE_MAKE_PROGRAM}" ${DART_NAME_COMPONENT}) | |
endif() | |
if(DART_COMPILER_NAME MATCHES "devenv") | |
GET_VS_VERSION_STRING("${CMAKE_GENERATOR}" DART_COMPILER_NAME) | |
endif() | |
set(BUILDNAME "${BUILD_NAME_SYSTEM_NAME}-${DART_COMPILER_NAME}") | |
endif() | |
# the build command | |
build_command(MAKECOMMAND_DEFAULT_VALUE | |
CONFIGURATION "\${CTEST_CONFIGURATION_TYPE}") | |
set(MAKECOMMAND ${MAKECOMMAND_DEFAULT_VALUE} | |
CACHE STRING "Command to build the project") | |
# the default build configuration the ctest build handler will use | |
# if there is no -C arg given to ctest: | |
set(DEFAULT_CTEST_CONFIGURATION_TYPE "$ENV{CMAKE_CONFIG_TYPE}") | |
if(DEFAULT_CTEST_CONFIGURATION_TYPE STREQUAL "") | |
set(DEFAULT_CTEST_CONFIGURATION_TYPE "Release") | |
endif() | |
mark_as_advanced( | |
BZRCOMMAND | |
COVERAGE_COMMAND | |
COVERAGE_EXTRA_FLAGS | |
CTEST_SUBMIT_RETRY_DELAY | |
CTEST_SUBMIT_RETRY_COUNT | |
CVSCOMMAND | |
CVS_UPDATE_OPTIONS | |
DART_TESTING_TIMEOUT | |
GITCOMMAND | |
P4COMMAND | |
HGCOMMAND | |
MAKECOMMAND | |
MEMORYCHECK_COMMAND | |
MEMORYCHECK_SUPPRESSIONS_FILE | |
SITE | |
SVNCOMMAND | |
) | |
if(NOT RUN_FROM_DART) | |
set(RUN_FROM_CTEST_OR_DART 1) | |
include(CTestTargets) | |
set(RUN_FROM_CTEST_OR_DART) | |
endif() | |
endif() |