3 # Included from a dashboard script, this cmake file will drive the configure and build 7 #----------------------------------------------------------------------------- 8 # The following variable are expected to be define in the top-level script: 18 CTEST_BUILD_CONFIGURATION
22 CTEST_SOURCE_DIRECTORY
23 CTEST_BINARY_DIRECTORY
26 CTEST_COVERAGE_COMMAND
27 CTEST_MEMORYCHECK_COMMAND
32 foreach(var ${expected_variables})
33 if(NOT DEFINED ${var})
34 message(FATAL_ERROR
"Variable ${var} should be defined in top-level script !")
38 string(REPLACE " " "%20" _build_name_escaped "${CTEST_BUILD_NAME}
") 40 # Check if "mbits
" is reachable 42 list(GET _status 0 _status_code)
43 if(_status_code EQUAL 0) # successful completion
44 set(MBITS_AVAILABLE 1)
46 set(MBITS_AVAILABLE 0)
50 # Site specific options 52 if(NOT CDASH_ADMIN_URL_PREFIX AND MBITS_AVAILABLE)
53 set(CDASH_ADMIN_URL_PREFIX
"http://mbits")
56 if(NOT DEFINED GIT_BRANCH OR GIT_BRANCH STREQUAL
"")
59 set(GIT_BRANCH
"-b ${GIT_BRANCH}")
62 # Should binary directory be cleaned? 63 set(empty_binary_directory FALSE)
65 # Attempt to build and
test also
if 'ctest_update' returned an error
66 set(initial_force_build FALSE)
70 if(SCRIPT_MODE STREQUAL
"experimental")
71 set(empty_binary_directory FALSE)
72 set(initial_force_build TRUE)
73 set(model Experimental)
74 elseif(SCRIPT_MODE STREQUAL
"continuous")
75 set(empty_binary_directory FALSE)
76 set(initial_force_build FALSE)
78 elseif(SCRIPT_MODE STREQUAL
"nightly")
79 set(empty_binary_directory TRUE)
80 set(initial_force_build TRUE)
83 message(FATAL_ERROR
"Unknown script mode: '${SCRIPT_MODE}'. Script mode should be either 'experimental', 'continuous' or 'nightly'")
86 #message("script_mode:${SCRIPT_MODE}") 87 #message("model:${model}") 88 #message("empty_binary_directory:${empty_binary_directory}") 89 #message("force_build:${initial_force_build}") 91 set(CTEST_CONFIGURATION_TYPE ${CTEST_BUILD_CONFIGURATION})
93 if(empty_binary_directory)
94 message(
"Clean \"${CTEST_BINARY_DIRECTORY}\"")
95 ctest_empty_binary_directory(${CTEST_BINARY_DIRECTORY})
98 if(NOT DEFINED CTEST_CHECKOUT_DIR)
99 set(CTEST_CHECKOUT_DIR ${CTEST_SOURCE_DIRECTORY})
102 if(NOT EXISTS "${CTEST_CHECKOUT_DIR}
") 103 set(CTEST_CHECKOUT_COMMAND "\
"${CTEST_GIT_COMMAND}\" clone ${GIT_BRANCH} ${GIT_REPOSITORY} \"${CTEST_CHECKOUT_DIR}\"")
106 set(CTEST_UPDATE_TYPE "git")
107 set(CTEST_UPDATE_COMMAND "${CTEST_GIT_COMMAND}
") 109 #---------------------------------------------------------------------- 111 #---------------------------------------------------------------------- 113 function(func_build_target target build_dir) 114 set(CTEST_BUILD_TARGET ${target}) 115 ctest_build(BUILD "${build_dir}
" APPEND 117 NUMBER_ERRORS num_errors 118 NUMBER_WARNINGS num_warnings) 119 ctest_submit(PARTS Build RETRY_DELAY 3 RETRY_COUNT 3) 122 math(EXPR build_errors "${build_errors} + ${num_errors}
") 123 set(build_errors ${build_errors} PARENT_SCOPE) 126 math(EXPR build_warnings "${build_warnings} + ${num_warnings}
") 127 set(build_warnings ${build_warnings} PARENT_SCOPE) 131 function(func_test label build_dir) 132 if(NOT TESTING_PARALLEL_LEVEL) 133 set(TESTING_PARALLEL_LEVEL 8) 136 if(label MATCHES "Unlabeled
") 137 set(_include_label EXCLUDE_LABEL .*) 139 set(_include_label INCLUDE_LABEL ${label}) 142 ctest_test(BUILD "${build_dir}
" 144 PARALLEL_LEVEL ${TESTING_PARALLEL_LEVEL} 145 EXCLUDE ${TEST_TO_EXCLUDE_REGEX} 148 ctest_submit(PARTS Test RETRY_DELAY 3 RETRY_COUNT 3) 151 math(EXPR test_errors "${test_errors} + 1
") 152 set(test_errors ${test_errors} PARENT_SCOPE) 156 set(WITH_COVERAGE ${ARG3}) 159 set(WITH_MEMCHECK ${ARG4}) 162 if(WITH_COVERAGE AND CTEST_COVERAGE_COMMAND) 163 message("----------- [ Coverage ${label} ] -----------
") 164 ctest_coverage(BUILD "${build_dir}
" LABELS ${label}) 165 ctest_submit(PARTS Coverage RETRY_DELAY 3 RETRY_COUNT 3) 168 if(WITH_MEMCHECK AND CTEST_MEMORYCHECK_COMMAND) 169 if(NOT CTEST_MEMORYCHECK_SUPPRESSIONS_FILE) 170 if(EXISTS "${CTEST_SOURCE_DIRECTORY}/
CMake/valgrind.supp
") 171 set(CTEST_MEMORYCHECK_SUPPRESSIONS_FILE "${CTEST_SOURCE_DIRECTORY}/
CMake/valgrind.supp
") 174 if(NOT CTEST_MEMORYCHECK_COMMAND_OPTIONS) 175 set(CTEST_MEMORYCHECK_COMMAND_OPTIONS "-q --tool=memcheck --leak-check=yes --show-reachable=no --show-possibly-lost=no --workaround-gcc296-bugs=yes --num-callers=50
") 177 ctest_memcheck(BUILD "${build_dir}
" INCLUDE_LABEL ${label}) 178 ctest_submit(PARTS MemCheck RETRY_DELAY 3 RETRY_COUNT 3) 183 macro(finalize_submission) 185 # Note should be at the end 186 ctest_submit(PARTS Notes RETRY_DELAY 3 RETRY_COUNT 3) 188 # Send status to the "CDash Web Admin
" 189 if(CDASH_ADMIN_URL_PREFIX) 190 set(cdash_admin_url "${CDASH_ADMIN_URL_PREFIX}/cdashadmin-web/index.php?pw=4da12ca9c06d46d3171d7f73974c900f
") 191 string(REGEX REPLACE ".*\\?project=(.*)&?
" "\\1
" _ctest_project "${CTEST_DROP_LOCATION}
") 193 "${cdash_admin_url}&action=submit&name=${_build_name_escaped}&hasTestErrors=${test_errors}&hasBuildErrors=${build_errors}&hasBuildWarnings=${build_warnings}&ctestDropSite=${CTEST_DROP_SITE}&ctestProject=${_ctest_project}
" 194 "${CTEST_BINARY_DIRECTORY}/cdashadmin.txt
" 197 list(GET status 0 error_code) 198 list(GET status 1 error_msg) 200 message(FATAL_ERROR "error: Failed to communicate with cdashadmin-web - ${error_msg}
") 206 macro(check_for_errors) 208 set(_curr_target ${ARGV0}) 209 if(build_errors AND _curr_target) 210 # try to remove the stamp file for external projects 211 set(_stamp_file "${CTEST_BINARY_DIRECTORY}/ep/src/${_curr_target}-stamp/${_curr_target}-configure
") 212 if(EXISTS "${_stamp_file}
") 213 file(REMOVE "${_stamp_file}
") 217 if(build_errors OR test_errors) 218 finalize_submission() 219 # this should return from run_ctest() 225 #--------------------------------------------------------------------- 227 #--------------------------------------------------------------------- 230 set(build_warnings 0) 234 set(force_build ${initial_force_build}) 236 ctest_start(${model}) 239 foreach(extension ${MITK_EXTENSIONS}) 240 if(extension MATCHES "([^|]+)\\|([^|]+)\\|(.+)
") 241 set(extension_repo ${CMAKE_MATCH_1}) 242 set(extension_tag ${CMAKE_MATCH_2}) 243 set(extension_source_dir ${CMAKE_MATCH_3}) 244 if(NOT EXISTS "${CTEST_DASHBOARD_ROOT}/${extension_source_dir}
") 245 message("Clone ${extension_repo} (${extension_tag})
") 247 COMMAND ${CTEST_GIT_COMMAND} clone -b ${extension_tag} ${extension_repo} ${extension_source_dir} 248 WORKING_DIRECTORY ${CTEST_DASHBOARD_ROOT}) 250 set(working_dir "${CTEST_DASHBOARD_ROOT}/${extension_source_dir}
") 251 message("Update ${extension_repo} (${extension_tag})
") 253 COMMAND ${CTEST_GIT_COMMAND} fetch origin ${extension_tag} 254 WORKING_DIRECTORY "${working_dir}
" 255 RESULT_VARIABLE exit_code) 257 if(exit_code EQUAL 0) 259 COMMAND ${CTEST_GIT_COMMAND} diff --quiet HEAD FETCH_HEAD 260 WORKING_DIRECTORY "${working_dir}
" 261 RESULT_VARIABLE exit_code) 263 if(NOT exit_code EQUAL 0) 265 COMMAND ${CTEST_GIT_COMMAND} reset --hard FETCH_HEAD 266 WORKING_DIRECTORY "${working_dir}
") 267 set(force_build TRUE) 270 message(FATAL_ERROR "Could not update ${extension_repo} (${extension_tag})
") 278 ctest_update(SOURCE "${CTEST_CHECKOUT_DIR}
" RETURN_VALUE res) 282 math(EXPR build_errors "${build_errors} + 1
") 285 # force a build if this is the first run and the build dir is empty 286 if(NOT EXISTS "${CTEST_BINARY_DIRECTORY}/CMakeCache.txt
") 287 message("First time build - Initialize CMakeCache.txt
") 290 # Write initial cache. 291 if(NOT DEFINED BUILD_TESTING) 292 set(BUILD_TESTING ON) 295 # Write initial cache. 296 file(WRITE "${CTEST_BINARY_DIRECTORY}/CMakeCache.txt
" " 297 CTEST_USE_LAUNCHERS:BOOL=${CTEST_USE_LAUNCHERS}
298 CTEST_PROJECT_ADDITIONAL_TARGETS:INTERNAL=${CTEST_PROJECT_ADDITIONAL_TARGETS}
300 MITK_CTEST_SCRIPT_MODE:STRING=${SCRIPT_MODE}
301 CMAKE_BUILD_TYPE:STRING=${CTEST_BUILD_CONFIGURATION}
302 WITH_COVERAGE:BOOL=${WITH_COVERAGE}
303 MITK_THIRDPARTY_DOWNLOAD_PREFIX_URL:STRING=${MITK_THIRDPARTY_DOWNLOAD_PREFIX_URL}
304 ${INITIAL_CMAKECACHE_OPTIONS}
308 if(res GREATER 0 OR force_build) 310 # Clear the forced rerun request 311 if(CDASH_ADMIN_URL_PREFIX AND cdash_remove_rerun_url) 312 file(DOWNLOAD "${cdash_remove_rerun_url}
" "${CTEST_BINARY_DIRECTORY}/tmp.txt
") 313 file(REMOVE "${CTEST_BINARY_DIRECTORY}/tmp.txt
") 316 if(CTEST_PROJECT_NAME_SUPERBUILD) 317 set(ctest_project_name_orig ${CTEST_PROJECT_NAME}) 318 set(CTEST_PROJECT_NAME ${CTEST_PROJECT_NAME_SUPERBUILD}) 321 message("----------- [ Configure SuperBuild ] -----------
") 323 set_property(GLOBAL PROPERTY SubProject SuperBuild) 324 set_property(GLOBAL PROPERTY Label SuperBuild) 327 set(SUPERBUILD_CONFIG_OPTIONS -D MITK_EXTENSION_DIRS:STRING=${MITK_EXTENSION_DIRS}) 330 ctest_configure(BUILD "${CTEST_BINARY_DIRECTORY}
" RETURN_VALUE res OPTIONS "${SUPERBUILD_CONFIG_OPTIONS}
") 333 math(EXPR build_errors "${build_errors} + 1
") 336 # Project.xml is generated during the superbuild configure step 337 ctest_submit(FILES "${CTEST_BINARY_DIRECTORY}/Project.xml
" RETRY_DELAY 3 RETRY_COUNT 3) 339 ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}
") 341 ctest_submit(PARTS Configure RETRY_DELAY 3 RETRY_COUNT 3) 343 # submit the update results *after* the submitting the Configure info, 344 # otherwise CDash is somehow confused and cannot add the update info 345 # to the superbuild project 346 ctest_submit(PARTS Update RETRY_DELAY 3 RETRY_COUNT 3) 350 # To get CTEST_PROJECT_SUBPROJECTS and CTEST_PROJECT_EXTERNALS definition 351 include("${CTEST_BINARY_DIRECTORY}/CTestConfigSubProject.cmake
") 353 # Read in a list of super-build targets (SUPERBUILD_TARGETS). If an error 354 # occurs in one of the listed projects, the ctest superbuild make step stops 355 # and the error is reported in the dashboard. If this variable would be empty 356 # the errors are still reported but make would keep building external 357 # projects which leads to potentially more errors because of dependencies. 358 set(MITK_SUPERBUILD_TARGETS_FILE "${CTEST_BINARY_DIRECTORY}/SuperBuildTargets.cmake
") 359 if(EXISTS "${MITK_SUPERBUILD_TARGETS_FILE}
") 360 include("${MITK_SUPERBUILD_TARGETS_FILE}
") 363 # Build top level (either all or the supplied targets at 365 if(SUPERBUILD_TARGETS) 366 foreach(superbuild_target ${SUPERBUILD_TARGETS}) 368 message("----------- [ Build ${superbuild_target} - SuperBuild ] -----------
") 369 func_build_target(${superbuild_target} "${CTEST_BINARY_DIRECTORY}
") 370 check_for_errors(${superbuild_target}) 372 # runs only tests that have a LABELS property matching "SuperBuild
" 373 func_test("SuperBuild
" "${CTEST_BINARY_DIRECTORY}
") 377 # HACK Unfortunately ctest_coverage ignores the build argument, back-up the original dirs 378 file(READ "${CTEST_BINARY_DIRECTORY}/CMakeFiles/TargetDirectories.txt
" old_coverage_dirs) 380 # explicitly build requested external projects as subprojects 381 foreach(external_project_with_build_dir ${CTEST_PROJECT_EXTERNALS}) 383 string(REPLACE "^^
" ";
" external_project_with_build_dir_list "${external_project_with_build_dir}
") 384 list(GET external_project_with_build_dir_list 0 external_project_name) 385 list(GET external_project_with_build_dir_list 1 external_project_builddir) 387 set_property(GLOBAL PROPERTY SubProject ${external_project_name}) 388 set_property(GLOBAL PROPERTY Label ${external_project_name}) 390 message("----------- [ Build ${external_project_name} ] -----------
") 392 func_build_target("${external_project_name}
" "${CTEST_BINARY_DIRECTORY}
") 395 # HACK Unfortunately ctest_coverage ignores the build argument, try to force it... 396 file(READ "${CTEST_BINARY_DIRECTORY}/${external_project_builddir}/CMakeFiles/TargetDirectories.txt
" mitk_build_coverage_dirs) 397 file(APPEND "${CTEST_BINARY_DIRECTORY}/CMakeFiles/TargetDirectories.txt
" "${mitk_build_coverage_dirs}
") 399 message("----------- [ Test ${external_project_name} ] -----------
") 401 # runs only tests that have a LABELS property matching "${external_project_name}
" 402 func_test(${external_project_name} "${CTEST_BINARY_DIRECTORY}/${external_project_builddir}
") 404 # restore old coverage dirs 405 file(WRITE "${CTEST_BINARY_DIRECTORY}/CMakeFiles/TargetDirectories.txt
" "${old_coverage_dirs}
") 409 # switch back to SuperBuild label 410 set_property(GLOBAL PROPERTY SubProject SuperBuild) 411 set_property(GLOBAL PROPERTY Label SuperBuild) 413 message("----------- [ Finish SuperBuild ] -----------
") 415 message("----------- [ Build SuperBuild ] -----------
") 418 # build everything at superbuild level which has not yet been built 419 func_build_target("" "${CTEST_BINARY_DIRECTORY}
") 422 # runs only tests that have a LABELS property matching "SuperBuild
" 423 #func_test("SuperBuild
" "${CTEST_BINARY_DIRECTORY}
") 425 set(build_dir "${CTEST_BINARY_DIRECTORY}/${PROJECT_BUILD_DIR}
") 426 if(CTEST_PROJECT_NAME_SUPERBUILD) 427 set(CTEST_PROJECT_NAME ${ctest_project_name_orig}) 430 message("----------- [ Configure ${build_dir} ] -----------
") 432 ctest_configure(BUILD "${build_dir}
" 433 OPTIONS "-DCTEST_USE_LAUNCHERS=${CTEST_USE_LAUNCHERS}
" 436 ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}
") 437 ctest_submit(PARTS Configure RETRY_DELAY 3 RETRY_COUNT 3) 440 math(EXPR build_errors "${build_errors} + 1
") 444 foreach(subproject ${CTEST_PROJECT_SUBPROJECTS}) 445 set_property(GLOBAL PROPERTY SubProject ${subproject}) 446 set_property(GLOBAL PROPERTY Label ${subproject}) 448 if(subproject MATCHES "Unlabeled
") 449 message("----------- [ Build All (Unlabeled) ] -----------
") 451 func_build_target("" "${build_dir}
") 453 message("----------- [ Build ${subproject} ] -----------
") 455 func_build_target(${subproject} "${build_dir}
") 460 # HACK Unfortunately ctest_coverage ignores the build argument, try to force it... 461 file(READ ${build_dir}/CMakeFiles/TargetDirectories.txt mitk_build_coverage_dirs) 462 file(APPEND "${CTEST_BINARY_DIRECTORY}/CMakeFiles/TargetDirectories.txt
" "${mitk_build_coverage_dirs}
") 464 foreach(subproject ${CTEST_PROJECT_SUBPROJECTS}) 465 set_property(GLOBAL PROPERTY SubProject ${subproject}) 466 set_property(GLOBAL PROPERTY Label ${subproject}) 467 message("----------- [ Test ${subproject} ] -----------
") 469 # runs only tests that have a LABELS property matching "${subproject}
" 470 func_test(${subproject} "${build_dir}
") 473 # Build any additional target which is not build by "all
" 474 # i.e. the "package
" target 475 if(CTEST_PROJECT_ADDITIONAL_TARGETS) 476 foreach(additional_target ${CTEST_PROJECT_ADDITIONAL_TARGETS}) 477 set_property(GLOBAL PROPERTY SubProject ${additional_target}) 478 set_property(GLOBAL PROPERTY Label ${additional_target}) 480 message("----------- [ Build ${additional_target} ] -----------
") 481 func_build_target(${additional_target} "${build_dir}
") 484 message("----------- [ Test ${additional_target} ] -----------
") 485 # runs only tests that have a LABELS property matching "${subproject}
" 486 func_test(${additional_target} "${build_dir}
") 490 if(WITH_DOCUMENTATION) 491 message("----------- [ Build Documentation ] -----------
") 492 set(ctest_use_launchers_orig ${CTEST_USE_LAUNCHERS}) 493 set(CTEST_USE_LAUNCHERS 0) 494 # Build Documentation target 495 set_property(GLOBAL PROPERTY SubProject Documentation) 496 set_property(GLOBAL PROPERTY Label Documentation) 497 func_build_target("doc
" "${build_dir}
") 498 set(CTEST_USE_LAUNCHERS ${ctest_use_launchers_orig}) 501 set_property(GLOBAL PROPERTY SubProject SuperBuild) 502 set_property(GLOBAL PROPERTY Label SuperBuild) 504 # Global coverage ... 505 if(WITH_COVERAGE AND CTEST_COVERAGE_COMMAND) 506 message("----------- [ Global coverage ] -----------
") 507 ctest_coverage(BUILD "${build_dir}
" APPEND) 508 ctest_submit(PARTS Coverage RETRY_DELAY 3 RETRY_COUNT 3) 511 # Global dynamic analysis ... 512 if(WITH_MEMCHECK AND CTEST_MEMORYCHECK_COMMAND) 513 message("----------- [ Global memcheck ] -----------
") 514 ctest_memcheck(BUILD "${build_dir}
") 515 ctest_submit(PARTS MemCheck RETRY_DELAY 3 RETRY_COUNT 3) 519 finalize_submission() 523 # Clear the CTEST_CHECKOUT_COMMAND variable to prevent continuous clients 524 # to try to checkout again 525 set(CTEST_CHECKOUT_COMMAND "")
Follow Up Storage - Class to facilitate loading/accessing structured follow-up data.
static void Update(vtkPolyData *)