123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- ###########################################################################
- #
- # Library: CTK
- #
- # Copyright (c) Kitware Inc.
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0.txt
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- #
- ###########################################################################
- #
- # Included from a dashboard script, this cmake file will drive the configure and build
- # steps of the different CTK sub-project (library, application or plugins)
- #
- # ctkDashboardDriverScript.cmake is automatically downloaded by the dashboard script
- # from the url http://commontk.org/ctkDashboardDriverScript.cmake
- # \note Any change to the file should also be backported on http://commontk.org/
- #
- # XXX This allows to support older scripts having the typo
- if(DEFINED ADDITIONNAL_CMAKECACHE_OPTION)
- set(ADDITIONAL_CMAKECACHE_OPTION ${ADDITIONNAL_CMAKECACHE_OPTION})
- endif()
- #-----------------------------------------------------------------------------
- # The following variable are expected to be define in the top-level script:
- set(expected_variables
- ADDITIONAL_CMAKECACHE_OPTION
- CTEST_NOTES_FILES
- CTEST_SITE
- CTEST_DASHBOARD_ROOT
- CTEST_CMAKE_GENERATOR
- WITH_MEMCHECK
- WITH_COVERAGE
- WITH_DOCUMENTATION
- CTEST_BUILD_CONFIGURATION
- CTEST_TEST_TIMEOUT
- CTEST_BUILD_FLAGS
- TEST_TO_EXCLUDE_REGEX
- CTEST_PROJECT_NAME
- CTEST_SOURCE_DIRECTORY
- CTEST_BINARY_DIRECTORY
- CTEST_BUILD_NAME
- SCRIPT_MODE
- CTEST_COVERAGE_COMMAND
- CTEST_MEMORYCHECK_COMMAND
- CTEST_GIT_COMMAND
- QT_QMAKE_EXECUTABLE
- )
- if(WITH_DOCUMENTATION)
- list(APPEND expected_variables DOCUMENTATION_ARCHIVES_OUTPUT_DIRECTORY)
- endif()
- foreach(var ${expected_variables})
- if(NOT DEFINED ${var})
- message(FATAL_ERROR "Variable ${var} should be defined in top-level script !")
- endif()
- endforeach()
- # If the dashscript doesn't define a GIT_REPOSITORY variable, let's define it here.
- if(NOT DEFINED GIT_REPOSITORY OR GIT_REPOSITORY STREQUAL "")
- set(GIT_REPOSITORY http://github.com/commontk/CTK.git)
- endif()
- set(repository ${GIT_REPOSITORY})
- set(git_branch_option "")
- if(NOT "${GIT_TAG}" STREQUAL "")
- set(git_branch_option "-b ${GIT_TAG}")
- endif()
- message("GIT_REPOSITORY ......: ${GIT_REPOSITORY}")
- message("GIT_TAG .............: ${GIT_TAG}")
- # Should binary directory be cleaned?
- set(empty_binary_directory FALSE)
- # Attempt to build and test also if 'ctest_update' returned an error
- set(force_build FALSE)
- # Ensure SCRIPT_MODE is lowercase
- string(TOLOWER ${SCRIPT_MODE} SCRIPT_MODE)
- # Set model options
- set(model "")
- if(SCRIPT_MODE STREQUAL "experimental")
- set(empty_binary_directory FALSE)
- set(force_build TRUE)
- set(model Experimental)
- elseif(SCRIPT_MODE STREQUAL "continuous")
- set(empty_binary_directory TRUE)
- set(force_build FALSE)
- set(model Continuous)
- elseif(SCRIPT_MODE STREQUAL "nightly")
- set(empty_binary_directory TRUE)
- set(force_build TRUE)
- set(model Nightly)
- else()
- message(FATAL_ERROR "Unknown script mode: '${SCRIPT_MODE}'. Script mode should be either 'experimental', 'continuous' or 'nightly'")
- endif()
- # For more details, see http://www.kitware.com/blog/home/post/11
- set(CTEST_USE_LAUNCHERS 1)
- if(NOT "${CTEST_CMAKE_GENERATOR}" MATCHES "Make")
- set(CTEST_USE_LAUNCHERS 0)
- endif()
- set(ENV{CTEST_USE_LAUNCHERS_DEFAULT} ${CTEST_USE_LAUNCHERS})
- if(empty_binary_directory)
- message("Directory ${CTEST_BINARY_DIRECTORY} cleaned !")
- ctest_empty_binary_directory(${CTEST_BINARY_DIRECTORY})
- endif()
- if(NOT EXISTS "${CTEST_SOURCE_DIRECTORY}")
- set(CTEST_CHECKOUT_COMMAND "${CTEST_GIT_COMMAND} clone ${git_branch_option} ${GIT_REPOSITORY} ${CTEST_SOURCE_DIRECTORY}")
- endif()
- set(CTEST_UPDATE_COMMAND "${CTEST_GIT_COMMAND}")
- #
- # run_ctest macro
- #
- macro(run_ctest)
- message("----------- [ Start ${CTEST_PROJECT_NAME} ] -----------")
- ctest_start(${model})
- message("----------- [ Update ${CTEST_PROJECT_NAME} ] -----------")
- ctest_update(SOURCE "${CTEST_SOURCE_DIRECTORY}" RETURN_VALUE res)
- # force a build if this is the first run and the build dir is empty
- if(NOT EXISTS "${CTEST_BINARY_DIRECTORY}/CMakeCache.txt")
- message("First time build - Initialize CMakeCache.txt")
- set(res 1)
- # Write initial cache.
- file(WRITE "${CTEST_BINARY_DIRECTORY}/CMakeCache.txt" "
- QT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}
- WITH_COVERAGE:BOOL=${WITH_COVERAGE}
- DOCUMENTATION_TARGET_IN_ALL:BOOL=${WITH_DOCUMENTATION}
- DOCUMENTATION_ARCHIVES_OUTPUT_DIRECTORY:PATH=${DOCUMENTATION_ARCHIVES_OUTPUT_DIRECTORY}
- ${ADDITIONAL_CMAKECACHE_OPTION}
- ")
- endif()
-
- if(res GREATER 0 OR force_build)
-
- #-----------------------------------------------------------------------------
- # Update
- #-----------------------------------------------------------------------------
- ctest_submit(PARTS Update)
- #-----------------------------------------------------------------------------
- # Configure
- #-----------------------------------------------------------------------------
- message("----------- [ Configure ${CTEST_PROJECT_NAME} ] -----------")
- ctest_configure(BUILD "${CTEST_BINARY_DIRECTORY}")
- ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}")
- ctest_submit(PARTS Configure)
-
- #-----------------------------------------------------------------------------
- # Build top level
- #-----------------------------------------------------------------------------
- set(build_errors)
- message("----------- [ Build ${CTEST_PROJECT_NAME} ] -----------")
- ctest_build(BUILD "${CTEST_BINARY_DIRECTORY}" NUMBER_ERRORS build_errors APPEND)
- ctest_submit(PARTS Build)
- #-----------------------------------------------------------------------------
- # Inner build directory
- #-----------------------------------------------------------------------------
- set(ctk_build_dir "${CTEST_BINARY_DIRECTORY}/CTK-build")
- #-----------------------------------------------------------------------------
- # Test
- #-----------------------------------------------------------------------------
- message("----------- [ Test ${CTEST_PROJECT_NAME} ] -----------")
- ctest_test(
- BUILD "${ctk_build_dir}"
- PARALLEL_LEVEL ${CTEST_PARALLEL_LEVEL}
- EXCLUDE ${TEST_TO_EXCLUDE_REGEX})
- ctest_submit(PARTS Test)
- #-----------------------------------------------------------------------------
- # Global coverage ...
- #-----------------------------------------------------------------------------
- if(WITH_COVERAGE AND CTEST_COVERAGE_COMMAND)
- # HACK Unfortunately ctest_coverage ignores the build argument, try to force it...
- file(READ ${ctk_build_dir}/CMakeFiles/TargetDirectories.txt ctk_build_coverage_dirs)
- file(APPEND "${CTEST_BINARY_DIRECTORY}/CMakeFiles/TargetDirectories.txt" "${ctk_build_coverage_dirs}")
-
- message("----------- [ Coverage ] -----------")
- ctest_coverage(BUILD "${ctk_build_dir}")
- ctest_submit(PARTS Coverage)
- endif()
- #-----------------------------------------------------------------------------
- # Global dynamic analysis ...
- #-----------------------------------------------------------------------------
- if(WITH_MEMCHECK AND CTEST_MEMORYCHECK_COMMAND)
- message("----------- [ Memcheck ] -----------")
- ctest_memcheck(BUILD "${ctk_build_dir}")
- ctest_submit(PARTS MemCheck)
- endif()
- # Note should be at the end
- ctest_submit(PARTS Notes)
-
- endif()
- endmacro()
- if(SCRIPT_MODE STREQUAL "continuous")
- while(${CTEST_ELAPSED_TIME} LESS 46800) # Lasts 13 hours (Assuming it starts at 9am, it will end around 10pm)
- set(START_TIME ${CTEST_ELAPSED_TIME})
- run_ctest()
- # Loop no faster than once every 5 minutes
- message("Wait for 5 minutes ...")
- ctest_sleep(${START_TIME} 300 ${CTEST_ELAPSED_TIME})
- endwhile()
- else()
- run_ctest()
- endif()
|