diff options
author | Brad King <brad.king@kitware.com> | 2024-01-25 15:39:50 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2024-01-25 15:40:00 (GMT) |
commit | 23747f705602cbc47672c6db6716afbe8b5b013e (patch) | |
tree | c17021aedf9c521d0540dc55cdbf07f3ade44e8f | |
parent | 30c067e24ad437e8b71ad5373032265c6dbbe299 (diff) | |
parent | adb3e13d323aeb19c3824112cfa712cc122db3b4 (diff) | |
download | CMake-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.cxx | 6 | ||||
-rw-r--r-- | Source/CTest/cmCTestLaunch.cxx | 9 | ||||
-rw-r--r-- | Source/cmExecuteProcessCommand.cxx | 13 | ||||
-rw-r--r-- | Source/cmSystemTools.cxx | 12 | ||||
-rw-r--r-- | Source/cmUVProcessChain.cxx | 19 | ||||
-rw-r--r-- | Source/cmUVProcessChain.h | 6 | ||||
-rw-r--r-- | Source/cmake.cxx | 7 | ||||
-rw-r--r-- | Source/cmcmd.cxx | 9 | ||||
-rw-r--r-- | Tests/CMakeLib/testUVProcessChain.cxx | 5 | ||||
-rw-r--r-- | Tests/CMakeLib/testUVProcessChainHelper.cxx | 4 |
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]; |