Browse Source

Merge topic 'add-cse-contract-test'

f6f3ae5 Update tag in the Contracts/cse-snapshot test.
1e4fd5f Enable overriding contract test timeout values.
c81ad34 Add a contract test for building the CSE.
942ace8 Fix contract test so it is not hard coded to the vtk542 test.
fd343a1 Add a "Contract" test for VTK.  The test downloads and builds VTK.
David Cole 15 years ago
parent
commit
385b681138

+ 32 - 2
Tests/CMakeLists.txt

@@ -11,7 +11,7 @@ MACRO(ADD_TEST_MACRO NAME COMMAND)
     --build-generator ${CMAKE_TEST_GENERATOR}
     --build-makeprogram ${CMAKE_TEST_MAKEPROGRAM}
     --build-project ${proj}
-    --test-command ${COMMAND})
+    --test-command ${COMMAND} ${ARGN})
   LIST(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/${dir}")
 ENDMACRO(ADD_TEST_MACRO)
 
@@ -21,7 +21,11 @@ IF(DEFINED ENV{HOME} AND NOT CTEST_NO_TEST_HOME)
   FILE(MAKE_DIRECTORY "${TEST_HOME}")
   FILE(WRITE "${TEST_HOME}/.cvspass" ":pserver:[email protected]:/cvsroot/KWSys A\n")
   SET(TEST_HOME_ENV_CODE "# Fake a user home directory to avoid polluting the real one.
-SET(ENV{HOME} \"${TEST_HOME}\")")
+# But provide original ENV{HOME} value in ENV{CTEST_REAL_HOME} for tests that
+# need access to the real HOME directory.
+SET(ENV{CTEST_REAL_HOME} \"\$ENV{HOME}\")
+SET(ENV{HOME} \"${TEST_HOME}\")
+")
 ENDIF()
 
 # Choose a default configuration for CTest tests.
@@ -1768,6 +1772,32 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/
     -D source_dir:STRING=${CMAKE_CURRENT_SOURCE_DIR}/Tutorial/Step3
     -D CMAKE_CTEST_COMMAND:STRING=${CMAKE_CTEST_COMMAND}
     -P ${CMAKE_CURRENT_SOURCE_DIR}/CMakeWizardTest.cmake)
+  # If the cache variable CMAKE_CONTRACT_PROJECTS is set
+  # then the dashboard will run a contract with CMake test of that
+  # name.  For example CMAKE_CONTRACT_PROJECTS = vtk542 would run
+  # the vtk542 contract test.
+  # For each Contract test, the project should provide a directory
+  # with at least one CMakeLists.txt file that uses ExternalProject
+  # to download and configure the project. The directory should also
+  # contain a RunTest.cmake file that has a single set of the format:
+  # SET(project_RUN_TEST testToRun)
+  # The testToRun should be a test executable that can be run to
+  # smoke test the build.
+  FOREACH(project ${CMAKE_CONTRACT_PROJECTS})
+    INCLUDE(Contracts/${project}/RunTest.cmake)
+    ADD_TEST_MACRO(Contracts.${project}
+      ${${project}_RUN_TEST})
+    # Contract test timeout in seconds.
+    # Default to 6 hours.
+    IF(DEFINED ${project}_TEST_TIMEOUT)
+      SET(timeout ${${project}_TEST_TIMEOUT})
+    ELSEIF(CMAKE_CONTRACT_TEST_TIMEOUT_DEFAULT)
+      SET(timeout ${CMAKE_CONTRACT_TEST_TIMEOUT_DEFAULT})
+    ELSE()
+      SET(timeout 21600)
+    ENDIF()
+    SET_TESTS_PROPERTIES(Contracts.${project} PROPERTIES TIMEOUT ${timeout})
+  ENDFOREACH()
 ENDIF(BUILD_TESTING)
 
 SUBDIRS(CMakeTests)

+ 114 - 0
Tests/Contracts/cse-snapshot/CMakeLists.txt

@@ -0,0 +1,114 @@
+cmake_minimum_required(VERSION 2.8)
+project(cse-snapshot)
+
+include(ExternalProject)
+
+include("${CMAKE_CURRENT_SOURCE_DIR}/LocalOverrides.cmake" OPTIONAL)
+include("${CMAKE_CURRENT_BINARY_DIR}/LocalOverrides.cmake" OPTIONAL)
+
+if(NOT DEFINED HOME)
+  if(DEFINED ENV{CTEST_REAL_HOME})
+    set(HOME "$ENV{CTEST_REAL_HOME}")
+  else()
+    set(HOME "$ENV{HOME}")
+  endif()
+endif()
+message(STATUS "HOME='${HOME}'")
+
+if(NOT DEFINED repo)
+  set(repo "git://public.kitware.com/cse.git")
+endif()
+message(STATUS "repo='${repo}'")
+
+if(NOT DEFINED tag)
+  set(tag "cc1dcb95439a21ab1d58f444d93481598414196e")
+endif()
+message(STATUS "tag='${tag}'")
+
+string(SUBSTRING "${tag}" 0 8 shorttag)
+
+set(base_dir "${HOME}/.cmake/Contracts/${PROJECT_NAME}/${shorttag}")
+set(binary_dir "${base_dir}/build")
+set(script_dir "${base_dir}")
+set(source_dir "${base_dir}/src")
+
+if(NOT DEFINED BUILDNAME)
+  set(BUILDNAME "CMakeContract-${shorttag}")
+endif()
+message(STATUS "BUILDNAME='${BUILDNAME}'")
+
+if(NOT DEFINED SITE)
+  site_name(SITE)
+endif()
+message(STATUS "SITE='${SITE}'")
+
+if(NOT DEFINED PROCESSOR_COUNT)
+  # Unknown:
+  set(PROCESSOR_COUNT 0)
+
+  # Linux:
+  set(cpuinfo_file "/proc/cpuinfo")
+  if(EXISTS "${cpuinfo_file}")
+    file(STRINGS "${cpuinfo_file}" procs REGEX "^processor.: [0-9]+$")
+    list(LENGTH procs PROCESSOR_COUNT)
+  endif()
+
+  # Mac:
+  if(APPLE)
+    find_program(cmd_sysctl "sysctl")
+    if(cmd_sysctl)
+      execute_process(COMMAND ${cmd_sysctl} -n hw.ncpu
+        OUTPUT_VARIABLE PROCESSOR_COUNT
+        OUTPUT_STRIP_TRAILING_WHITESPACE)
+    endif()
+  endif()
+
+  # Windows:
+  if(WIN32)
+    set(PROCESSOR_COUNT "$ENV{NUMBER_OF_PROCESSORS}")
+  endif()
+endif()
+message(STATUS "PROCESSOR_COUNT='${PROCESSOR_COUNT}'")
+
+find_package(Git)
+if(NOT GIT_EXECUTABLE)
+  message(FATAL_ERROR "error: could not find git")
+  # adjust PATH to find git, or set GIT_EXECUTABLE in LocalOverrides.cmake
+endif()
+message(STATUS "GIT_EXECUTABLE='${GIT_EXECUTABLE}'")
+
+configure_file(
+  "${CMAKE_CURRENT_SOURCE_DIR}/Dashboard.cmake.in"
+  "${script_dir}/Dashboard.cmake"
+  @ONLY)
+
+# Source dir for this project exists outside the CMake build tree because it
+# is absolutely huge.
+#
+if(EXISTS "${source_dir}/.git")
+  # If it exists already, download is a complete no-op:
+  ExternalProject_Add(download-${PROJECT_NAME}
+    DOWNLOAD_COMMAND ""
+    CONFIGURE_COMMAND ""
+    BUILD_COMMAND ""
+    INSTALL_COMMAND ""
+  )
+else()
+  # If it does not yet exist, download clones the git repository:
+  ExternalProject_Add(download-${PROJECT_NAME}
+    SOURCE_DIR "${source_dir}"
+    GIT_REPOSITORY "${repo}"
+    GIT_TAG "${tag}"
+    CONFIGURE_COMMAND ""
+    BUILD_COMMAND ""
+    INSTALL_COMMAND ""
+  )
+endif()
+
+ExternalProject_Add(build-${PROJECT_NAME}
+  DOWNLOAD_COMMAND ""
+  CONFIGURE_COMMAND ""
+  BUILD_COMMAND ${CMAKE_CTEST_COMMAND} -S "${script_dir}/Dashboard.cmake"
+  INSTALL_COMMAND ""
+  DEPENDS download-${PROJECT_NAME}
+  )

+ 76 - 0
Tests/Contracts/cse-snapshot/Dashboard.cmake.in

@@ -0,0 +1,76 @@
+# This "ctest -S" script may be configured to drive a nightly dashboard on any
+# Linux machine.
+#
+set(CTEST_BINARY_DIRECTORY "@binary_dir@")
+set(CTEST_BUILD_NAME "@BUILDNAME@")
+set(CTEST_SITE "@SITE@")
+set(CTEST_SOURCE_DIRECTORY "@source_dir@")
+set(PROCESSOR_COUNT "@PROCESSOR_COUNT@")
+
+# Assume a Linux build, with a make that supports -j. Modify this script if
+# assumption is ever invalid.
+#
+if(PROCESSOR_COUNT)
+  set(CTEST_BUILD_FLAGS "-j${PROCESSOR_COUNT}")
+endif()
+
+set(CTEST_CMAKE_GENERATOR "Unix Makefiles")
+set(CTEST_NOTES_FILES "${CTEST_SCRIPT_DIRECTORY}/${CTEST_SCRIPT_NAME}")
+
+message("Cleaning binary dir '${CTEST_BINARY_DIRECTORY}'")
+ctest_empty_binary_directory("${CTEST_BINARY_DIRECTORY}")
+
+# Intentionally no ctest_update step in this script. This script is run as a
+# "Contract" test on a CMake dashboard submission using the just-built ctest
+# as the driver. The download step in the Contract CMakeLists file takes care
+# of setting up the source tree before calling this ctest -S script. The idea
+# is that the source tree will be the same every day, so there should not be
+# an "update" step for this build.
+
+message("Configuring CSE in binary dir '${CTEST_BINARY_DIRECTORY}'")
+set_property(GLOBAL PROPERTY SubProject "CSE-toplevel")
+set_property(GLOBAL PROPERTY Label "CSE-toplevel")
+
+ctest_start("Experimental")
+
+set(CSE_TOPLEVEL_OPTIONS
+  -DEXTERNAL_PROJECT_DASHBOARD_BUILD:BOOL=ON
+  -DEXTERNAL_PROJECT_TESTS:BOOL=ON
+  -DCSE_INSTALL_PREFIX:PATH=${CTEST_BINARY_DIRECTORY}/built
+  -DCSE_SUBSET:STRING=ALL
+  -DCTEST_SITE:STRING=${CTEST_SITE}
+)
+
+ctest_configure(OPTIONS "${CSE_TOPLEVEL_OPTIONS}")
+
+# The configure step produces a file listing the CSE packages and dependencies.
+# This file also generates Project.xml and stores it in ${PROJECT_XML}.
+#
+set(subprojects "")
+if(EXISTS "${CTEST_BINARY_DIRECTORY}/CSEBuildtimeDepends.cmake")
+  message("Including CSEBuildtimeDepends.cmake")
+  include("${CTEST_BINARY_DIRECTORY}/CSEBuildtimeDepends.cmake")
+  set(subprojects ${CSE_ALL_SORTED})
+  message("Submitting Project.xml")
+  ctest_submit(FILES ${PROJECT_XML})
+endif()
+
+message("Submitting CSE configure results")
+ctest_submit()
+
+if(subprojects)
+  message("Building by looping over subprojects...")
+  foreach(subproject ${subprojects})
+    message("##########  ${subproject}  ##########")
+    set_property(GLOBAL PROPERTY SubProject "${subproject}")
+    set_property(GLOBAL PROPERTY Label "${subproject}")
+    ctest_build(TARGET "${subproject}" APPEND)
+    message("Submitting ${subproject} build results")
+    ctest_submit(PARTS build)
+  endforeach()
+else()
+  message("Building all...")
+  ctest_build(APPEND)
+  message("Submitting build results")
+  ctest_submit(PARTS build)
+endif()

+ 3 - 0
Tests/Contracts/cse-snapshot/RunTest.cmake

@@ -0,0 +1,3 @@
+set(exe "$ENV{HOME}/.cmake/Contracts/cse-snapshot/510345e4/build/built/Release/git-1.6.5.2/bin/git")
+set(args help clone)
+set(cse-snapshot_RUN_TEST ${exe} ${args})

+ 30 - 0
Tests/Contracts/vtk542/CMakeLists.txt

@@ -0,0 +1,30 @@
+# The VTK external project for CMake
+# ---------------------------------------------------------------------------
+cmake_minimum_required(VERSION 2.8)
+project(vtk542)
+include(ExternalProject)
+
+
+set(vtk_source "${CMAKE_CURRENT_BINARY_DIR}/VTK-source")
+set(vtk_binary "${CMAKE_CURRENT_BINARY_DIR}/VTK-build")
+
+ExternalProject_Add(VTK
+  DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}
+  URL "http://www.vtk.org/files/release/5.4/vtk-5.4.2.tar.gz"
+  URL_MD5 c2c797091d4b2128d9a1bd32c4b78227
+  SOURCE_DIR ${vtk_source}
+  BINARY_DIR ${vtk_binary}
+  CMAKE_GENERATOR  "${CMAKE_GENERATOR}"
+  CMAKE_ARGS
+  -DBUILD_EXAMPLES:BOOL=ON
+  -DBUILD_TESTING:BOOL=ON
+  INSTALL_COMMAND ""
+  )
+# make it so that each build will run make in the VTK build tree
+ExternalProject_Add_Step(VTK forcebuild
+  COMMAND ${CMAKE_COMMAND}
+  -E remove ${CMAKE_CURRENT_BUILD_DIR}/VTK-prefix/src/VTK-stamp/VTK-build
+  DEPENDEES configure
+  DEPENDERS build
+  ALWAYS 1
+  )

+ 1 - 0
Tests/Contracts/vtk542/RunTest.cmake

@@ -0,0 +1 @@
+SET(vtk542_RUN_TEST VTK-build/bin/CommonCxxTests otherArrays)