# - Create ctest -S scripts to use to run dashboard builds # # include(CreateDashboardScripts) # create_dashboard_scripts([]) # # If you need additional settings to persist from the "parent" CMake instance # to the initial cache created by the dashboard script, # you may pass a filename which will be configured into the initial cache. # # In the resulting DASHBOARDSCRIPT_BASE_DIRECTORY, an end-user # may optionally create a file named # CustomInitialCache.${DASHBOARDSCRIPT_SCRIPT_NAME} # (by default, CustomInitialCache.go.cmake) containing set commands that use # the CACHE option, to set up additional site-local cache variable values. # # Requires these CMake modules: # GetCompilerInfoString # # Requires CMake 2.6 or newer (uses the 'function' command), # as well as FindGit.cmake (included with 2.8.2, may be backported) # # Original Author: # 2009-2010 Ryan Pavlik # http://academic.cleardefinition.com # Iowa State University HCI Graduate Program/VRAC # # Copyright Iowa State University 2009-2010. # Distributed under the Boost Software License, Version 1.0. # (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) # Only do any of the prep work if not already in a dashboard script if(NOT IN_DASHBOARD_SCRIPT) # Hide a CTest variable mark_as_advanced(DART_TESTING_TIMEOUT) include(GetCompilerInfoString) get_compiler_info_string(_COMPILERID) # We must run the following at "include" time, not at function call time, # to find the path to this module rather than the path to a calling list file get_filename_component(_dashboardmoddir ${CMAKE_CURRENT_LIST_FILE} PATH) if(NOT "$ENV{USER}" MATCHES "^$") set(_user "$ENV{USER}") elseif(NOT "$ENV{USERNAME}" MATCHES "^$") set(_user "$ENV{USERNAME}") endif() if(NOT _dashboardscript_machine) if(NOT SITE) site_name(SITE) endif() set(_dashboardscript_machine "${SITE}" CACHE INTERNAL "") set(SITE "${_user}@${_dashboardscript_machine}" CACHE STRING "Human-readable site name" FORCE) endif() set(DASHBOARDSCRIPT_BASE_DIRECTORY "${CMAKE_BINARY_DIR}/Dashboards-${_dashboardscript_machine}-${_user}" CACHE PATH "Directory to use as the root of all dashboard work") mark_as_advanced(DASHBOARDSCRIPT_BASE_DIRECTORY) set(DASHBOARDSCRIPT_SOURCE_DIRECTORY "${CMAKE_SOURCE_DIR}") set(BUILDNAME "${CMAKE_SYSTEM}-${CMAKE_SYSTEM_PROCESSOR}-${_COMPILERID}" CACHE STRING "Human-readable build ID info") set(DASHBOARDSCRIPT_CMAKE_COMMAND "${CMAKE_COMMAND}" CACHE FILEPATH "The cmake binary to use when configuring a dashboard build") mark_as_advanced(DASHBOARDSCRIPT_CMAKE_COMMAND) # Try to find CTest, preferably right next to the chosen CMake if(DASHBOARDSCRIPT_CMAKE_COMMAND) get_filename_component(_cmake_dir ${DASHBOARDSCRIPT_CMAKE_COMMAND} PATH) else() get_filename_component(_cmake_dir ${CMAKE_COMMAND} PATH) endif() find_program(DASHBOARDSCRIPT_CTEST_EXECUTABLE NAMES ctest HINTS "${_cmake_dir}" NO_DEFAULT_PATH) find_program(DASHBOARDSCRIPT_CTEST_EXECUTABLE NAMES ctest HINTS "${_cmake_dir}") set(DASHBOARDSCRIPT_CTEST_EXECUTABLE "${DASHBOARDSCRIPT_CTEST_EXECUTABLE}" CACHE FILEPATH "Path to the CTest executable to use for dashboard builds.") mark_as_advanced(DASHBOARDSCRIPT_CTEST_EXECUTABLE) # Optionals if(NOT "1.${CMAKE_VERSION}" VERSION_LESS "1.2.8.0") if(IS_DIRECTORY "${CMAKE_SOURCE_DIRECTORY}/.git") if(NOT GIT_FOUND) find_package(Git QUIET) endif() # If we have a valid git we found ourselves in older version of the module, # let the regular FindGit module (since 2.8.2) know. if(DASHBOARDSCRIPT_GIT_EXECUTABLE AND EXISTS "${DASHBOARDSCRIPT_GIT_EXECUTABLE}" AND NOT GIT_FOUND) set(GIT_EXECUTABLE "${DASHBOARDSCRIPT_GIT_EXECUTABLE}" CACHE FILEPATH "Git executable" FORCE) find_package(Git QUIET) endif() unset(DASHBOARDSCRIPT_GIT_EXECUTABLE) unset(DASHBOARDSCRIPT_GIT_EXECUTABLE CACHE) if(GIT_FOUND) set(UPDATE_TYPE "git") set(UPDATE_COMMAND "${GIT_EXECUTABLE}") set(UPDATE_OPTIONS "") endif() endif() endif() else() # IN_DASHBOARD_SCRIPT is YES message(STATUS "CreateDashboardScripts detected that we're in a dashboard script already.") endif() function(create_dashboard_scripts) # Only create the script if we have all the required variables # and are not already in it, and are at least 2.8.0. if(DASHBOARDSCRIPT_BASE_DIRECTORY AND DASHBOARDSCRIPT_SOURCE_DIRECTORY AND DASHBOARDSCRIPT_BASE_DIRECTORY AND BUILDNAME AND DASHBOARDSCRIPT_CMAKE_COMMAND AND DASHBOARDSCRIPT_CTEST_EXECUTABLE AND NOT IN_DASHBOARD_SCRIPT AND NOT "${CMAKE_VERSION}" VERSION_LESS "2.8.0") set(_Continuous_cron "15 * * * * ") set(_Nightly_cron "15 0 * * * ") set(_Experimental_cron "\nor run this command for an one-off experimental test build:\n") set(_Experimental_flags "-VV") message(STATUS "Dashboard scripts have been generated for automatic nightly and continuous builds.") if(WIN32) set(_Continuous_cron) set(_Nightly_cron) message(STATUS "You can set up scheduled tasks to run these command lines:") else() message(STATUS "You can add these sample lines to your crontab:") endif() set(_msg) if(NOT DASHBOARDSCRIPT_BUILD_CONFIGURATION) set(DASHBOARDSCRIPT_BUILD_CONFIGURATION "RelWithDebInfo") endif() set(DASHBOARDSCRIPT_BUILD_CONFIGURATION "${DASHBOARDSCRIPT_BUILD_CONFIGURATION}" CACHE STRING "Build configuration to use for dashboard builds by default") mark_as_advanced(DASHBOARDSCRIPT_BUILD_CONFIGURATION) foreach(DASHBOARDSCRIPT_DASH_TYPE Nightly Continuous Experimental) # If given a cache template, configure it if(ARGN) configure_file(${ARGN} "${DASHBOARDSCRIPT_BASE_DIRECTORY}/GeneratedInitialCache.run${DASHBOARDSCRIPT_DASH_TYPE}.cmake" @ONLY) endif() # Actually create the script file configure_file(${_dashboardmoddir}/DashboardScript.cmake.in "${DASHBOARDSCRIPT_BASE_DIRECTORY}/run${DASHBOARDSCRIPT_DASH_TYPE}.cmake" @ONLY) set(_msg "${_msg}\n${_${DASHBOARDSCRIPT_DASH_TYPE}_cron}\"${DASHBOARDSCRIPT_CTEST_EXECUTABLE}\" -S \"${DASHBOARDSCRIPT_BASE_DIRECTORY}/run${DASHBOARDSCRIPT_DASH_TYPE}.cmake\" ${_${DASHBOARDSCRIPT_DASH_TYPE}_flags}") endforeach() message(STATUS "\n${_msg}\n") message(STATUS "") endif() endfunction()