# Check the CMake source tree and report anything suspicious... # message("=============================================================================") message("CTEST_FULL_OUTPUT (Avoid ctest truncation of output)") message("") message("CMake_BINARY_DIR='${CMake_BINARY_DIR}'") message("CMake_SOURCE_DIR='${CMake_SOURCE_DIR}'") message("CVS_EXECUTABLE='${CVS_EXECUTABLE}'") message("ENV{DASHBOARD_TEST_FROM_CTEST}='$ENV{DASHBOARD_TEST_FROM_CTEST}'") message("") # Is the build directory the same as or underneath the source directory? # (i.e. - is it an "in source" build?) # set(in_source_build 0) if(CMake_SOURCE_DIR STREQUAL "${CMake_BINARY_DIR}") message("build dir *is* source dir") set(in_source_build 1) else() string(LENGTH "${CMake_SOURCE_DIR}" src_len) string(LENGTH "${CMake_BINARY_DIR}" bin_len) if(bin_len GREATER src_len) math(EXPR substr_len "${src_len}+1") string(SUBSTRING "${CMake_BINARY_DIR}" 0 ${substr_len} bin_dir) if(bin_dir STREQUAL "${CMake_SOURCE_DIR}/") message("build dir is under source dir") set(in_source_build 1) endif() endif() endif() message("src_len='${src_len}'") message("bin_len='${bin_len}'") message("substr_len='${substr_len}'") message("bin_dir='${bin_dir}'") message("in_source_build='${in_source_build}'") message("") # Check with "cvs -q -n up -dP" if there are any local modifications to the # CMake source tree: # message("=============================================================================") message("Copy/paste this command to reproduce:") message("cd \"${CMake_SOURCE_DIR}\" && \"${CVS_EXECUTABLE}\" -q -n up -dP") message("") execute_process(COMMAND ${CVS_EXECUTABLE} -q -n up -dP WORKING_DIRECTORY ${CMake_SOURCE_DIR} OUTPUT_VARIABLE ov ERROR_VARIABLE ev RESULT_VARIABLE rv) message("Results of running '${CVS_EXECUTABLE} -q -n up -dP'") message("rv='${rv}'") message("ov='${ov}'") message("ev='${ev}'") message("") # Analyze cvs output: # set(additions 0) set(conflicts 0) set(modifications 0) set(nonadditions 0) if(NOT ov STREQUAL "") string(REPLACE ";" "\\\\;" lines "${ov}") string(REPLACE "\n" "E;" lines "${lines}") foreach(line ${lines}) message("'${line}'") # But do not consider files that exist just because some user poked around # the file system with Windows Explorer or with the Finder from a Mac... # ('Thumbs.db' and '.DS_Store' files...) # set(consider 1) set(ignore_files_regex "^(. |.*(/|\\\\))(\\.DS_Store|Thumbs.db)E$") if(line MATCHES "${ignore_files_regex}") message(" line matches '${ignore_files_regex}' -- not considered") set(consider 0) endif() if(consider) if(line MATCHES "^A ") message(" locally added file/directory detected...") set(additions 1) endif() if(line MATCHES "^C ") message(" conflict detected...") set(conflicts 1) endif() if(line MATCHES "^M ") message(" locally modified file detected...") set(modifications 1) endif() if(line MATCHES "^\\? ") message(" locally non-added file/directory detected...") set(nonadditions 1) endif() endif() endforeach() endif() message("=============================================================================") message("additions='${additions}'") message("conflicts='${conflicts}'") message("modifications='${modifications}'") message("nonadditions='${nonadditions}'") message("") # Decide if the test passes or fails: # message("=============================================================================") if("$ENV{DASHBOARD_TEST_FROM_CTEST}" STREQUAL "") # developers are allowed to have local additions and modifications... set(is_dashboard 0) message("interactive test run") message("") else() set(is_dashboard 1) message("dashboard test run") message("") # but dashboard machines are not allowed to have local additions or modifications... if(additions) message(FATAL_ERROR "test fails: local source tree additions") endif() if(modifications) message(FATAL_ERROR "test fails: local source tree modifications") endif() # # It's a dashboard run if ctest was run with '-D ExperimentalTest' or some # other -D arg on its command line or if ctest is running a -S script to run # a dashboard... Running ctest like that sets the DASHBOARD_TEST_FROM_CTEST # env var. # endif() # ...and nobody is allowed to have local non-additions or conflicts... # Not even developers. # if(nonadditions) if(in_source_build AND is_dashboard) message(" warning: test results confounded because this is an 'in-source' build - cannot distinguish between non-added files that are in-source build products and non-added source files that somebody forgot to 'cvs add'... - this is only ok if this is intentionally an in-source dashboard build... Developers should use out-of-source builds to verify a clean source tree with this test... Allowing test to pass despite the warning message... ") else() message(FATAL_ERROR "test fails: local source tree non-additions: use cvs add before committing, or remove the files from the source tree") endif() endif() if(conflicts) message(FATAL_ERROR "test fails: local source tree conflicts: resolve before committing") endif() # Still here? Good then... # message("test passes") message("")