summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2024-01-25 15:39:50 (GMT)
committerKitware Robot <kwrobot@kitware.com>2024-01-25 15:40:00 (GMT)
commit23747f705602cbc47672c6db6716afbe8b5b013e (patch)
treec17021aedf9c521d0540dc55cdbf07f3ade44e8f
parent30c067e24ad437e8b71ad5373032265c6dbbe299 (diff)
parentadb3e13d323aeb19c3824112cfa712cc122db3b4 (diff)
downloadCMake-23747f705602cbc47672c6db6716afbe8b5b013e.zip
CMake-23747f705602cbc47672c6db6716afbe8b5b013e.tar.gz
CMake-23747f705602cbc47672c6db6716afbe8b5b013e.tar.bz2
Merge topic 'cmuvprocesschain' into release-3.28
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 <kwrobot@kitware.com> Merge-request: !9181
-rw-r--r--Source/CTest/cmCTestCoverageHandler.cxx6
-rw-r--r--Source/CTest/cmCTestLaunch.cxx9
-rw-r--r--Source/cmExecuteProcessCommand.cxx13
-rw-r--r--Source/cmSystemTools.cxx12
-rw-r--r--Source/cmUVProcessChain.cxx19
-rw-r--r--Source/cmUVProcessChain.h6
-rw-r--r--Source/cmake.cxx7
-rw-r--r--Source/cmcmd.cxx9
-rw-r--r--Tests/CMakeLib/testUVProcessChain.cxx5
-rw-r--r--Tests/CMakeLib/testUVProcessChainHelper.cxx4
10 files changed, 38 insertions, 52 deletions
diff --git a/Source/CTest/cmCTestCoverageHandler.cxx b/Source/CTest/cmCTestCoverageHandler.cxx
index 1aa49cf..f9f9add 100644
--- a/Source/CTest/cmCTestCoverageHandler.cxx
+++ b/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();
diff --git a/Source/CTest/cmCTestLaunch.cxx b/Source/CTest/cmCTestLaunch.cxx
index 6b13ad1..9669d76 100644
--- a/Source/CTest/cmCTestLaunch.cxx
+++ b/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)
diff --git a/Source/cmExecuteProcessCommand.cxx b/Source/cmExecuteProcessCommand.cxx
index e764545..26b9424 100644
--- a/Source/cmExecuteProcessCommand.cxx
+++ b/Source/cmExecuteProcessCommand.cxx
@@ -18,8 +18,6 @@
#include <cm3p/uv.h>
-#include "cm_fileno.hxx"
-
#include "cmArgumentParser.h"
#include "cmExecutionStatus.h"
#include "cmList.h"
@@ -184,11 +182,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);
@@ -196,7 +193,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 &&
@@ -212,13 +209,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() ||
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index f606c22..1f5333f 100644
--- a/Source/cmSystemTools.cxx
+++ b/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();
diff --git a/Source/cmUVProcessChain.cxx b/Source/cmUVProcessChain.cxx
index 655e52a..cd452cb 100644
--- a/Source/cmUVProcessChain.cxx
+++ b/Source/cmUVProcessChain.cxx
@@ -12,6 +12,8 @@
#include <cm3p/uv.h>
+#include "cm_fileno.hxx"
+
#include "cmGetPipes.h"
#include "cmUVHandlePtr.h"
@@ -57,12 +59,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)
@@ -122,6 +119,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;
diff --git a/Source/cmUVProcessChain.h b/Source/cmUVProcessChain.h
index 0f37e7d..aa63ba1 100644
--- a/Source/cmUVProcessChain.h
+++ b/Source/cmUVProcessChain.h
@@ -7,6 +7,7 @@
#include <array>
#include <cstddef> // IWYU pragma: keep
#include <cstdint>
+#include <cstdio>
#include <memory>
#include <string>
#include <utility>
@@ -34,6 +35,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);
cmUVProcessChain Start() const;
@@ -50,8 +52,8 @@ private:
struct StdioConfiguration
{
- StdioType Type;
- int FileDescriptor;
+ StdioType Type = None;
+ int FileDescriptor = -1;
};
struct ProcessConfiguration
diff --git a/Source/cmake.cxx b/Source/cmake.cxx
index f54196b..636a0da 100644
--- a/Source/cmake.cxx
+++ b/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"
@@ -3916,10 +3915,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();
diff --git a/Source/cmcmd.cxx b/Source/cmcmd.cxx
index 43a945f..5bf8edc 100644
--- a/Source/cmcmd.cxx
+++ b/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"
@@ -1903,11 +1901,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;
diff --git a/Tests/CMakeLib/testUVProcessChain.cxx b/Tests/CMakeLib/testUVProcessChain.cxx
index aab084b..c6404ac 100644
--- a/Tests/CMakeLib/testUVProcessChain.cxx
+++ b/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"
@@ -632,8 +630,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();
diff --git a/Tests/CMakeLib/testUVProcessChainHelper.cxx b/Tests/CMakeLib/testUVProcessChainHelper.cxx
index b53cac4..1b4adb7 100644
--- a/Tests/CMakeLib/testUVProcessChainHelper.cxx
+++ b/Tests/CMakeLib/testUVProcessChainHelper.cxx
@@ -9,6 +9,10 @@
#include "cmSystemTools.h"
+#ifdef _WIN32
+# include <windows.h>
+#endif
+
static std::string getStdin()
{
char buffer[1024];