Explorar o código

cmake: Teach --build to get VCExpress output (#15437)

VCExpress does not produce output if its pipes are connected to
an interactive terminal.  Add a special case to 'cmake --build'
to capture the output through a pipe and re-print it instead of
sharing output pipes with VCExpress.
Brad King %!s(int64=10) %!d(string=hai) anos
pai
achega
94887cb6f1
Modificáronse 1 ficheiros con 13 adicións e 4 borrados
  1. 13 4
      Source/cmGlobalGenerator.cxx

+ 13 - 4
Source/cmGlobalGenerator.cxx

@@ -1717,6 +1717,19 @@ int cmGlobalGenerator::Build(
   std::string outputBuffer;
   std::string outputBuffer;
   std::string* outputPtr = &outputBuffer;
   std::string* outputPtr = &outputBuffer;
 
 
+  std::vector<std::string> makeCommand;
+  this->GenerateBuildCommand(makeCommand, makeCommandCSTR, projectName,
+                             bindir, target, config, fast, verbose,
+                             nativeOptions);
+
+  // Workaround to convince VCExpress.exe to produce output.
+  if (outputflag == cmSystemTools::OUTPUT_PASSTHROUGH &&
+      !makeCommand.empty() && cmSystemTools::LowerCase(
+        cmSystemTools::GetFilenameName(makeCommand[0])) == "vcexpress.exe")
+    {
+    outputflag = cmSystemTools::OUTPUT_NORMAL;
+    }
+
   // should we do a clean first?
   // should we do a clean first?
   if (clean)
   if (clean)
     {
     {
@@ -1743,10 +1756,6 @@ int cmGlobalGenerator::Build(
     }
     }
 
 
   // now build
   // now build
-  std::vector<std::string> makeCommand;
-  this->GenerateBuildCommand(makeCommand, makeCommandCSTR, projectName,
-                             bindir, target, config, fast, verbose,
-                             nativeOptions);
   std::string makeCommandStr = cmSystemTools::PrintSingleCommand(makeCommand);
   std::string makeCommandStr = cmSystemTools::PrintSingleCommand(makeCommand);
   output += "\nRun Build Command:";
   output += "\nRun Build Command:";
   output += makeCommandStr;
   output += makeCommandStr;