[Cmake-commits] CMake branch, master, updated. v3.12.2-779-g1765367

Kitware Robot kwrobot at kitware.com
Mon Oct 1 09:25:06 EDT 2018


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".

The branch, master has been updated
       via  17653671e4007004d4d7779b4702c9a85b7d5a65 (commit)
       via  5cf36d3b0f721f57d80750b4c05cc69d7d1fdc32 (commit)
       via  3bb8dda0479388277293d2d1949c1c294826d296 (commit)
       via  80e2f8ee0c4f94e679a2e4cfa9123cc28bce2e4f (commit)
       via  c7f1ed03d764a6165350236969376498feb2b2ff (commit)
       via  4220962d18f77399286270607eb135378b71c5b9 (commit)
       via  182d9597ec7b28727dc8e878a90a9bedf6d33f51 (commit)
       via  9c2b393cb7750cf182e765f679f9876851aa5055 (commit)
       via  c49d13f94b171bd29b9b403df0e5f19723c4e251 (commit)
       via  b3d5b8b3fb7b009f2d3d24811934c08fd7ccec69 (commit)
       via  62fbe5002aa23c7591e325e622e62a2d1ed789be (commit)
       via  02c5091c905964b529020070b4b24616d8a3fbd8 (commit)
       via  6a285bb737b904f33de287eede1eaec9928e3e3d (commit)
      from  3053cd7617cc6c02dda11367d71378f6278125a7 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=17653671e4007004d4d7779b4702c9a85b7d5a65
commit 17653671e4007004d4d7779b4702c9a85b7d5a65
Merge: 5cf36d3 c49d13f
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Mon Oct 1 13:24:21 2018 +0000
Commit:     Kitware Robot <kwrobot at kitware.com>
CommitDate: Mon Oct 1 09:24:29 2018 -0400

    Merge topic 'no_buildid_for_files'
    
    c49d13f94b ctest: only create buildid when submitting from Testing/ dir
    
    Acked-by: Kitware Robot <kwrobot at kitware.com>
    Merge-request: !2423


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=5cf36d3b0f721f57d80750b4c05cc69d7d1fdc32
commit 5cf36d3b0f721f57d80750b4c05cc69d7d1fdc32
Merge: 3bb8dda 80e2f8e
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Mon Oct 1 13:21:40 2018 +0000
Commit:     Kitware Robot <kwrobot at kitware.com>
CommitDate: Mon Oct 1 09:22:03 2018 -0400

    Merge topic 'byproducts_make_clean'
    
    80e2f8ee0c Ninja,Makefile: Add tests for handling of byproducts by clean operations
    c7f1ed03d7 Help: Add release note for make clean and byproducts
    4220962d18 Makefile: Add build events byproducts to clean rules
    182d9597ec Makefile: Add custom command byproducts to clean rules
    9c2b393cb7 Tests: Update CustomCommandWorkingDirectory to handle in-source byproducts
    
    Acked-by: Kitware Robot <kwrobot at kitware.com>
    Merge-request: !2334


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=3bb8dda0479388277293d2d1949c1c294826d296
commit 3bb8dda0479388277293d2d1949c1c294826d296
Merge: 3053cd7 b3d5b8b
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Mon Oct 1 13:20:34 2018 +0000
Commit:     Kitware Robot <kwrobot at kitware.com>
CommitDate: Mon Oct 1 09:20:44 2018 -0400

    Merge topic 'add_progress_summary_console_logging_mode'
    
    b3d5b8b3fb ctest: Add option for live progress summary in terminal
    62fbe5002a cmCTestRunTest: Thread number of completed tests through start APIs
    02c5091c90 cmCTestRunTest: Simplify number width computation
    6a285bb737 cmCTestRunTest: Buffer test result output before printing
    
    Acked-by: Kitware Robot <kwrobot at kitware.com>
    Merge-request: !2240


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=80e2f8ee0c4f94e679a2e4cfa9123cc28bce2e4f
commit 80e2f8ee0c4f94e679a2e4cfa9123cc28bce2e4f
Author:     Pedro Navarro <pnavarro at netflix.com>
AuthorDate: Thu Sep 6 12:16:52 2018 -0700
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri Sep 28 11:30:32 2018 -0400

    Ninja,Makefile: Add tests for handling of byproducts by clean operations

diff --git a/Tests/RunCMake/Byproducts/CMakeLists.txt b/Tests/RunCMake/Byproducts/CMakeLists.txt
new file mode 100644
index 0000000..bf2ef15
--- /dev/null
+++ b/Tests/RunCMake/Byproducts/CMakeLists.txt
@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 3.10)
+project(${RunCMake_TEST} NONE)
+include(${RunCMake_TEST}.cmake)
diff --git a/Tests/RunCMake/Byproducts/CleanByproducts.cmake b/Tests/RunCMake/Byproducts/CleanByproducts.cmake
new file mode 100644
index 0000000..85d9582
--- /dev/null
+++ b/Tests/RunCMake/Byproducts/CleanByproducts.cmake
@@ -0,0 +1,93 @@
+cmake_minimum_required(VERSION 3.10)
+project(CleanByproducts)
+
+# Configurable parameters
+set(TEST_CLEAN_NO_CUSTOM FALSE CACHE BOOL "Value for the CLEAN_NO_CUSTOM PROPERTY")
+set(TEST_BUILD_EVENTS TRUE CACHE BOOL "Create byproducts with build events")
+set(TEST_CUSTOM_TARGET TRUE CACHE BOOL "Create a byproduct with a custom target")
+set(TEST_CUSTOM_COMMAND TRUE CACHE BOOL "Create a byproduct with a custom command")
+
+set_property(DIRECTORY PROPERTY CLEAN_NO_CUSTOM ${TEST_CLEAN_NO_CUSTOM})
+
+macro(add_build_event)
+  set(oneValueArgs EVENT)
+
+  cmake_parse_Arguments(ABE "" "${oneValueArgs}" "" ${ARGN})
+
+  # Create two byproducts and only declare one
+  add_custom_command(TARGET foo
+    ${ABE_EVENT}
+    COMMAND ${CMAKE_COMMAND} -E touch foo.${ABE_EVENT}
+    COMMAND ${CMAKE_COMMAND} -E touch foo.${ABE_EVENT}.notdeclared
+    COMMENT "Creating byproducts with ${ABE_EVENT}"
+    BYPRODUCTS foo.${ABE_EVENT}
+  )
+
+  # The nondeclared byproduct should always be present
+  list(APPEND EXPECTED_PRESENT foo.${ABE_EVENT}.notdeclared)
+
+  # If CLEAN_NO_CUSTOM is set, the declared byproduct should be present
+  if(TEST_CLEAN_NO_CUSTOM)
+    list(APPEND EXPECTED_PRESENT foo.${ABE_EVENT})
+  else()
+    list(APPEND EXPECTED_DELETED foo.${ABE_EVENT})
+  endif()
+endmacro()
+
+add_executable(foo foo.cpp)
+
+# Test build events
+if(TEST_BUILD_EVENTS)
+  add_build_event(EVENT "PRE_BUILD" ENABLE ${TEST_PRE_BUILD})
+  add_build_event(EVENT "PRE_LINK" ENABLE ${TEST_PRE_LINK})
+  add_build_event(EVENT "POST_BUILD" ENABLE ${TEST_POST_BUILD})
+endif()
+
+# Custom command that generates byproducts
+if(TEST_CUSTOM_COMMAND)
+  file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/bar.cpp.in "void bar() {}\n")
+  add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/bar.cpp
+    COMMAND ${CMAKE_COMMAND} -E touch foo.customcommand
+    COMMAND ${CMAKE_COMMAND} -E touch foo.customcommand.notdeclared
+    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/bar.cpp.in ${CMAKE_CURRENT_BINARY_DIR}/bar.cpp
+    BYPRODUCTS foo.customcommand
+    COMMENT "Creating byproducts with a custom command"
+  )
+
+  # The nondeclared byproduct should always be present
+  list(APPEND EXPECTED_PRESENT "foo.customcommand.notdeclared")
+
+  # If CLEAN_NO_CUSTOM is set, both the output and byproduct should be present
+  if(TEST_CLEAN_NO_CUSTOM)
+    list(APPEND EXPECTED_PRESENT "bar.cpp")
+    list(APPEND EXPECTED_PRESENT "foo.customcommand")
+  else()
+    list(APPEND EXPECTED_DELETED "bar.cpp")
+    list(APPEND EXPECTED_DELETED "foo.customcommand")
+  endif()
+
+  target_sources(foo PUBLIC "${CMAKE_CURRENT_BINARY_DIR}/bar.cpp")
+endif()
+
+# Custom target that generates byproducts
+if(TEST_CUSTOM_TARGET)
+  add_custom_target(foo_file ALL
+    DEPENDS foo
+    COMMAND ${CMAKE_COMMAND} -E touch foo.customtarget
+    COMMAND ${CMAKE_COMMAND} -E touch foo.customtarget.notdeclared
+    BYPRODUCTS foo.customtarget
+    COMMENT "Creating byproducts with a custom target"
+  )
+
+  # The nondeclared byproduct should always be present
+  list(APPEND EXPECTED_PRESENT "foo.customtarget.notdeclared")
+
+  # If CLEAN_NO_CUSTOM is set, the declared byproduct should be present
+  if(TEST_CLEAN_NO_CUSTOM)
+    list(APPEND EXPECTED_PRESENT "foo.customtarget")
+  else()
+    list(APPEND EXPECTED_DELETED "foo.customtarget")
+  endif()
+endif()
+
+configure_file(files.cmake.in files.cmake)
diff --git a/Tests/RunCMake/Byproducts/RunCMakeTest.cmake b/Tests/RunCMake/Byproducts/RunCMakeTest.cmake
new file mode 100644
index 0000000..a7584ee
--- /dev/null
+++ b/Tests/RunCMake/Byproducts/RunCMakeTest.cmake
@@ -0,0 +1,58 @@
+include(RunCMake)
+
+function(run_CleanByproducts case)
+  set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/CleanByproducts-${case}-build)
+  set(RunCMake_TEST_OPTIONS "${ARGN}")
+
+  run_cmake(CleanByproducts)
+  set(RunCMake_TEST_NO_CLEAN 1)
+
+  run_cmake_command(CleanByProducts-build ${CMAKE_COMMAND} --build .)
+  include("${RunCMake_TEST_BINARY_DIR}/files.cmake")
+
+  message("Checking that all expected files are present")
+  check_files(EXPECTED_PRESENT "${RunCMake_TEST_BINARY_DIR}" TRUE)
+  check_files(EXPECTED_DELETED "${RunCMake_TEST_BINARY_DIR}" TRUE)
+
+  run_cmake_command(CleanByProducts-clean ${CMAKE_COMMAND} --build . --target clean)
+
+  message("Checking that only the expected files are present after cleaning")
+  check_files(EXPECTED_PRESENT "${RunCMake_TEST_BINARY_DIR}" TRUE)
+  check_files(EXPECTED_DELETED "${RunCMake_TEST_BINARY_DIR}" FALSE)
+endfunction()
+
+function(check_files list path has_to_exist)
+  foreach(file IN LISTS ${list})
+    message("Checking ${file}")
+    set(file_exists FALSE)
+    if(EXISTS "${path}/${file}")
+      set(file_exists TRUE)
+    endif()
+
+    if(file_exists AND NOT has_to_exist)
+      message(FATAL_ERROR "${file} should have been deleted")
+    elseif(NOT file_exists AND has_to_exist)
+      message(FATAL_ERROR "${file} does not exist")
+    elseif(file_exists AND has_to_exist)
+      message("${file} found as expected")
+    elseif(NOT file_exists AND NOT has_to_exist)
+      message("${file} deleted as expected")
+    endif()
+
+  endforeach()
+endfunction()
+
+
+# Iterate through all possible test values
+set(counter 0)
+foreach(test_clean_no_custom TRUE FALSE)
+  foreach(test_build_events TRUE FALSE)
+    foreach(test_custom_command TRUE FALSE)
+      foreach(test_custom_target TRUE FALSE)
+        math(EXPR counter "${counter} + 1")
+        message("Test ${counter} - CLEAN_NO_CUSTOM: ${test_clean_no_custom}, Build events: ${test_build_events}, Custom command: ${test_custom_command}, Custom target: ${test_custom_target}")
+        run_CleanByproducts("buildevents${counter}" -DCLEAN_NO_CUSTOM=${test_clean_no_custom} -DTEST_BUILD_EVENTS=${test_build_events} -DTEST_CUSTOM_COMMAND=${test_custom_command} -DTEST_CUSTOM_TARGET=${test_custom_target})
+      endforeach()
+    endforeach()
+  endforeach()
+endforeach()
diff --git a/Tests/RunCMake/Byproducts/files.cmake.in b/Tests/RunCMake/Byproducts/files.cmake.in
new file mode 100644
index 0000000..a7d4831
--- /dev/null
+++ b/Tests/RunCMake/Byproducts/files.cmake.in
@@ -0,0 +1,2 @@
+set(EXPECTED_PRESENT "@EXPECTED_PRESENT@")
+set(EXPECTED_DELETED "@EXPECTED_DELETED@")
diff --git a/Tests/RunCMake/Byproducts/foo.cpp b/Tests/RunCMake/Byproducts/foo.cpp
new file mode 100644
index 0000000..d47cb91
--- /dev/null
+++ b/Tests/RunCMake/Byproducts/foo.cpp
@@ -0,0 +1,14 @@
+int bar(int y)
+{
+  return y * 6;
+}
+
+int foo(int x)
+{
+  return x * bar(x);
+}
+
+int main()
+{
+  return foo(4);
+}
diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt
index 080d0d0..90681b9 100644
--- a/Tests/RunCMake/CMakeLists.txt
+++ b/Tests/RunCMake/CMakeLists.txt
@@ -144,6 +144,9 @@ endif()
 add_RunCMake_test(AndroidTestUtilities)
 add_RunCMake_test(BuildDepends)
 if(UNIX AND "${CMAKE_GENERATOR}" MATCHES "Unix Makefiles|Ninja")
+  add_RunCMake_test(Byproducts)
+endif()
+if(UNIX AND "${CMAKE_GENERATOR}" MATCHES "Unix Makefiles|Ninja")
   add_RunCMake_test(CompilerChange)
 endif()
 add_RunCMake_test(CompilerNotFound)

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=c7f1ed03d764a6165350236969376498feb2b2ff
commit c7f1ed03d764a6165350236969376498feb2b2ff
Author:     Pedro Navarro <pnavarro at netflix.com>
AuthorDate: Thu Sep 6 12:14:42 2018 -0700
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri Sep 28 11:30:32 2018 -0400

    Help: Add release note for make clean and byproducts

diff --git a/Help/release/dev/byproducts_make_clean.rst b/Help/release/dev/byproducts_make_clean.rst
new file mode 100644
index 0000000..54df77d
--- /dev/null
+++ b/Help/release/dev/byproducts_make_clean.rst
@@ -0,0 +1,5 @@
+byproducts_make_clean
+---------------------
+
+* The :ref:`Makefile Generators` learned to remove custom command and
+  custom target byproducts during ``make clean``.

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=4220962d18f77399286270607eb135378b71c5b9
commit 4220962d18f77399286270607eb135378b71c5b9
Author:     Pedro Navarro <pnavarro at netflix.com>
AuthorDate: Thu Aug 30 15:34:24 2018 -0700
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri Sep 28 11:30:32 2018 -0400

    Makefile: Add build events byproducts to clean rules

diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx
index 65a69d1..f423560 100644
--- a/Source/cmMakefileTargetGenerator.cxx
+++ b/Source/cmMakefileTargetGenerator.cxx
@@ -189,6 +189,30 @@ void cmMakefileTargetGenerator::WriteTargetBuildRules()
       }
     }
   }
+
+  // Add byproducts from build events to the clean rules
+  if (clean) {
+    std::vector<cmCustomCommand> buildEventCommands =
+      this->GeneratorTarget->GetPreBuildCommands();
+
+    buildEventCommands.insert(
+      buildEventCommands.end(),
+      this->GeneratorTarget->GetPreLinkCommands().begin(),
+      this->GeneratorTarget->GetPreLinkCommands().end());
+    buildEventCommands.insert(
+      buildEventCommands.end(),
+      this->GeneratorTarget->GetPostBuildCommands().begin(),
+      this->GeneratorTarget->GetPostBuildCommands().end());
+
+    for (const auto& be : buildEventCommands) {
+      const std::vector<std::string>& byproducts = be.GetByproducts();
+      for (std::string const& byproduct : byproducts) {
+        this->CleanFiles.push_back(
+          this->LocalGenerator->MaybeConvertToRelativePath(currentBinDir,
+                                                           byproduct));
+      }
+    }
+  }
   std::vector<cmSourceFile const*> headerSources;
   this->GeneratorTarget->GetHeaderSources(headerSources, config);
   this->OSXBundleGenerator->GenerateMacOSXContentStatements(

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=182d9597ec7b28727dc8e878a90a9bedf6d33f51
commit 182d9597ec7b28727dc8e878a90a9bedf6d33f51
Author:     Pedro Navarro <pnavarro at netflix.com>
AuthorDate: Thu Aug 30 15:31:32 2018 -0700
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri Sep 28 11:30:32 2018 -0400

    Makefile: Add custom command byproducts to clean rules

diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx
index c8dc392..65a69d1 100644
--- a/Source/cmMakefileTargetGenerator.cxx
+++ b/Source/cmMakefileTargetGenerator.cxx
@@ -181,6 +181,12 @@ void cmMakefileTargetGenerator::WriteTargetBuildRules()
           this->LocalGenerator->MaybeConvertToRelativePath(currentBinDir,
                                                            output));
       }
+      const std::vector<std::string>& byproducts = ccg.GetByproducts();
+      for (std::string const& byproduct : byproducts) {
+        this->CleanFiles.push_back(
+          this->LocalGenerator->MaybeConvertToRelativePath(currentBinDir,
+                                                           byproduct));
+      }
     }
   }
   std::vector<cmSourceFile const*> headerSources;

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=9c2b393cb7750cf182e765f679f9876851aa5055
commit 9c2b393cb7750cf182e765f679f9876851aa5055
Author:     Pedro Navarro <pnavarro at netflix.com>
AuthorDate: Thu Sep 27 16:57:51 2018 -0700
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri Sep 28 11:28:36 2018 -0400

    Tests: Update CustomCommandWorkingDirectory to handle in-source byproducts
    
    When running an in-source build the CustomCommandWorkingDirectory test
    created a copy of a source file in the same directory it was running on.
    This breaks when byproducts are cleaned (e.g. via Ninja) because it
    deletes one of the source files.

diff --git a/Tests/CustomCommandWorkingDirectory/CMakeLists.txt b/Tests/CustomCommandWorkingDirectory/CMakeLists.txt
index 5495a9b..2e12a78 100644
--- a/Tests/CustomCommandWorkingDirectory/CMakeLists.txt
+++ b/Tests/CustomCommandWorkingDirectory/CMakeLists.txt
@@ -9,17 +9,17 @@ add_custom_command(
 )
 
 set_source_files_properties(
-  "${TestWorkingDir_BINARY_DIR}/customTarget.c"
+  "${TestWorkingDir_BINARY_DIR}/customTarget1.c"
   "${TestWorkingDir_BINARY_DIR}/customTarget2.c"
   PROPERTIES GENERATED 1)
 
 add_executable(working "${TestWorkingDir_BINARY_DIR}/working.c"
-  "${TestWorkingDir_BINARY_DIR}/customTarget.c")
+  "${TestWorkingDir_BINARY_DIR}/customTarget1.c")
 
 add_custom_target(
   Custom ALL
-  COMMAND "${CMAKE_COMMAND}" -E copy_if_different ./customTarget.c "${TestWorkingDir_BINARY_DIR}/customTarget.c"
-  BYPRODUCTS "${TestWorkingDir_BINARY_DIR}/customTarget.c"
+  COMMAND "${CMAKE_COMMAND}" -E copy_if_different ./customTarget.c "${TestWorkingDir_BINARY_DIR}/customTarget1.c"
+  BYPRODUCTS "${TestWorkingDir_BINARY_DIR}/customTarget1.c"
   WORKING_DIRECTORY  "${TestWorkingDir_SOURCE_DIR}"
 )
 

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=c49d13f94b171bd29b9b403df0e5f19723c4e251
commit c49d13f94b171bd29b9b403df0e5f19723c4e251
Author:     Zack Galbreath <zack.galbreath at kitware.com>
AuthorDate: Fri Sep 21 16:10:03 2018 -0400
Commit:     Zack Galbreath <zack.galbreath at kitware.com>
CommitDate: Fri Sep 28 10:49:45 2018 -0400

    ctest: only create buildid when submitting from Testing/ dir
    
    In 7f530cc we taught CTest to pass extra information to CDash at submit
    time.  This extra info is used by CDash to initialize a buildid.
    
    `ctest_submit(FILES)` can be used to send specific files to CDash.
    These files are not necessarily associated with the build currently
    being performed. For this reason, we modify the behavior of ctest_submit()
    to only specify this extra info when we are submitting files from the
    current build's Testing directory.

diff --git a/Source/CTest/cmCTestSubmitHandler.cxx b/Source/CTest/cmCTestSubmitHandler.cxx
index c7f3f39..ecf309a 100644
--- a/Source/CTest/cmCTestSubmitHandler.cxx
+++ b/Source/CTest/cmCTestSubmitHandler.cxx
@@ -392,8 +392,12 @@ bool cmCTestSubmitHandler::SubmitUsingHTTP(const std::string& localprefix,
       ::curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
 
       std::string local_file = file;
+      bool initialize_cdash_buildid = false;
       if (!cmSystemTools::FileExists(local_file)) {
         local_file = localprefix + "/" + file;
+        // If this file exists within the local Testing directory we assume
+        // that it will be associated with the current build in CDash.
+        initialize_cdash_buildid = true;
       }
       std::string remote_file =
         remoteprefix + cmSystemTools::GetFilenameName(file);
@@ -425,26 +429,30 @@ bool cmCTestSubmitHandler::SubmitUsingHTTP(const std::string& localprefix,
         ((url.find('?') == std::string::npos) ? '?' : '&') +
         "FileName=" + ofile;
 
-      cmCTestCurl ctest_curl(this->CTest);
-      upload_as += "&build=";
-      upload_as +=
-        ctest_curl.Escape(this->CTest->GetCTestConfiguration("BuildName"));
-      upload_as += "&site=";
-      upload_as +=
-        ctest_curl.Escape(this->CTest->GetCTestConfiguration("Site"));
-      upload_as += "&stamp=";
-      upload_as += ctest_curl.Escape(this->CTest->GetCurrentTag());
-      upload_as += "-";
-      upload_as += ctest_curl.Escape(this->CTest->GetTestModelString());
-      cmCTestScriptHandler* ch =
-        static_cast<cmCTestScriptHandler*>(this->CTest->GetHandler("script"));
-      cmake* cm = ch->GetCMake();
-      if (cm) {
-        const char* subproject =
-          cm->GetState()->GetGlobalProperty("SubProject");
-        if (subproject) {
-          upload_as += "&subproject=";
-          upload_as += ctest_curl.Escape(subproject);
+      if (initialize_cdash_buildid) {
+        // Provide extra arguments to CDash so that it can initialize and
+        // return a buildid.
+        cmCTestCurl ctest_curl(this->CTest);
+        upload_as += "&build=";
+        upload_as +=
+          ctest_curl.Escape(this->CTest->GetCTestConfiguration("BuildName"));
+        upload_as += "&site=";
+        upload_as +=
+          ctest_curl.Escape(this->CTest->GetCTestConfiguration("Site"));
+        upload_as += "&stamp=";
+        upload_as += ctest_curl.Escape(this->CTest->GetCurrentTag());
+        upload_as += "-";
+        upload_as += ctest_curl.Escape(this->CTest->GetTestModelString());
+        cmCTestScriptHandler* ch = static_cast<cmCTestScriptHandler*>(
+          this->CTest->GetHandler("script"));
+        cmake* cm = ch->GetCMake();
+        if (cm) {
+          const char* subproject =
+            cm->GetState()->GetGlobalProperty("SubProject");
+          if (subproject) {
+            upload_as += "&subproject=";
+            upload_as += ctest_curl.Escape(subproject);
+          }
         }
       }
 
diff --git a/Tests/RunCMake/ctest_submit/FILESNoBuildId-result.txt b/Tests/RunCMake/ctest_submit/FILESNoBuildId-result.txt
new file mode 100644
index 0000000..b57e2de
--- /dev/null
+++ b/Tests/RunCMake/ctest_submit/FILESNoBuildId-result.txt
@@ -0,0 +1 @@
+(-1|255)
diff --git a/Tests/RunCMake/ctest_submit/FILESNoBuildId-stderr.txt b/Tests/RunCMake/ctest_submit/FILESNoBuildId-stderr.txt
new file mode 100644
index 0000000..a8f10b5
--- /dev/null
+++ b/Tests/RunCMake/ctest_submit/FILESNoBuildId-stderr.txt
@@ -0,0 +1 @@
+ *Error message was: ([Cc]ould *n.t resolve host:? '?-no-site-'?.*|The requested URL returned error:.*)
diff --git a/Tests/RunCMake/ctest_submit/FILESNoBuildId-stdout.txt b/Tests/RunCMake/ctest_submit/FILESNoBuildId-stdout.txt
new file mode 100644
index 0000000..929b254
--- /dev/null
+++ b/Tests/RunCMake/ctest_submit/FILESNoBuildId-stdout.txt
@@ -0,0 +1 @@
+Upload file: .* to http:\/\/-no-site-\?FileName=test-site___test-build-name___.*-Experimental___XML___RunCMakeTest.cmake&MD5=.* Size: .*
diff --git a/Tests/RunCMake/ctest_submit/RunCMakeTest.cmake b/Tests/RunCMake/ctest_submit/RunCMakeTest.cmake
index 7661383..952368d 100644
--- a/Tests/RunCMake/ctest_submit/RunCMakeTest.cmake
+++ b/Tests/RunCMake/ctest_submit/RunCMakeTest.cmake
@@ -31,6 +31,7 @@ run_ctest_submit(CDashUploadMissingFile CDASH_UPLOAD bad-upload)
 run_ctest_submit(CDashUploadRetry CDASH_UPLOAD ${CMAKE_CURRENT_LIST_FILE} CDASH_UPLOAD_TYPE foo RETRY_COUNT 2 RETRY_DELAY 1 INTERNAL_TEST_CHECKSUM)
 run_ctest_submit(CDashSubmitQuiet QUIET)
 run_ctest_submit_debug(CDashSubmitVerbose)
+run_ctest_submit_debug(FILESNoBuildId FILES ${CMAKE_CURRENT_LIST_FILE})
 run_ctest_submit_debug(CDashSubmitHeaders HTTPHEADER "Authorization: Bearer asdf")
 run_ctest_submit_debug(CDashUploadHeaders CDASH_UPLOAD ${CMAKE_CURRENT_LIST_FILE} CDASH_UPLOAD_TYPE foo HTTPHEADER "Authorization: Bearer asdf")
 

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=b3d5b8b3fb7b009f2d3d24811934c08fd7ccec69
commit b3d5b8b3fb7b009f2d3d24811934c08fd7ccec69
Author:     Michael Wegner <michael_wegner at apple.com>
AuthorDate: Sat Sep 22 21:47:27 2018 -0700
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Wed Sep 26 11:47:49 2018 -0400

    ctest: Add option for live progress summary in terminal

diff --git a/Help/release/dev/ctest-progress-output.rst b/Help/release/dev/ctest-progress-output.rst
new file mode 100644
index 0000000..a9e946b
--- /dev/null
+++ b/Help/release/dev/ctest-progress-output.rst
@@ -0,0 +1,5 @@
+ctest-progress-output
+---------------------
+
+* :manual:`ctest(1)` gained a ``--progress`` option to enable a live
+  test progress summary when output goes to a terminal.
diff --git a/Source/CTest/cmCTestRunTest.cxx b/Source/CTest/cmCTestRunTest.cxx
index 36604a5..7f081ef 100644
--- a/Source/CTest/cmCTestRunTest.cxx
+++ b/Source/CTest/cmCTestRunTest.cxx
@@ -246,7 +246,30 @@ bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started)
   sprintf(buf, "%6.2f sec", this->TestProcess->GetTotalTime().count());
   outputStream << buf << "\n";
 
-  cmCTestLog(this->CTest, HANDLER_OUTPUT, outputStream.str());
+  if (this->CTest->GetTestProgressOutput()) {
+    if (!passed) {
+      // If the test did not pass, reprint test name and error
+      std::string output = GetTestPrefix(completed, total);
+      std::string testName = this->TestProperties->Name;
+      const int maxTestNameWidth = this->CTest->GetMaxTestNameWidth();
+      testName.resize(maxTestNameWidth + 4, '.');
+
+      output += testName;
+      output += outputStream.str();
+      outputStream.str("");
+      outputStream.clear();
+      outputStream << output;
+      cmCTestLog(this->CTest, HANDLER_TEST_PROGRESS_OUTPUT, "\n"); // flush
+    }
+    if (completed == total) {
+      std::string testName =
+        GetTestPrefix(completed, total) + this->TestProperties->Name + "\n";
+      cmCTestLog(this->CTest, HANDLER_TEST_PROGRESS_OUTPUT, testName);
+    }
+  }
+  if (!this->CTest->GetTestProgressOutput() || !passed) {
+    cmCTestLog(this->CTest, HANDLER_OUTPUT, outputStream.str());
+  }
 
   if (outputTestErrorsToConsole) {
     cmCTestLog(this->CTest, HANDLER_OUTPUT, this->ProcessOutput << std::endl);
@@ -401,12 +424,14 @@ void cmCTestRunTest::StartFailure(std::string const& output)
 {
   // Still need to log the Start message so the test summary records our
   // attempt to start this test
-  cmCTestLog(this->CTest, HANDLER_OUTPUT,
-             std::setw(2 * getNumWidth(this->TotalNumberOfTests) + 8)
-               << "Start "
-               << std::setw(getNumWidth(this->TestHandler->GetMaxIndex()))
-               << this->TestProperties->Index << ": "
-               << this->TestProperties->Name << std::endl);
+  if (!this->CTest->GetTestProgressOutput()) {
+    cmCTestLog(this->CTest, HANDLER_OUTPUT,
+               std::setw(2 * getNumWidth(this->TotalNumberOfTests) + 8)
+                 << "Start "
+                 << std::setw(getNumWidth(this->TestHandler->GetMaxIndex()))
+                 << this->TestProperties->Index << ": "
+                 << this->TestProperties->Name << std::endl);
+  }
 
   this->ProcessOutput.clear();
   if (!output.empty()) {
@@ -428,17 +453,44 @@ void cmCTestRunTest::StartFailure(std::string const& output)
   this->TestProcess = cm::make_unique<cmProcess>(*this);
 }
 
+std::string cmCTestRunTest::GetTestPrefix(size_t completed, size_t total) const
+{
+  std::ostringstream outputStream;
+  outputStream << std::setw(getNumWidth(total)) << completed << "/";
+  outputStream << std::setw(getNumWidth(total)) << total << " ";
+
+  if (this->TestHandler->MemCheck) {
+    outputStream << "MemCheck";
+  } else {
+    outputStream << "Test";
+  }
+
+  std::ostringstream indexStr;
+  indexStr << " #" << this->Index << ":";
+  outputStream << std::setw(3 + getNumWidth(this->TestHandler->GetMaxIndex()))
+               << indexStr.str();
+  outputStream << " ";
+
+  return outputStream.str();
+}
+
 // Starts the execution of a test.  Returns once it has started
 bool cmCTestRunTest::StartTest(size_t completed, size_t total)
 {
   this->TotalNumberOfTests = total; // save for rerun case
-  static_cast<void>(completed);
-  cmCTestLog(this->CTest, HANDLER_OUTPUT,
-             std::setw(2 * getNumWidth(total) + 8)
-               << "Start "
-               << std::setw(getNumWidth(this->TestHandler->GetMaxIndex()))
-               << this->TestProperties->Index << ": "
-               << this->TestProperties->Name << std::endl);
+  if (!this->CTest->GetTestProgressOutput()) {
+    cmCTestLog(this->CTest, HANDLER_OUTPUT,
+               std::setw(2 * getNumWidth(total) + 8)
+                 << "Start "
+                 << std::setw(getNumWidth(this->TestHandler->GetMaxIndex()))
+                 << this->TestProperties->Index << ": "
+                 << this->TestProperties->Name << std::endl);
+  } else {
+    std::string testName =
+      GetTestPrefix(completed, total) + this->TestProperties->Name + "\n";
+    cmCTestLog(this->CTest, HANDLER_TEST_PROGRESS_OUTPUT, testName);
+  }
+
   this->ProcessOutput.clear();
 
   // Return immediately if test is disabled
@@ -695,13 +747,13 @@ void cmCTestRunTest::WriteLogOutputTop(size_t completed, size_t total)
 {
   std::ostringstream outputStream;
 
-  // if this is the last or only run of this test
-  // then print out completed / total
+  // If this is the last or only run of this test, or progress output is
+  // requested, then print out completed / total.
   // Only issue is if a test fails and we are running until fail
   // then it will never print out the completed / total, same would
   // got for run until pass.  Trick is when this is called we don't
   // yet know if we are passing or failing.
-  if (this->NumberOfRunsLeft == 1) {
+  if (this->NumberOfRunsLeft == 1 || this->CTest->GetTestProgressOutput()) {
     outputStream << std::setw(getNumWidth(total)) << completed << "/";
     outputStream << std::setw(getNumWidth(total)) << total << " ";
   }
@@ -755,7 +807,9 @@ void cmCTestRunTest::WriteLogOutputTop(size_t completed, size_t total)
   *this->TestHandler->LogFile << this->ProcessOutput << "<end of output>"
                               << std::endl;
 
-  cmCTestLog(this->CTest, HANDLER_OUTPUT, outputStream.str());
+  if (!this->CTest->GetTestProgressOutput()) {
+    cmCTestLog(this->CTest, HANDLER_OUTPUT, outputStream.str());
+  }
 
   cmCTestLog(this->CTest, DEBUG,
              "Testing " << this->TestProperties->Name << " ... ");
diff --git a/Source/CTest/cmCTestRunTest.h b/Source/CTest/cmCTestRunTest.h
index ab8b0da..48a5064 100644
--- a/Source/CTest/cmCTestRunTest.h
+++ b/Source/CTest/cmCTestRunTest.h
@@ -94,6 +94,9 @@ private:
   // Run post processing of the process output for MemCheck
   void MemCheckPostProcess();
 
+  // Returns "completed/total Test #Index: "
+  std::string GetTestPrefix(size_t completed, size_t total) const;
+
   cmCTestTestHandler::cmCTestTestProperties* TestProperties;
   bool TimeoutIsForStopTime = false;
   // Pointer back to the "parent"; the handler that invoked this test run
diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx
index 6639787..908eea1 100644
--- a/Source/cmCTest.cxx
+++ b/Source/cmCTest.cxx
@@ -24,6 +24,11 @@
 #include <time.h>
 #include <utility>
 #include <vector>
+#if defined(_WIN32)
+#  include <windows.h> // IWYU pragma: keep
+#else
+#  include <unistd.h> // IWYU pragma: keep
+#endif
 
 #include "cmAlgorithms.h"
 #include "cmCTestBuildAndTestHandler.h"
@@ -263,6 +268,8 @@ cmCTest::cmCTest()
   this->Failover = false;
   this->ForceNewCTestProcess = false;
   this->TomorrowTag = false;
+  this->TestProgressOutput = false;
+  this->FlushTestProgressLine = false;
   this->Verbose = false;
 
   this->Debug = false;
@@ -290,10 +297,16 @@ cmCTest::cmCTest()
   this->OutputTestOutputOnTestFailure = false;
   this->RepeatTests = 1; // default to run each test once
   this->RepeatUntilFail = false;
-  std::string outOnFail;
-  if (cmSystemTools::GetEnv("CTEST_OUTPUT_ON_FAILURE", outOnFail)) {
-    this->OutputTestOutputOnTestFailure = !cmSystemTools::IsOff(outOnFail);
+
+  std::string envValue;
+  if (cmSystemTools::GetEnv("CTEST_OUTPUT_ON_FAILURE", envValue)) {
+    this->OutputTestOutputOnTestFailure = !cmSystemTools::IsOff(envValue);
+  }
+  envValue.clear();
+  if (cmSystemTools::GetEnv("CTEST_PROGRESS_OUTPUT", envValue)) {
+    this->TestProgressOutput = !cmSystemTools::IsOff(envValue);
   }
+
   this->InitStreams();
 
   this->Parts[PartStart].SetName("Start");
@@ -1875,6 +1888,9 @@ bool cmCTest::HandleCommandLineArguments(size_t& i,
   if (this->CheckArgument(arg, "-Q", "--quiet")) {
     this->Quiet = true;
   }
+  if (this->CheckArgument(arg, "--progress")) {
+    this->TestProgressOutput = true;
+  }
   if (this->CheckArgument(arg, "-V", "--verbose")) {
     this->Verbose = true;
   }
@@ -2038,6 +2054,23 @@ bool cmCTest::HandleCommandLineArguments(size_t& i,
   return true;
 }
 
+bool cmCTest::ProgressOutputSupportedByConsole() const
+{
+#if defined(_WIN32)
+  // On Windows we need a console buffer.
+  void* console = GetStdHandle(STD_OUTPUT_HANDLE);
+  CONSOLE_SCREEN_BUFFER_INFO csbi;
+  return GetConsoleScreenBufferInfo(console, &csbi);
+#else
+  // On UNIX we need a non-dumb tty.
+  std::string term_env_variable;
+  if (cmSystemTools::GetEnv("TERM", term_env_variable)) {
+    return isatty(1) && term_env_variable != "dumb";
+  }
+#endif
+  return false;
+}
+
 // handle the -S -SR and -SP arguments
 void cmCTest::HandleScriptArguments(size_t& i, std::vector<std::string>& args,
                                     bool& SRArgumentSpecified)
@@ -2192,6 +2225,18 @@ int cmCTest::Run(std::vector<std::string>& args, std::string* output)
     }
   }
 
+  // TestProgressOutput only supported if console supports it and not logging
+  // to a file
+  this->TestProgressOutput = this->TestProgressOutput &&
+    !this->OutputLogFile && this->ProgressOutputSupportedByConsole();
+#ifdef _WIN32
+  if (this->TestProgressOutput) {
+    // Disable output line buffering so we can print content without
+    // a newline.
+    std::setvbuf(stdout, nullptr, _IONBF, 0);
+  }
+#endif
+
   // now what should cmake do? if --build-and-test was specified then
   // we run the build and test handler and return
   if (cmakeAndTest) {
@@ -2761,6 +2806,7 @@ static const char* cmCTestStringLogType[] = { "DEBUG",
                                               "OUTPUT",
                                               "HANDLER_OUTPUT",
                                               "HANDLER_PROGRESS_OUTPUT",
+                                              "HANDLER_TEST_PROGRESS_OUTPUT",
                                               "HANDLER_VERBOSE_OUTPUT",
                                               "WARNING",
                                               "ERROR_MESSAGE",
@@ -2821,6 +2867,34 @@ void cmCTest::Log(int logType, const char* file, int line, const char* msg,
   if (!this->Quiet) {
     std::ostream& out = *this->StreamOut;
     std::ostream& err = *this->StreamErr;
+
+    if (logType == HANDLER_TEST_PROGRESS_OUTPUT) {
+      if (this->TestProgressOutput) {
+        cmCTestLogOutputFileLine(out);
+        if (this->FlushTestProgressLine) {
+          printf("\r");
+          this->FlushTestProgressLine = false;
+          out.flush();
+        }
+
+        std::string msg_str{ msg };
+        auto const lineBreakIt = msg_str.find('\n');
+        if (lineBreakIt != std::string::npos) {
+          this->FlushTestProgressLine = true;
+          msg_str.erase(std::remove(msg_str.begin(), msg_str.end(), '\n'),
+                        msg_str.end());
+        }
+
+        out << msg_str;
+#ifndef _WIN32
+        printf("\x1B[K"); // move caret to end
+#endif
+        out.flush();
+        return;
+      }
+      logType = HANDLER_OUTPUT;
+    }
+
     switch (logType) {
       case DEBUG:
         if (this->Debug) {
diff --git a/Source/cmCTest.h b/Source/cmCTest.h
index c6ece98..345b538 100644
--- a/Source/cmCTest.h
+++ b/Source/cmCTest.h
@@ -390,6 +390,7 @@ public:
     OUTPUT,
     HANDLER_OUTPUT,
     HANDLER_PROGRESS_OUTPUT,
+    HANDLER_TEST_PROGRESS_OUTPUT,
     HANDLER_VERBOSE_OUTPUT,
     WARNING,
     ERROR_MESSAGE,
@@ -429,6 +430,8 @@ public:
   void SetFailover(bool failover) { this->Failover = failover; }
   bool GetFailover() { return this->Failover; }
 
+  bool GetTestProgressOutput() const { return this->TestProgressOutput; }
+
   bool GetVerbose() { return this->Verbose; }
   bool GetExtraVerbose() { return this->ExtraVerbose; }
 
@@ -467,6 +470,7 @@ private:
   std::string ConfigType;
   std::string ScheduleType;
   std::chrono::system_clock::time_point StopTime;
+  bool TestProgressOutput;
   bool Verbose;
   bool ExtraVerbose;
   bool ProduceXML;
@@ -476,6 +480,8 @@ private:
   bool PrintLabels;
   bool Failover;
 
+  bool FlushTestProgressLine;
+
   bool ForceNewCTestProcess;
 
   bool RunConfigurationScript;
@@ -561,6 +567,9 @@ private:
   bool HandleCommandLineArguments(size_t& i, std::vector<std::string>& args,
                                   std::string& errormsg);
 
+  /** returns true iff the console supports progress output */
+  bool ProgressOutputSupportedByConsole() const;
+
   /** handle the -S -SP and -SR arguments */
   void HandleScriptArguments(size_t& i, std::vector<std::string>& args,
                              bool& SRArgumentSpecified);
diff --git a/Source/ctest.cxx b/Source/ctest.cxx
index b338dea..ca8a776 100644
--- a/Source/ctest.cxx
+++ b/Source/ctest.cxx
@@ -27,6 +27,7 @@ static const char* cmDocumentationUsage[][2] = { { nullptr,
 
 static const char* cmDocumentationOptions[][2] = {
   { "-C <cfg>, --build-config <cfg>", "Choose configuration to test." },
+  { "--progress", "Enable short progress output from tests." },
   { "-V,--verbose", "Enable verbose output from tests." },
   { "-VV,--extra-verbose", "Enable more verbose output from tests." },
   { "--debug", "Displaying more verbose internals of CTest." },

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=62fbe5002aa23c7591e325e622e62a2d1ed789be
commit 62fbe5002aa23c7591e325e622e62a2d1ed789be
Author:     Michael Wegner <michael_wegner at apple.com>
AuthorDate: Sat Sep 8 15:36:00 2018 -0700
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Tue Sep 25 08:20:57 2018 -0400

    cmCTestRunTest: Thread number of completed tests through start APIs

diff --git a/Source/CTest/cmCTestMultiProcessHandler.cxx b/Source/CTest/cmCTestMultiProcessHandler.cxx
index 3e0c1ac..f026001 100644
--- a/Source/CTest/cmCTestMultiProcessHandler.cxx
+++ b/Source/CTest/cmCTestMultiProcessHandler.cxx
@@ -178,7 +178,7 @@ bool cmCTestMultiProcessHandler::StartTestProcess(int test)
                           this->Properties[test]->Directory + " : " +
                           std::strerror(workdir.GetLastResult()));
   } else {
-    if (testRun->StartTest(this->Total)) {
+    if (testRun->StartTest(this->Completed, this->Total)) {
       return true;
     }
   }
@@ -440,7 +440,7 @@ void cmCTestMultiProcessHandler::FinishTestProcess(cmCTestRunTest* runner,
     this->SetStopTimePassed();
   }
   if (started) {
-    if (!this->StopTimePassed && runner->StartAgain()) {
+    if (!this->StopTimePassed && runner->StartAgain(this->Completed)) {
       this->Completed--; // remove the completed test because run again
       return;
     }
diff --git a/Source/CTest/cmCTestRunTest.cxx b/Source/CTest/cmCTestRunTest.cxx
index 57b12f1..36604a5 100644
--- a/Source/CTest/cmCTestRunTest.cxx
+++ b/Source/CTest/cmCTestRunTest.cxx
@@ -334,7 +334,7 @@ bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started)
   return passed || skipped;
 }
 
-bool cmCTestRunTest::StartAgain()
+bool cmCTestRunTest::StartAgain(size_t completed)
 {
   if (!this->RunAgain) {
     return false;
@@ -349,7 +349,7 @@ bool cmCTestRunTest::StartAgain()
     return true;
   }
 
-  this->StartTest(this->TotalNumberOfTests);
+  this->StartTest(completed, this->TotalNumberOfTests);
   return true;
 }
 
@@ -429,9 +429,10 @@ void cmCTestRunTest::StartFailure(std::string const& output)
 }
 
 // Starts the execution of a test.  Returns once it has started
-bool cmCTestRunTest::StartTest(size_t total)
+bool cmCTestRunTest::StartTest(size_t completed, size_t total)
 {
   this->TotalNumberOfTests = total; // save for rerun case
+  static_cast<void>(completed);
   cmCTestLog(this->CTest, HANDLER_OUTPUT,
              std::setw(2 * getNumWidth(total) + 8)
                << "Start "
diff --git a/Source/CTest/cmCTestRunTest.h b/Source/CTest/cmCTestRunTest.h
index 8e24834..ab8b0da 100644
--- a/Source/CTest/cmCTestRunTest.h
+++ b/Source/CTest/cmCTestRunTest.h
@@ -65,7 +65,7 @@ public:
   void CompressOutput();
 
   // launch the test process, return whether it started correctly
-  bool StartTest(size_t total);
+  bool StartTest(size_t completed, size_t total);
   // capture and report the test results
   bool EndTest(size_t completed, size_t total, bool started);
   // Called by ctest -N to log the command string
@@ -73,7 +73,7 @@ public:
 
   void ComputeWeightedCost();
 
-  bool StartAgain();
+  bool StartAgain(size_t completed);
 
   void StartFailure(std::string const& output);
 

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=02c5091c905964b529020070b4b24616d8a3fbd8
commit 02c5091c905964b529020070b4b24616d8a3fbd8
Author:     Michael Wegner <michael_wegner at apple.com>
AuthorDate: Sat Sep 8 15:36:00 2018 -0700
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Tue Sep 25 08:20:57 2018 -0400

    cmCTestRunTest: Simplify number width computation
    
    Use a real logarithm implementation.

diff --git a/Source/CTest/cmCTestRunTest.h b/Source/CTest/cmCTestRunTest.h
index 7e80157..8e24834 100644
--- a/Source/CTest/cmCTestRunTest.h
+++ b/Source/CTest/cmCTestRunTest.h
@@ -5,6 +5,7 @@
 
 #include "cmConfigure.h" // IWYU pragma: keep
 
+#include <cmath>
 #include <set>
 #include <stddef.h>
 #include <string>
@@ -118,14 +119,7 @@ private:
 
 inline int getNumWidth(size_t n)
 {
-  int numWidth = 1;
-  if (n >= 10) {
-    numWidth = 2;
-  }
-  if (n >= 100) {
-    numWidth = 3;
-  }
-  return numWidth;
+  return static_cast<int>(std::log10(n)) + 1;
 }
 
 #endif

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=6a285bb737b904f33de287eede1eaec9928e3e3d
commit 6a285bb737b904f33de287eede1eaec9928e3e3d
Author:     Michael Wegner <michael_wegner at apple.com>
AuthorDate: Sat Jul 28 13:46:19 2018 -0700
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Tue Sep 25 08:20:57 2018 -0400

    cmCTestRunTest: Buffer test result output before printing

diff --git a/Source/CTest/cmCTestRunTest.cxx b/Source/CTest/cmCTestRunTest.cxx
index 23d4616..57b12f1 100644
--- a/Source/CTest/cmCTestRunTest.cxx
+++ b/Source/CTest/cmCTestRunTest.cxx
@@ -181,6 +181,7 @@ bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started)
       }
     }
   }
+  std::ostringstream outputStream;
   if (res == cmProcess::State::Exited) {
     bool success = !forceFail &&
       (retVal == 0 ||
@@ -196,36 +197,36 @@ bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started)
     } else if ((success && !this->TestProperties->WillFail) ||
                (!success && this->TestProperties->WillFail)) {
       this->TestResult.Status = cmCTestTestHandler::COMPLETED;
-      cmCTestLog(this->CTest, HANDLER_OUTPUT, "   Passed  ");
+      outputStream << "   Passed  ";
     } else {
       this->TestResult.Status = cmCTestTestHandler::FAILED;
-      cmCTestLog(this->CTest, HANDLER_OUTPUT, "***Failed  " << reason);
+      outputStream << "***Failed  " << reason;
       outputTestErrorsToConsole = this->CTest->OutputTestOutputOnTestFailure;
     }
   } else if (res == cmProcess::State::Expired) {
-    cmCTestLog(this->CTest, HANDLER_OUTPUT, "***Timeout ");
+    outputStream << "***Timeout ";
     this->TestResult.Status = cmCTestTestHandler::TIMEOUT;
     outputTestErrorsToConsole = this->CTest->OutputTestOutputOnTestFailure;
   } else if (res == cmProcess::State::Exception) {
     outputTestErrorsToConsole = this->CTest->OutputTestOutputOnTestFailure;
-    cmCTestLog(this->CTest, HANDLER_OUTPUT, "***Exception: ");
+    outputStream << "***Exception: ";
     this->TestResult.ExceptionStatus =
       this->TestProcess->GetExitExceptionString();
     switch (this->TestProcess->GetExitException()) {
       case cmProcess::Exception::Fault:
-        cmCTestLog(this->CTest, HANDLER_OUTPUT, "SegFault");
+        outputStream << "SegFault";
         this->TestResult.Status = cmCTestTestHandler::SEGFAULT;
         break;
       case cmProcess::Exception::Illegal:
-        cmCTestLog(this->CTest, HANDLER_OUTPUT, "Illegal");
+        outputStream << "Illegal";
         this->TestResult.Status = cmCTestTestHandler::ILLEGAL;
         break;
       case cmProcess::Exception::Interrupt:
-        cmCTestLog(this->CTest, HANDLER_OUTPUT, "Interrupt");
+        outputStream << "Interrupt";
         this->TestResult.Status = cmCTestTestHandler::INTERRUPT;
         break;
       case cmProcess::Exception::Numerical:
-        cmCTestLog(this->CTest, HANDLER_OUTPUT, "Numerical");
+        outputStream << "Numerical";
         this->TestResult.Status = cmCTestTestHandler::NUMERICAL;
         break;
       default:
@@ -234,16 +235,18 @@ bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started)
         this->TestResult.Status = cmCTestTestHandler::OTHER_FAULT;
     }
   } else if ("Disabled" == this->TestResult.CompletionStatus) {
-    cmCTestLog(this->CTest, HANDLER_OUTPUT, "***Not Run (Disabled) ");
+    outputStream << "***Not Run (Disabled) ";
   } else // cmProcess::State::Error
   {
-    cmCTestLog(this->CTest, HANDLER_OUTPUT, "***Not Run ");
+    outputStream << "***Not Run ";
   }
 
   passed = this->TestResult.Status == cmCTestTestHandler::COMPLETED;
   char buf[1024];
   sprintf(buf, "%6.2f sec", this->TestProcess->GetTotalTime().count());
-  cmCTestLog(this->CTest, HANDLER_OUTPUT, buf << "\n");
+  outputStream << buf << "\n";
+
+  cmCTestLog(this->CTest, HANDLER_OUTPUT, outputStream.str());
 
   if (outputTestErrorsToConsole) {
     cmCTestLog(this->CTest, HANDLER_OUTPUT, this->ProcessOutput << std::endl);
@@ -689,6 +692,8 @@ bool cmCTestRunTest::ForkProcess(cmDuration testTimeOut, bool explicitTimeout,
 
 void cmCTestRunTest::WriteLogOutputTop(size_t completed, size_t total)
 {
+  std::ostringstream outputStream;
+
   // if this is the last or only run of this test
   // then print out completed / total
   // Only issue is if a test fails and we are running until fail
@@ -696,37 +701,32 @@ void cmCTestRunTest::WriteLogOutputTop(size_t completed, size_t total)
   // got for run until pass.  Trick is when this is called we don't
   // yet know if we are passing or failing.
   if (this->NumberOfRunsLeft == 1) {
-    cmCTestLog(this->CTest, HANDLER_OUTPUT,
-               std::setw(getNumWidth(total)) << completed << "/");
-    cmCTestLog(this->CTest, HANDLER_OUTPUT,
-               std::setw(getNumWidth(total)) << total << " ");
+    outputStream << std::setw(getNumWidth(total)) << completed << "/";
+    outputStream << std::setw(getNumWidth(total)) << total << " ";
   }
   // if this is one of several runs of a test just print blank space
   // to keep things neat
   else {
-    cmCTestLog(this->CTest, HANDLER_OUTPUT,
-               std::setw(getNumWidth(total)) << " "
-                                             << " ");
-    cmCTestLog(this->CTest, HANDLER_OUTPUT,
-               std::setw(getNumWidth(total)) << " "
-                                             << " ");
+    outputStream << std::setw(getNumWidth(total)) << "  ";
+    outputStream << std::setw(getNumWidth(total)) << "  ";
   }
 
   if (this->TestHandler->MemCheck) {
-    cmCTestLog(this->CTest, HANDLER_OUTPUT, "MemCheck");
+    outputStream << "MemCheck";
   } else {
-    cmCTestLog(this->CTest, HANDLER_OUTPUT, "Test");
+    outputStream << "Test";
   }
 
   std::ostringstream indexStr;
   indexStr << " #" << this->Index << ":";
-  cmCTestLog(this->CTest, HANDLER_OUTPUT,
-             std::setw(3 + getNumWidth(this->TestHandler->GetMaxIndex()))
-               << indexStr.str());
-  cmCTestLog(this->CTest, HANDLER_OUTPUT, " ");
+  outputStream << std::setw(3 + getNumWidth(this->TestHandler->GetMaxIndex()))
+               << indexStr.str();
+  outputStream << " ";
+
   const int maxTestNameWidth = this->CTest->GetMaxTestNameWidth();
   std::string outname = this->TestProperties->Name + " ";
   outname.resize(maxTestNameWidth + 4, '.');
+  outputStream << outname;
 
   *this->TestHandler->LogFile << this->TestProperties->Index << "/"
                               << this->TestHandler->TotalNumberOfTests
@@ -754,7 +754,8 @@ void cmCTestRunTest::WriteLogOutputTop(size_t completed, size_t total)
   *this->TestHandler->LogFile << this->ProcessOutput << "<end of output>"
                               << std::endl;
 
-  cmCTestLog(this->CTest, HANDLER_OUTPUT, outname.c_str());
+  cmCTestLog(this->CTest, HANDLER_OUTPUT, outputStream.str());
+
   cmCTestLog(this->CTest, DEBUG,
              "Testing " << this->TestProperties->Name << " ... ");
 }

-----------------------------------------------------------------------

Summary of changes:
 Help/release/dev/byproducts_make_clean.rst         |   5 +
 Help/release/dev/ctest-progress-output.rst         |   5 +
 Source/CTest/cmCTestMultiProcessHandler.cxx        |   4 +-
 Source/CTest/cmCTestRunTest.cxx                    | 148 ++++++++++++++-------
 Source/CTest/cmCTestRunTest.h                      |  17 +--
 Source/CTest/cmCTestSubmitHandler.cxx              |  48 ++++---
 Source/cmCTest.cxx                                 |  80 ++++++++++-
 Source/cmCTest.h                                   |   9 ++
 Source/cmMakefileTargetGenerator.cxx               |  30 +++++
 Source/ctest.cxx                                   |   1 +
 Tests/CustomCommandWorkingDirectory/CMakeLists.txt |   8 +-
 .../{foreach => Byproducts}/CMakeLists.txt         |   0
 Tests/RunCMake/Byproducts/CleanByproducts.cmake    |  93 +++++++++++++
 Tests/RunCMake/Byproducts/RunCMakeTest.cmake       |  58 ++++++++
 Tests/RunCMake/Byproducts/files.cmake.in           |   2 +
 Tests/RunCMake/Byproducts/foo.cpp                  |  14 ++
 Tests/RunCMake/CMakeLists.txt                      |   3 +
 ..._VALUE-result.txt => FILESNoBuildId-result.txt} |   0
 ...erbose-stderr.txt => FILESNoBuildId-stderr.txt} |   0
 .../ctest_submit/FILESNoBuildId-stdout.txt         |   1 +
 Tests/RunCMake/ctest_submit/RunCMakeTest.cmake     |   1 +
 21 files changed, 442 insertions(+), 85 deletions(-)
 create mode 100644 Help/release/dev/byproducts_make_clean.rst
 create mode 100644 Help/release/dev/ctest-progress-output.rst
 copy Tests/RunCMake/{foreach => Byproducts}/CMakeLists.txt (100%)
 create mode 100644 Tests/RunCMake/Byproducts/CleanByproducts.cmake
 create mode 100644 Tests/RunCMake/Byproducts/RunCMakeTest.cmake
 create mode 100644 Tests/RunCMake/Byproducts/files.cmake.in
 create mode 100644 Tests/RunCMake/Byproducts/foo.cpp
 copy Tests/RunCMake/ctest_submit/{RepeatRETURN_VALUE-result.txt => FILESNoBuildId-result.txt} (100%)
 copy Tests/RunCMake/ctest_submit/{CDashSubmitVerbose-stderr.txt => FILESNoBuildId-stderr.txt} (100%)
 create mode 100644 Tests/RunCMake/ctest_submit/FILESNoBuildId-stdout.txt


hooks/post-receive
-- 
CMake


More information about the Cmake-commits mailing list