# 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("GIT_EXECUTABLE='${GIT_EXECUTABLE}'") message("HOME='${HOME}'") message("ENV{DASHBOARD_TEST_FROM_CTEST}='$ENV{DASHBOARD_TEST_FROM_CTEST}'") message("") string(REPLACE "\\" "\\\\" HOME "${HOME}") # 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) set(build_under_source 0) string(FIND "${CMake_BINARY_DIR}" "${CMake_SOURCE_DIR}/" pos) if(pos EQUAL 0) message("build dir is *inside* source dir") set(build_under_source 1) elseif(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("build_under_source='${build_under_source}'") message("") if(build_under_source) message(STATUS "Skipping rest of test because build tree is under source tree") return() endif() # If this does not appear to be a git checkout, just pass the test here # and now. (Do not let the test fail if it is run in a tree *exported* from a # repository or unpacked from a .zip file source installer...) # set(is_git_checkout 0) if(EXISTS "${CMake_SOURCE_DIR}/.git") set(is_git_checkout 1) endif() message("is_git_checkout='${is_git_checkout}'") message("") if(NOT is_git_checkout) message("source tree is not a git checkout... test passes by early return...") return() endif() # This test looks for the following types of changes in the source tree: # set(additions 0) set(conflicts 0) set(modifications 0) set(nonadditions 0) # ov == output variable... conditionally filled in by either git below: # set(cmd "") set(ov "") set(ev "") set(rv "") # If no GIT_EXECUTABLE, see if we can figure out which git was used # for the ctest_update step on this dashboard... # if(is_git_checkout AND NOT GIT_EXECUTABLE) set(ctest_ini_file "") set(exe "") # Use the old name: if(EXISTS "${CMake_BINARY_DIR}/DartConfiguration.tcl") set(ctest_ini_file "${CMake_BINARY_DIR}/DartConfiguration.tcl") endif() # But if it exists, prefer the new name: if(EXISTS "${CMake_BINARY_DIR}/CTestConfiguration.ini") set(ctest_ini_file "${CMake_BINARY_DIR}/CTestConfiguration.ini") endif() # If there is a ctest ini file, read the update command or git command # from it: # if(ctest_ini_file) file(STRINGS "${ctest_ini_file}" line REGEX "^GITCommand: (.*)$") string(REGEX REPLACE "^GITCommand: (.*)$" "\\1" line "${line}") if("${line}" MATCHES "^\"") string(REGEX REPLACE "^\"([^\"]+)\" *.*$" "\\1" line "${line}") else() string(REGEX REPLACE "^([^ ]+) *.*$" "\\1" line "${line}") endif() set(exe "${line}") if("${exe}" STREQUAL "GITCOMMAND-NOTFOUND") set(exe "") endif() if(exe) message("info: GIT_EXECUTABLE set by 'GITCommand:' from '${ctest_ini_file}'") endif() if(NOT exe) file(STRINGS "${ctest_ini_file}" line REGEX "^UpdateCommand: (.*)$") string(REGEX REPLACE "^UpdateCommand: (.*)$" "\\1" line "${line}") if("${line}" MATCHES "^\"") string(REGEX REPLACE "^\"([^\"]+)\" *.*$" "\\1" line "${line}") else() string(REGEX REPLACE "^([^ ]+) *.*$" "\\1" line "${line}") endif() set(exe "${line}") if("${exe}" STREQUAL "GITCOMMAND-NOTFOUND") set(exe "") endif() if(exe) message("info: GIT_EXECUTABLE set by 'UpdateCommand:' from '${ctest_ini_file}'") endif() endif() else() message("info: no DartConfiguration.tcl or CTestConfiguration.ini file...") endif() # If we have still not grokked the exe, look in the Update.xml file to see # if we can parse it from there... # if(NOT exe) file(GLOB_RECURSE update_xml_file "${CMake_BINARY_DIR}/Testing/Update.xml") if(update_xml_file) file(STRINGS "${update_xml_file}" line REGEX "^.*(.*)$" LIMIT_COUNT 1) string(REPLACE ""\;" "\"" line "${line}") string(REGEX REPLACE "^.*(.*)$" "\\1" line "${line}") if("${line}" MATCHES "^\"") string(REGEX REPLACE "^\"([^\"]+)\" *.*$" "\\1" line "${line}") else() string(REGEX REPLACE "^([^ ]+) *.*$" "\\1" line "${line}") endif() if(line) set(exe "${line}") endif() if(exe) message("info: GIT_EXECUTABLE set by '' from '${update_xml_file}'") endif() else() message("info: no Update.xml file...") endif() endif() if(exe) set(GIT_EXECUTABLE "${exe}") message("GIT_EXECUTABLE='${GIT_EXECUTABLE}'") message("") if(NOT EXISTS "${GIT_EXECUTABLE}") message(FATAL_ERROR "GIT_EXECUTABLE does not exist...") endif() else() message(FATAL_ERROR "could not determine GIT_EXECUTABLE...") endif() endif() if(is_git_checkout AND GIT_EXECUTABLE) # Check with "git status" if there are any local modifications to the # CMake source tree: # message("=============================================================================") message("This is a git checkout, using git to verify source tree....") message("") execute_process(COMMAND ${GIT_EXECUTABLE} --version WORKING_DIRECTORY ${CMake_SOURCE_DIR} OUTPUT_VARIABLE version_output OUTPUT_STRIP_TRAILING_WHITESPACE) message("=== output of 'git --version' ===") message("${version_output}") message("=== end output ===") message("") execute_process(COMMAND ${GIT_EXECUTABLE} branch -a WORKING_DIRECTORY ${CMake_SOURCE_DIR} OUTPUT_VARIABLE git_branch_output OUTPUT_STRIP_TRAILING_WHITESPACE) message("=== output of 'git branch -a' ===") message("${git_branch_output}") message("=== end output ===") message("") execute_process(COMMAND ${GIT_EXECUTABLE} log -1 WORKING_DIRECTORY ${CMake_SOURCE_DIR} OUTPUT_VARIABLE git_log_output OUTPUT_STRIP_TRAILING_WHITESPACE) message("=== output of 'git log -1' ===") message("${git_log_output}") message("=== end output ===") message("") message("Copy/paste this command to reproduce:") message("cd \"${CMake_SOURCE_DIR}\" && \"${GIT_EXECUTABLE}\" status") message("") set(cmd ${GIT_EXECUTABLE} status) endif() if(cmd) # Use the HOME value passed in to the script for calling git so it can # find its user/global config settings... # set(original_ENV_HOME "$ENV{HOME}") set(ENV{HOME} "${HOME}") execute_process(COMMAND ${cmd} WORKING_DIRECTORY ${CMake_SOURCE_DIR} OUTPUT_VARIABLE ov ERROR_VARIABLE ev RESULT_VARIABLE rv) set(ENV{HOME} "${original_ENV_HOME}") message("Results of running ${cmd}") message("rv='${rv}'") message("ov='${ov}'") message("ev='${ev}'") message("") if(NOT rv STREQUAL 0) if(is_git_checkout AND (rv STREQUAL "1")) # Many builds of git return "1" from a "nothing is changed" git status call... # Do not fail with an error for rv==1 with git... else() message(FATAL_ERROR "error: ${cmd} attempt failed... (see output above)") endif() endif() else() message(FATAL_ERROR "error: no COMMAND to run to analyze source tree...") endif() # Analyze output: # 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(is_git_checkout) if(line MATCHES "^#?[ \t]*modified:") message(" locally modified file detected...") set(modifications 1) endif() if(line MATCHES "^(# )?Untracked") message(" locally non-added file/directory detected...") set(nonadditions 1) endif() 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 'git 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 git 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("")