Browse Source

Merge topic 'cmuvprocesschain'

adb3e13d32 cmUVProcessChain: Tolerate fileno() of invalid FILE stream
b6e4e4babc cmUVProcessChain: Simplify SetExternalStream usage
116bb2b70f cmUVProcessChain: Simplify builder initialization
d32c30906a Tests: Add missing include in testUVProcessChainHelper on Windows

Acked-by: Kitware Robot <[email protected]>
Merge-request: !9181
Brad King 1 year ago
parent
commit
b11c8c45f9

+ 2 - 4
Source/CTest/cmCTestCoverageHandler.cxx

@@ -21,8 +21,6 @@
 #include "cmsys/Glob.hxx"
 #include "cmsys/RegularExpression.hxx"
 
-#include "cm_fileno.hxx"
-
 #include "cmCTest.h"
 #include "cmDuration.h"
 #include "cmGeneratedFileStream.h"
@@ -1887,9 +1885,9 @@ int cmCTestCoverageHandler::RunBullseyeCommand(
     cmsys::SystemTools::Fopen(stderrFile, "w"), fclose);
   builder.AddCommand(args)
     .SetExternalStream(cmUVProcessChainBuilder::Stream_OUTPUT,
-                       cm_fileno(stdoutHandle.get()))
+                       stdoutHandle.get())
     .SetExternalStream(cmUVProcessChainBuilder::Stream_ERROR,
-                       cm_fileno(stderrHandle.get()));
+                       stderrHandle.get());
   // since we set the output file names wait for it to end
   auto chain = builder.Start();
   chain.Wait();

+ 2 - 7
Source/CTest/cmCTestLaunch.cxx

@@ -13,8 +13,6 @@
 #include "cmsys/FStream.hxx"
 #include "cmsys/RegularExpression.hxx"
 
-#include "cm_fileno.hxx"
-
 #include "cmCTestLaunchReporter.h"
 #include "cmGlobalGenerator.h"
 #include "cmMakefile.h"
@@ -158,11 +156,8 @@ void cmCTestLaunch::RunChild()
   cmsys::ofstream ferr;
   if (this->Reporter.Passthru) {
     // In passthru mode we just share the output pipes.
-    builder
-      .SetExternalStream(cmUVProcessChainBuilder::Stream_OUTPUT,
-                         cm_fileno(stdout))
-      .SetExternalStream(cmUVProcessChainBuilder::Stream_ERROR,
-                         cm_fileno(stderr));
+    builder.SetExternalStream(cmUVProcessChainBuilder::Stream_OUTPUT, stdout)
+      .SetExternalStream(cmUVProcessChainBuilder::Stream_ERROR, stderr);
   } else {
     // In full mode we record the child output pipes to log files.
     builder.SetBuiltinStream(cmUVProcessChainBuilder::Stream_OUTPUT)

+ 5 - 8
Source/cmExecuteProcessCommand.cxx

@@ -17,8 +17,6 @@
 
 #include <cm3p/uv.h>
 
-#include "cm_fileno.hxx"
-
 #include "cmArgumentParser.h"
 #include "cmExecutionStatus.h"
 #include "cmList.h"
@@ -183,11 +181,10 @@ bool cmExecuteProcessCommand(std::vector<std::string> const& args,
     inputFile.reset(cmsys::SystemTools::Fopen(inputFilename, "rb"));
     if (inputFile) {
       builder.SetExternalStream(cmUVProcessChainBuilder::Stream_INPUT,
-                                cm_fileno(inputFile.get()));
+                                inputFile.get());
     }
   } else {
-    builder.SetExternalStream(cmUVProcessChainBuilder::Stream_INPUT,
-                              cm_fileno(stdin));
+    builder.SetExternalStream(cmUVProcessChainBuilder::Stream_INPUT, stdin);
   }
 
   std::unique_ptr<FILE, int (*)(FILE*)> outputFile(nullptr, fclose);
@@ -195,7 +192,7 @@ bool cmExecuteProcessCommand(std::vector<std::string> const& args,
     outputFile.reset(cmsys::SystemTools::Fopen(outputFilename, "wb"));
     if (outputFile) {
       builder.SetExternalStream(cmUVProcessChainBuilder::Stream_OUTPUT,
-                                cm_fileno(outputFile.get()));
+                                outputFile.get());
     }
   } else {
     if (arguments.OutputVariable == arguments.ErrorVariable &&
@@ -211,13 +208,13 @@ bool cmExecuteProcessCommand(std::vector<std::string> const& args,
     if (errorFilename == outputFilename) {
       if (outputFile) {
         builder.SetExternalStream(cmUVProcessChainBuilder::Stream_ERROR,
-                                  cm_fileno(outputFile.get()));
+                                  outputFile.get());
       }
     } else {
       errorFile.reset(cmsys::SystemTools::Fopen(errorFilename, "wb"));
       if (errorFile) {
         builder.SetExternalStream(cmUVProcessChainBuilder::Stream_ERROR,
-                                  cm_fileno(errorFile.get()));
+                                  errorFile.get());
       }
     }
   } else if (arguments.ErrorVariable.empty() ||

+ 3 - 9
Source/cmSystemTools.cxx

@@ -25,8 +25,6 @@
 
 #include <cm3p/uv.h>
 
-#include "cm_fileno.hxx"
-
 #include "cmDuration.h"
 #include "cmELF.h"
 #include "cmMessageMetadata.h"
@@ -576,8 +574,7 @@ bool cmSystemTools::RunSingleCommand(std::vector<std::string> const& command,
                                      cmDuration timeout, Encoding encoding)
 {
   cmUVProcessChainBuilder builder;
-  builder
-    .SetExternalStream(cmUVProcessChainBuilder::Stream_INPUT, cm_fileno(stdin))
+  builder.SetExternalStream(cmUVProcessChainBuilder::Stream_INPUT, stdin)
     .AddCommand(command);
   if (dir) {
     builder.SetWorkingDirectory(dir);
@@ -586,11 +583,8 @@ bool cmSystemTools::RunSingleCommand(std::vector<std::string> const& command,
   if (outputflag == OUTPUT_PASSTHROUGH) {
     captureStdOut = nullptr;
     captureStdErr = nullptr;
-    builder
-      .SetExternalStream(cmUVProcessChainBuilder::Stream_OUTPUT,
-                         cm_fileno(stdout))
-      .SetExternalStream(cmUVProcessChainBuilder::Stream_ERROR,
-                         cm_fileno(stderr));
+    builder.SetExternalStream(cmUVProcessChainBuilder::Stream_OUTPUT, stdout)
+      .SetExternalStream(cmUVProcessChainBuilder::Stream_ERROR, stderr);
   } else if (outputflag == OUTPUT_MERGE ||
              (captureStdErr && captureStdErr == captureStdOut)) {
     builder.SetMergedBuiltinStreams();

+ 13 - 6
Source/cmUVProcessChain.cxx

@@ -12,6 +12,8 @@
 
 #include <cm3p/uv.h>
 
+#include "cm_fileno.hxx"
+
 #include "cmGetPipes.h"
 #include "cmUVHandlePtr.h"
 
@@ -58,12 +60,7 @@ struct cmUVProcessChain::InternalData
   void Finish();
 };
 
-cmUVProcessChainBuilder::cmUVProcessChainBuilder()
-{
-  this->SetNoStream(Stream_INPUT)
-    .SetNoStream(Stream_OUTPUT)
-    .SetNoStream(Stream_ERROR);
-}
+cmUVProcessChainBuilder::cmUVProcessChainBuilder() = default;
 
 cmUVProcessChainBuilder& cmUVProcessChainBuilder::AddCommand(
   const std::vector<std::string>& arguments)
@@ -136,6 +133,16 @@ cmUVProcessChainBuilder& cmUVProcessChainBuilder::SetExternalStream(
   return *this;
 }
 
+cmUVProcessChainBuilder& cmUVProcessChainBuilder::SetExternalStream(
+  Stream stdio, FILE* stream)
+{
+  int fd = cm_fileno(stream);
+  if (fd >= 0) {
+    return this->SetExternalStream(stdio, fd);
+  }
+  return this->SetNoStream(stdio);
+}
+
 cmUVProcessChainBuilder& cmUVProcessChainBuilder::SetMergedBuiltinStreams()
 {
   this->MergedBuiltinStreams = true;

+ 4 - 2
Source/cmUVProcessChain.h

@@ -7,6 +7,7 @@
 #include <array>
 #include <cstddef> // IWYU pragma: keep
 #include <cstdint>
+#include <cstdio>
 #include <memory>
 #include <string>
 #include <utility>
@@ -36,6 +37,7 @@ public:
   cmUVProcessChainBuilder& SetBuiltinStream(Stream stdio);
   cmUVProcessChainBuilder& SetMergedBuiltinStreams();
   cmUVProcessChainBuilder& SetExternalStream(Stream stdio, int fd);
+  cmUVProcessChainBuilder& SetExternalStream(Stream stdio, FILE* stream);
   cmUVProcessChainBuilder& SetWorkingDirectory(std::string dir);
 
   uv_loop_t* GetLoop() const;
@@ -54,8 +56,8 @@ private:
 
   struct StdioConfiguration
   {
-    StdioType Type;
-    int FileDescriptor;
+    StdioType Type = None;
+    int FileDescriptor = -1;
   };
 
   struct ProcessConfiguration

+ 2 - 5
Source/cmake.cxx

@@ -27,7 +27,6 @@
 #include "cmsys/Glob.hxx"
 #include "cmsys/RegularExpression.hxx"
 
-#include "cm_fileno.hxx"
 #include "cm_sys_stat.h"
 
 #include "cmBuildOptions.h"
@@ -3934,10 +3933,8 @@ std::function<int()> cmake::BuildWorkflowStep(
 {
   cmUVProcessChainBuilder builder;
   builder.AddCommand(args)
-    .SetExternalStream(cmUVProcessChainBuilder::Stream_OUTPUT,
-                       cm_fileno(stdout))
-    .SetExternalStream(cmUVProcessChainBuilder::Stream_ERROR,
-                       cm_fileno(stderr));
+    .SetExternalStream(cmUVProcessChainBuilder::Stream_OUTPUT, stdout)
+    .SetExternalStream(cmUVProcessChainBuilder::Stream_ERROR, stderr);
   return [builder]() -> int {
     auto chain = builder.Start();
     chain.Wait();

+ 2 - 7
Source/cmcmd.cxx

@@ -11,8 +11,6 @@
 #include <cm3p/uv.h>
 #include <fcntl.h>
 
-#include "cm_fileno.hxx"
-
 #include "cmCommandLineArgument.h"
 #include "cmConsoleBuf.h"
 #include "cmCryptoHash.h"
@@ -1917,11 +1915,8 @@ int cmcmd::ExecuteLinkScript(std::vector<std::string> const& args)
     cmUVProcessChainBuilder builder;
 
     // Children should share stdout and stderr with this process.
-    builder
-      .SetExternalStream(cmUVProcessChainBuilder::Stream_OUTPUT,
-                         cm_fileno(stdout))
-      .SetExternalStream(cmUVProcessChainBuilder::Stream_ERROR,
-                         cm_fileno(stderr));
+    builder.SetExternalStream(cmUVProcessChainBuilder::Stream_OUTPUT, stdout)
+      .SetExternalStream(cmUVProcessChainBuilder::Stream_ERROR, stderr);
 
     // Setup this command line.
     std::vector<std::string> args2;

+ 1 - 4
Tests/CMakeLib/testUVProcessChain.cxx

@@ -12,8 +12,6 @@
 
 #include <cm3p/uv.h>
 
-#include "cm_fileno.hxx"
-
 #include "cmGetPipes.h"
 #include "cmStringAlgorithms.h"
 #include "cmUVHandlePtr.h"
@@ -641,8 +639,7 @@ bool testUVProcessChainInputFile(const char* helperCommand)
 
   cmUVProcessChainBuilder builder;
   builder.AddCommand({ helperCommand, "dedup" })
-    .SetExternalStream(cmUVProcessChainBuilder::Stream_INPUT,
-                       cm_fileno(f.get()))
+    .SetExternalStream(cmUVProcessChainBuilder::Stream_INPUT, f.get())
     .SetBuiltinStream(cmUVProcessChainBuilder::Stream_OUTPUT);
 
   auto chain = builder.Start();

+ 4 - 0
Tests/CMakeLib/testUVProcessChainHelper.cxx

@@ -9,6 +9,10 @@
 
 #include "cmSystemTools.h"
 
+#ifdef _WIN32
+#  include <windows.h>
+#endif
+
 static std::string getStdin()
 {
   char buffer[1024];