ctkDashboardDriverScript.cmake 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. ###########################################################################
  2. #
  3. # Library: CTK
  4. #
  5. # Copyright (c) Kitware Inc.
  6. #
  7. # Licensed under the Apache License, Version 2.0 (the "License");
  8. # you may not use this file except in compliance with the License.
  9. # You may obtain a copy of the License at
  10. #
  11. # http://www.apache.org/licenses/LICENSE-2.0.txt
  12. #
  13. # Unless required by applicable law or agreed to in writing, software
  14. # distributed under the License is distributed on an "AS IS" BASIS,
  15. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. # See the License for the specific language governing permissions and
  17. # limitations under the License.
  18. #
  19. ###########################################################################
  20. #
  21. # Included from a dashboard script, this cmake file will drive the configure and build
  22. # steps of the different CTK sub-project (library, application or plugins)
  23. #
  24. # ctkDashboardDriverScript.cmake is automatically downloaded by the dashboard script
  25. # from the url http://commontk.org/ctkDashboardDriverScript.cmake
  26. # \note Any change to the file should also be backported on http://commontk.org/
  27. #
  28. #-----------------------------------------------------------------------------
  29. # The following variable are expected to be define in the top-level script:
  30. set(expected_variables
  31. ADDITIONNAL_CMAKECACHE_OPTION
  32. CTEST_NOTES_FILES
  33. CTEST_SITE
  34. CTEST_DASHBOARD_ROOT
  35. CTEST_CMAKE_GENERATOR
  36. WITH_MEMCHECK
  37. WITH_COVERAGE
  38. WITH_DOCUMENTATION
  39. CTEST_BUILD_CONFIGURATION
  40. CTEST_TEST_TIMEOUT
  41. CTEST_BUILD_FLAGS
  42. TEST_TO_EXCLUDE_REGEX
  43. CTEST_PROJECT_NAME
  44. CTEST_SOURCE_DIRECTORY
  45. CTEST_BINARY_DIRECTORY
  46. CTEST_BUILD_NAME
  47. SCRIPT_MODE
  48. CTEST_COVERAGE_COMMAND
  49. CTEST_MEMORYCHECK_COMMAND
  50. CTEST_GIT_COMMAND
  51. QT_QMAKE_EXECUTABLE
  52. )
  53. if(WITH_DOCUMENTATION)
  54. list(APPEND expected_variables DOCUMENTATION_ARCHIVES_OUTPUT_DIRECTORY)
  55. endif()
  56. foreach(var ${expected_variables})
  57. if(NOT DEFINED ${var})
  58. message(FATAL_ERROR "Variable ${var} should be defined in top-level script !")
  59. endif()
  60. endforeach()
  61. # If the dashscript doesn't define a GIT_REPOSITORY variable, let's define it here.
  62. if (NOT DEFINED GIT_REPOSITORY OR GIT_REPOSITORY STREQUAL "")
  63. set(GIT_REPOSITORY http://github.com/commontk/CTK.git)
  64. endif()
  65. # Should binary directory be cleaned?
  66. set(empty_binary_directory FALSE)
  67. # Attempt to build and test also if 'ctest_update' returned an error
  68. set(force_build FALSE)
  69. # Set model options
  70. set(model "")
  71. if (SCRIPT_MODE STREQUAL "experimental")
  72. set(empty_binary_directory FALSE)
  73. set(force_build TRUE)
  74. set(model Experimental)
  75. elseif (SCRIPT_MODE STREQUAL "continuous")
  76. set(empty_binary_directory TRUE)
  77. set(force_build FALSE)
  78. set(model Continuous)
  79. elseif (SCRIPT_MODE STREQUAL "nightly")
  80. set(empty_binary_directory TRUE)
  81. set(force_build TRUE)
  82. set(model Nightly)
  83. else()
  84. message(FATAL_ERROR "Unknown script mode: '${SCRIPT_MODE}'. Script mode should be either 'experimental', 'continuous' or 'nightly'")
  85. endif()
  86. #message("script_mode:${SCRIPT_MODE}")
  87. #message("model:${model}")
  88. #message("empty_binary_directory:${empty_binary_directory}")
  89. #message("force_build:${force_build}")
  90. # For more details, see http://www.kitware.com/blog/home/post/11
  91. set(CTEST_USE_LAUNCHERS 1)
  92. if(NOT "${CTEST_CMAKE_GENERATOR}" MATCHES "Make")
  93. set(CTEST_USE_LAUNCHERS 0)
  94. endif()
  95. set(ENV{CTEST_USE_LAUNCHERS_DEFAULT} ${CTEST_USE_LAUNCHERS})
  96. if(empty_binary_directory)
  97. message("Directory ${CTEST_BINARY_DIRECTORY} cleaned !")
  98. ctest_empty_binary_directory(${CTEST_BINARY_DIRECTORY})
  99. endif()
  100. if(NOT EXISTS "${CTEST_SOURCE_DIRECTORY}")
  101. set(CTEST_CHECKOUT_COMMAND "${CTEST_GIT_COMMAND} clone ${GIT_REPOSITORY} ${CTEST_SOURCE_DIRECTORY}")
  102. endif()
  103. set(CTEST_UPDATE_COMMAND "${CTEST_GIT_COMMAND}")
  104. #
  105. # run_ctest macro
  106. #
  107. macro(run_ctest)
  108. ctest_start(${model})
  109. ctest_update(SOURCE "${CTEST_SOURCE_DIRECTORY}" RETURN_VALUE res)
  110. # force a build if this is the first run and the build dir is empty
  111. if(NOT EXISTS "${CTEST_BINARY_DIRECTORY}/CMakeCache.txt")
  112. message("First time build - Initialize CMakeCache.txt")
  113. set(res 1)
  114. # Write initial cache.
  115. file(WRITE "${CTEST_BINARY_DIRECTORY}/CMakeCache.txt" "
  116. QT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}
  117. SUPERBUILD_EXCLUDE_CTKBUILD_TARGET:BOOL=TRUE
  118. WITH_COVERAGE:BOOL=${WITH_COVERAGE}
  119. #DOCUMENTATION_TARGET_IN_ALL:BOOL=${WITH_DOCUMENTATION}
  120. DOCUMENTATION_ARCHIVES_OUTPUT_DIRECTORY:PATH=${DOCUMENTATION_ARCHIVES_OUTPUT_DIRECTORY}
  121. ${ADDITIONNAL_CMAKECACHE_OPTION}
  122. ")
  123. endif()
  124. if (res GREATER 0 OR force_build)
  125. ctest_submit(PARTS Update)
  126. message("Configure SuperBuild")
  127. set_property(GLOBAL PROPERTY SubProject SuperBuild)
  128. set_property(GLOBAL PROPERTY Label SuperBuild)
  129. ctest_configure(BUILD "${CTEST_BINARY_DIRECTORY}")
  130. ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}")
  131. ctest_submit(PARTS Configure)
  132. ctest_submit(FILES "${CTEST_BINARY_DIRECTORY}/Project.xml")
  133. # Build top level
  134. message("----------- [ Build SuperBuild ] -----------")
  135. ctest_build(BUILD "${CTEST_BINARY_DIRECTORY}" APPEND)
  136. ctest_submit(PARTS Build)
  137. ctest_test(
  138. BUILD "${CTEST_BINARY_DIRECTORY}"
  139. INCLUDE_LABEL "SuperBuild"
  140. PARALLEL_LEVEL 8
  141. EXCLUDE ${TEST_TO_EXCLUDE_REGEX})
  142. # runs only tests that have a LABELS property matching "${subproject}"
  143. ctest_submit(PARTS Test)
  144. set(ctk_build_dir "${CTEST_BINARY_DIRECTORY}/CTK-build")
  145. # To get CTEST_PROJECT_SUBPROJECTS definition
  146. include("${CTEST_BINARY_DIRECTORY}/CTestConfigSubProject.cmake")
  147. set(kit_suffixes
  148. CppTests
  149. #PythonTests
  150. )
  151. set(kit_widgets_suffixes
  152. Plugins
  153. )
  154. foreach(subproject ${CTEST_PROJECT_SUBPROJECTS})
  155. set_property(GLOBAL PROPERTY SubProject ${subproject})
  156. set_property(GLOBAL PROPERTY Label ${subproject})
  157. message("Build ${subproject}")
  158. # Configure target
  159. ctest_configure(BUILD "${CTEST_BINARY_DIRECTORY}")
  160. ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}")
  161. ctest_submit(PARTS Configure)
  162. # Build target
  163. set(CTEST_BUILD_TARGET "${subproject}")
  164. ctest_build(BUILD "${ctk_build_dir}" APPEND)
  165. ctest_submit(PARTS Build)
  166. # Loop over kit suffixes and try to build the corresponding target
  167. foreach(kit_suffixe ${kit_suffixes})
  168. message("----------- [ Build ${subproject}${kit_suffixe} ] -----------")
  169. set(CTEST_BUILD_TARGET "${subproject}${kit_suffixe}")
  170. ctest_build(BUILD "${ctk_build_dir}" APPEND)
  171. ctest_submit(PARTS Build)
  172. endforeach()
  173. if ("${subproject}" MATCHES "Widgets$")
  174. # Loop over kit suffixes and try to build the corresponding target
  175. foreach(kit_widgets_suffixe ${kit_widgets_suffixes})
  176. message("----------- [ Build ${subproject}${kit_widgets_suffixe} ] -----------")
  177. set(CTEST_BUILD_TARGET "${subproject}${kit_widgets_suffixe}")
  178. ctest_build(BUILD "${ctk_build_dir}" APPEND)
  179. ctest_submit(PARTS Build)
  180. endforeach()
  181. endif()
  182. endforeach()
  183. if (WITH_DOCUMENTATION)
  184. message("----------- [ Build Documentation ] -----------")
  185. # Build Documentation target
  186. set_property(GLOBAL PROPERTY SubProject Documentation)
  187. set_property(GLOBAL PROPERTY Label Documentation)
  188. set(CTEST_BUILD_TARGET "doc")
  189. ctest_build(BUILD "${ctk_build_dir}" APPEND)
  190. ctest_submit(PARTS Build)
  191. endif()
  192. # HACK Unfortunately ctest_coverage ignores the build argument, try to force it...
  193. file(READ ${ctk_build_dir}/CMakeFiles/TargetDirectories.txt ctk_build_coverage_dirs)
  194. file(APPEND "${CTEST_BINARY_DIRECTORY}/CMakeFiles/TargetDirectories.txt" "${ctk_build_coverage_dirs}")
  195. foreach(subproject ${CTEST_PROJECT_SUBPROJECTS})
  196. set_property(GLOBAL PROPERTY SubProject ${subproject})
  197. set_property(GLOBAL PROPERTY Label ${subproject})
  198. message("----------- [ Test ${subproject} ] -----------")
  199. ctest_test(
  200. BUILD "${ctk_build_dir}"
  201. INCLUDE_LABEL "${subproject}"
  202. PARALLEL_LEVEL 8
  203. EXCLUDE ${test_to_exclude_regex})
  204. # runs only tests that have a LABELS property matching "${subproject}"
  205. ctest_submit(PARTS Test)
  206. # Coverage per sub-project (library, application or plugin)
  207. if (WITH_COVERAGE AND CTEST_COVERAGE_COMMAND)
  208. message("----------- [ Coverage ${subproject} ] -----------")
  209. ctest_coverage(BUILD "${ctk_build_dir}" LABELS "${subproject}")
  210. ctest_submit(PARTS Coverage)
  211. endif ()
  212. #if (WITH_MEMCHECK AND CTEST_MEMORYCHECK_COMMAND)
  213. # ctest_memcheck(BUILD "${ctk_build_dir}" INCLUDE_LABEL "${subproject}")
  214. # ctest_submit(PARTS MemCheck)
  215. #endif ()
  216. endforeach()
  217. set_property(GLOBAL PROPERTY SubProject SuperBuild)
  218. set_property(GLOBAL PROPERTY Label SuperBuild)
  219. # Global coverage ...
  220. if (WITH_COVERAGE AND CTEST_COVERAGE_COMMAND)
  221. message("----------- [ Global coverage ] -----------")
  222. ctest_coverage(BUILD "${ctk_build_dir}")
  223. ctest_submit(PARTS Coverage)
  224. endif ()
  225. # Global dynamic analysis ...
  226. if (WITH_MEMCHECK AND CTEST_MEMORYCHECK_COMMAND)
  227. message("----------- [ Global memcheck ] -----------")
  228. ctest_memcheck(BUILD "${ctk_build_dir}")
  229. ctest_submit(PARTS MemCheck)
  230. endif ()
  231. # Note should be at the end
  232. ctest_submit(PARTS Notes)
  233. endif()
  234. endmacro()
  235. if(SCRIPT_MODE STREQUAL "continuous")
  236. while(${CTEST_ELAPSED_TIME} LESS 46800) # Lasts 13 hours (Assuming it starts at 9am, it will end around 10pm)
  237. set(START_TIME ${CTEST_ELAPSED_TIME})
  238. run_ctest()
  239. # Loop no faster than once every 5 minutes
  240. message("Wait for 5 minutes ...")
  241. ctest_sleep(${START_TIME} 300 ${CTEST_ELAPSED_TIME})
  242. endwhile()
  243. else()
  244. run_ctest()
  245. endif()