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