ctkDashboardDriverScript.cmake 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. #
  2. # Included from a dashboard script, this cmake file will drive the configure and build
  3. # steps of the different CTK sub-project (library, application or plugins)
  4. #
  5. # The following variable are expected to be define in the top-level script:
  6. set(expected_variables
  7. ADDITIONNAL_CMAKECACHE_OPTION
  8. CTEST_NOTES_FILES
  9. CTEST_SITE
  10. CTEST_DASHBOARD_ROOT
  11. CTEST_CMAKE_COMMAND
  12. CTEST_CMAKE_GENERATOR
  13. WITH_MEMCHECK
  14. WITH_COVERAGE
  15. CTEST_BUILD_CONFIGURATION
  16. CTEST_TEST_TIMEOUT
  17. CTEST_BUILD_FLAGS
  18. TEST_TO_EXCLUDE_REGEX
  19. CTEST_PROJECT_NAME
  20. CTEST_SOURCE_DIRECTORY
  21. CTEST_BINARY_DIRECTORY
  22. CTEST_BUILD_NAME
  23. SCRIPT_MODE
  24. CTEST_COVERAGE_COMMAND
  25. CTEST_MEMORYCHECK_COMMAND
  26. CTEST_GIT_COMMAND
  27. )
  28. foreach(var ${expected_variables})
  29. if(NOT DEFINED ${var})
  30. message(FATAL_ERROR "Variable ${var} should be defined in top-level script !")
  31. endif()
  32. endforeach()
  33. # Should binary directory be cleaned?
  34. set(empty_binary_directory FALSE)
  35. # Attempt to build and test also if 'ctest_update' returned an error
  36. set(force_build FALSE)
  37. set(model "")
  38. if (SCRIPT_MODE STREQUAL "experimental")
  39. set(empty_binary_directory FALSE)
  40. set(force_build TRUE)
  41. set(model Experimental)
  42. elseif (SCRIPT_MODE STREQUAL "continuous")
  43. set(empty_binary_directory FALSE)
  44. set(force_build FALSE)
  45. set(model Continuous)
  46. elseif (SCRIPT_MODE STREQUAL "nightly")
  47. set(empty_binary_directory TRUE)
  48. set(force_build TRUE)
  49. set(model Nightly)
  50. else()
  51. message(FATAL_ERROR "Unknown script mode: '${SCRIPT_MODE}'. Script mode should be either 'experimental', 'continuous' or 'nightly'")
  52. endif()
  53. #message("script_mode:${SCRIPT_MODE}")
  54. #message("model:${model}")
  55. #message("empty_binary_directory:${empty_binary_directory}")
  56. #message("force_build:${force_build}")
  57. set(CTEST_USE_LAUNCHERS 1)
  58. if(empty_binary_directory)
  59. message("Directory ${CTEST_BINARY_DIRECTORY} cleaned !")
  60. ctest_empty_binary_directory(${CTEST_BINARY_DIRECTORY})
  61. endif()
  62. if(NOT EXISTS "${CTEST_SOURCE_DIRECTORY}")
  63. set(CTEST_CHECKOUT_COMMAND "${CTEST_GIT_COMMAND} clone git@github.com:pieper/CTK.git ${CTEST_SOURCE_DIRECTORY}")
  64. endif()
  65. set(CTEST_UPDATE_COMMAND "${CTEST_GIT_COMMAND}")
  66. #
  67. # run_ctest macro
  68. #
  69. MACRO(run_ctest)
  70. ctest_start(${model})
  71. ctest_update(SOURCE "${CTEST_SOURCE_DIRECTORY}" RETURN_VALUE res)
  72. #ctest_submit(PARTS Update Notes)
  73. # force a build if this is the first run and the build dir is empty
  74. if(NOT EXISTS "${CTEST_BINARY_DIRECTORY}/CMakeCache.txt")
  75. message("First time build - Initialize CMakeCache.txt")
  76. set(res 1)
  77. # Write initial cache.
  78. file(WRITE "${CTEST_BINARY_DIRECTORY}/CMakeCache.txt" "
  79. CTEST_USE_LAUNCHERS:BOOL=${CTEST_USE_LAUNCHERS}
  80. QT_QMAKE_EXECUTABLE:FILEPATH=/home/jchris/Projects/qtsdk-2010.02/qt/bin/qmake
  81. SUPERBUILD_EXCLUDE_CTKBUILD_TARGET:BOOL=TRUE
  82. WITH_COVERAGE:BOOL=TRUE
  83. ${ADDITIONNAL_CMAKECACHE_OPTION}
  84. ")
  85. endif()
  86. if (res GREATER 0 OR force_build)
  87. message("Configure SuperBuild")
  88. set_property(GLOBAL PROPERTY SubProject SuperBuild)
  89. set_property(GLOBAL PROPERTY Label SuperBuild)
  90. ctest_configure(BUILD "${CTEST_BINARY_DIRECTORY}")
  91. ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}")
  92. ctest_submit(PARTS Configure)
  93. ctest_submit(FILES "${CTEST_BINARY_DIRECTORY}/Project.xml")
  94. # Build top level
  95. message("Build SuperBuild")
  96. ctest_build(BUILD "${CTEST_BINARY_DIRECTORY}" APPEND)
  97. ctest_submit(PARTS Build)
  98. ctest_test(
  99. BUILD "${CTEST_BINARY_DIRECTORY}"
  100. INCLUDE_LABEL "SuperBuild"
  101. PARALLEL_LEVEL 8
  102. EXCLUDE ${TEST_TO_EXCLUDE_REGEX})
  103. # runs only tests that have a LABELS property matching "${subproject}"
  104. ctest_submit(PARTS Test)
  105. set(ctk_build_dir "${CTEST_BINARY_DIRECTORY}/CTK-build")
  106. # To get CTEST_PROJECT_SUBPROJECTS definition
  107. include("${CTEST_BINARY_DIRECTORY}/CTestConfigSubProject.cmake")
  108. set(kit_suffixes
  109. CppTests
  110. #PythonTests
  111. Plugins
  112. )
  113. foreach(subproject ${CTEST_PROJECT_SUBPROJECTS})
  114. set_property(GLOBAL PROPERTY SubProject ${subproject})
  115. set_property(GLOBAL PROPERTY Label ${subproject})
  116. message("Build ${subproject}")
  117. # Configure target
  118. ctest_configure(BUILD "${CTEST_BINARY_DIRECTORY}")
  119. ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}")
  120. ctest_submit(PARTS Configure)
  121. # Build target
  122. set(CTEST_BUILD_TARGET "${subproject}")
  123. ctest_build(BUILD "${ctk_build_dir}" APPEND)
  124. # Loop over kit suffixes and try to build the corresponding target
  125. foreach(kit_suffixe ${kit_suffixes})
  126. message("Build ${subproject}${kit_suffixe}")
  127. set(CTEST_BUILD_TARGET "${subproject}${kit_suffixe}")
  128. ctest_build(BUILD "${ctk_build_dir}" APPEND)
  129. endforeach()
  130. ctest_submit(PARTS Build)
  131. endforeach()
  132. # HACK Unfortunately ctest_coverage ignores the build argument, try to force it...
  133. file(READ ${ctk_build_dir}/CMakeFiles/TargetDirectories.txt ctk_build_coverage_dirs)
  134. file(APPEND "${CTEST_BINARY_DIRECTORY}/CMakeFiles/TargetDirectories.txt" "${ctk_build_coverage_dirs}")
  135. foreach(subproject ${CTEST_PROJECT_SUBPROJECTS})
  136. set_property(GLOBAL PROPERTY SubProject ${subproject})
  137. set_property(GLOBAL PROPERTY Label ${subproject})
  138. message("Test ${subproject}")
  139. ctest_test(
  140. BUILD "${ctk_build_dir}"
  141. INCLUDE_LABEL "${subproject}"
  142. PARALLEL_LEVEL 8
  143. EXCLUDE ${test_to_exclude_regex})
  144. # runs only tests that have a LABELS property matching "${subproject}"
  145. ctest_submit(PARTS Test)
  146. # Coverage per sub-project (library, application or plugin)
  147. if (WITH_COVERAGE AND CTEST_COVERAGE_COMMAND)
  148. message("Coverage ${subproject}")
  149. ctest_coverage(BUILD "${ctk_build_dir}" LABELS "${subproject}")
  150. ctest_submit(PARTS Coverage)
  151. endif ()
  152. #if (WITH_MEMCHECK AND CTEST_MEMORYCHECK_COMMAND)
  153. # ctest_memcheck(BUILD "${ctk_build_dir}" INCLUDE_LABEL "${subproject}")
  154. # ctest_submit(PARTS MemCheck)
  155. #endif ()
  156. endforeach()
  157. set_property(GLOBAL PROPERTY SubProject SuperBuild)
  158. set_property(GLOBAL PROPERTY Label SuperBuild)
  159. # Global coverage ...
  160. if (WITH_COVERAGE AND CTEST_COVERAGE_COMMAND)
  161. message("Global coverage")
  162. ctest_coverage(BUILD "${ctk_build_dir}")
  163. ctest_submit(PARTS Coverage)
  164. endif ()
  165. # Global dynamic analysis ...
  166. if (WITH_MEMCHECK AND CTEST_MEMORYCHECK_COMMAND)
  167. message("Global memcheck")
  168. ctest_memcheck(BUILD "${ctk_build_dir}")
  169. ctest_submit(PARTS MemCheck)
  170. endif ()
  171. # Note should be at the end
  172. ctest_submit(PARTS Notes)
  173. endif()
  174. endmacro()
  175. if(SCRIPT_MODE STREQUAL "continuous")
  176. while(${CTEST_ELAPSED_TIME} LESS 68400)
  177. set(START_TIME ${CTEST_ELAPSED_TIME})
  178. run_ctest()
  179. # Loop no faster than once every 5 minutes
  180. message("Wait for 5 minutes ...")
  181. ctest_sleep(${START_TIME} 300 ${CTEST_ELAPSED_TIME})
  182. endwhile()
  183. else()
  184. run_ctest()
  185. endif()