1# - Create ctest -S scripts to use to run dashboard builds 2# 3# include(CreateDashboardScripts) 4# create_dashboard_scripts([<initialcachetemplatefilename>]) 5# 6# If you need additional settings to persist from the "parent" CMake instance 7# to the initial cache created by the dashboard script, 8# you may pass a filename which will be configured into the initial cache. 9# 10# In the resulting DASHBOARDSCRIPT_BASE_DIRECTORY, an end-user 11# may optionally create a file named 12# CustomInitialCache.${DASHBOARDSCRIPT_SCRIPT_NAME} 13# (by default, CustomInitialCache.go.cmake) containing set commands that use 14# the CACHE option, to set up additional site-local cache variable values. 15# 16# Requires these CMake modules: 17# GetCompilerInfoString 18# 19# Requires CMake 2.6 or newer (uses the 'function' command), 20# as well as FindGit.cmake (included with 2.8.2, may be backported) 21# 22# Original Author: 23# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net> 24# http://academic.cleardefinition.com 25# Iowa State University HCI Graduate Program/VRAC 26# 27# Copyright Iowa State University 2009-2010. 28# Distributed under the Boost Software License, Version 1.0. 29# (See accompanying file LICENSE_1_0.txt or copy at 30# http://www.boost.org/LICENSE_1_0.txt) 31 32# Only do any of the prep work if not already in a dashboard script 33if(NOT IN_DASHBOARD_SCRIPT) 34 35 # Hide a CTest variable 36 mark_as_advanced(DART_TESTING_TIMEOUT) 37 38 include(GetCompilerInfoString) 39 40 get_compiler_info_string(_COMPILERID) 41 42 # We must run the following at "include" time, not at function call time, 43 # to find the path to this module rather than the path to a calling list file 44 get_filename_component(_dashboardmoddir 45 ${CMAKE_CURRENT_LIST_FILE} 46 PATH) 47 48 if(NOT "$ENV{USER}" MATCHES "^$") 49 set(_user "$ENV{USER}") 50 elseif(NOT "$ENV{USERNAME}" MATCHES "^$") 51 set(_user "$ENV{USERNAME}") 52 endif() 53 54 if(NOT _dashboardscript_machine) 55 if(NOT SITE) 56 site_name(SITE) 57 endif() 58 set(_dashboardscript_machine "${SITE}" CACHE INTERNAL "") 59 set(SITE 60 "${_user}@${_dashboardscript_machine}" 61 CACHE 62 STRING 63 "Human-readable site name" 64 FORCE) 65 endif() 66 67 set(DASHBOARDSCRIPT_BASE_DIRECTORY 68 "${CMAKE_BINARY_DIR}/Dashboards-${_dashboardscript_machine}-${_user}" 69 CACHE 70 PATH 71 "Directory to use as the root of all dashboard work") 72 mark_as_advanced(DASHBOARDSCRIPT_BASE_DIRECTORY) 73 74 set(DASHBOARDSCRIPT_SOURCE_DIRECTORY "${CMAKE_SOURCE_DIR}") 75 76 set(BUILDNAME 77 "${CMAKE_SYSTEM}-${CMAKE_SYSTEM_PROCESSOR}-${_COMPILERID}" 78 CACHE 79 STRING 80 "Human-readable build ID info") 81 82 set(DASHBOARDSCRIPT_CMAKE_COMMAND 83 "${CMAKE_COMMAND}" 84 CACHE 85 FILEPATH 86 "The cmake binary to use when configuring a dashboard build") 87 mark_as_advanced(DASHBOARDSCRIPT_CMAKE_COMMAND) 88 89 # Try to find CTest, preferably right next to the chosen CMake 90 if(DASHBOARDSCRIPT_CMAKE_COMMAND) 91 get_filename_component(_cmake_dir 92 ${DASHBOARDSCRIPT_CMAKE_COMMAND} 93 PATH) 94 else() 95 get_filename_component(_cmake_dir ${CMAKE_COMMAND} PATH) 96 endif() 97 find_program(DASHBOARDSCRIPT_CTEST_EXECUTABLE 98 NAMES 99 ctest 100 HINTS 101 "${_cmake_dir}" 102 NO_DEFAULT_PATH) 103 find_program(DASHBOARDSCRIPT_CTEST_EXECUTABLE 104 NAMES 105 ctest 106 HINTS 107 "${_cmake_dir}") 108 109 110 set(DASHBOARDSCRIPT_CTEST_EXECUTABLE 111 "${DASHBOARDSCRIPT_CTEST_EXECUTABLE}" 112 CACHE 113 FILEPATH 114 "Path to the CTest executable to use for dashboard builds.") 115 mark_as_advanced(DASHBOARDSCRIPT_CTEST_EXECUTABLE) 116 117 118 # Optionals 119 120 if(NOT "1.${CMAKE_VERSION}" VERSION_LESS "1.2.8.0") 121 if(IS_DIRECTORY "${CMAKE_SOURCE_DIRECTORY}/.git") 122 if(NOT GIT_FOUND) 123 find_package(Git QUIET) 124 endif() 125 # If we have a valid git we found ourselves in older version of the module, 126 # let the regular FindGit module (since 2.8.2) know. 127 if(DASHBOARDSCRIPT_GIT_EXECUTABLE AND EXISTS "${DASHBOARDSCRIPT_GIT_EXECUTABLE}" AND NOT GIT_FOUND) 128 set(GIT_EXECUTABLE "${DASHBOARDSCRIPT_GIT_EXECUTABLE}" CACHE FILEPATH "Git executable" FORCE) 129 find_package(Git QUIET) 130 endif() 131 unset(DASHBOARDSCRIPT_GIT_EXECUTABLE) 132 unset(DASHBOARDSCRIPT_GIT_EXECUTABLE CACHE) 133 if(GIT_FOUND) 134 set(UPDATE_TYPE "git") 135 set(UPDATE_COMMAND "${GIT_EXECUTABLE}") 136 set(UPDATE_OPTIONS "") 137 endif() 138 endif() 139 endif() 140 141else() 142 # IN_DASHBOARD_SCRIPT is YES 143 message(STATUS 144 "CreateDashboardScripts detected that we're in a dashboard script already.") 145endif() 146 147function(create_dashboard_scripts) 148 # Only create the script if we have all the required variables 149 # and are not already in it, and are at least 2.8.0. 150 if(DASHBOARDSCRIPT_BASE_DIRECTORY AND 151 DASHBOARDSCRIPT_SOURCE_DIRECTORY AND 152 DASHBOARDSCRIPT_BASE_DIRECTORY AND 153 BUILDNAME AND 154 DASHBOARDSCRIPT_CMAKE_COMMAND AND 155 DASHBOARDSCRIPT_CTEST_EXECUTABLE AND 156 NOT IN_DASHBOARD_SCRIPT AND 157 NOT "${CMAKE_VERSION}" VERSION_LESS "2.8.0") 158 159 set(_Continuous_cron "15 * * * * ") 160 set(_Nightly_cron "15 0 * * * ") 161 set(_Experimental_cron 162 "\nor run this command for an one-off experimental test build:\n") 163 set(_Experimental_flags "-VV") 164 165 message(STATUS 166 "Dashboard scripts have been generated for automatic nightly and continuous builds.") 167 if(WIN32) 168 set(_Continuous_cron) 169 set(_Nightly_cron) 170 message(STATUS 171 "You can set up scheduled tasks to run these command lines:") 172 else() 173 message(STATUS "You can add these sample lines to your crontab:") 174 endif() 175 176 set(_msg) 177 178 if(NOT DASHBOARDSCRIPT_BUILD_CONFIGURATION) 179 set(DASHBOARDSCRIPT_BUILD_CONFIGURATION "RelWithDebInfo") 180 endif() 181 set(DASHBOARDSCRIPT_BUILD_CONFIGURATION "${DASHBOARDSCRIPT_BUILD_CONFIGURATION}" CACHE STRING "Build configuration to use for dashboard builds by default") 182 mark_as_advanced(DASHBOARDSCRIPT_BUILD_CONFIGURATION) 183 184 foreach(DASHBOARDSCRIPT_DASH_TYPE Nightly Continuous Experimental) 185 # If given a cache template, configure it 186 if(ARGN) 187 configure_file(${ARGN} 188 "${DASHBOARDSCRIPT_BASE_DIRECTORY}/GeneratedInitialCache.run${DASHBOARDSCRIPT_DASH_TYPE}.cmake" 189 @ONLY) 190 endif() 191 192 # Actually create the script file 193 configure_file(${_dashboardmoddir}/DashboardScript.cmake.in 194 "${DASHBOARDSCRIPT_BASE_DIRECTORY}/run${DASHBOARDSCRIPT_DASH_TYPE}.cmake" 195 @ONLY) 196 197 set(_msg 198 "${_msg}\n${_${DASHBOARDSCRIPT_DASH_TYPE}_cron}\"${DASHBOARDSCRIPT_CTEST_EXECUTABLE}\" -S \"${DASHBOARDSCRIPT_BASE_DIRECTORY}/run${DASHBOARDSCRIPT_DASH_TYPE}.cmake\" ${_${DASHBOARDSCRIPT_DASH_TYPE}_flags}") 199 200 endforeach() 201 message(STATUS "\n${_msg}\n") 202 message(STATUS "") 203 204 endif() 205endfunction() 206