mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-06 21:59:54 -06:00
cmcmd: Replace cmsysProcess with cmUVProcessChain
This commit is contained in:
@@ -11,6 +11,8 @@
|
||||
#include <cm3p/uv.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "cm_fileno.hxx"
|
||||
|
||||
#include "cmCommandLineArgument.h"
|
||||
#include "cmConsoleBuf.h"
|
||||
#include "cmCryptoHash.h"
|
||||
@@ -28,7 +30,6 @@
|
||||
#include "cmStringAlgorithms.h"
|
||||
#include "cmSystemTools.h"
|
||||
#include "cmTransformDepfile.h"
|
||||
#include "cmUVHandlePtr.h"
|
||||
#include "cmUVProcessChain.h"
|
||||
#include "cmUVStream.h"
|
||||
#include "cmUtils.hxx"
|
||||
@@ -73,7 +74,6 @@
|
||||
|
||||
#include "cmsys/Directory.hxx"
|
||||
#include "cmsys/FStream.hxx"
|
||||
#include "cmsys/Process.h"
|
||||
#include "cmsys/RegularExpression.hxx"
|
||||
#include "cmsys/Terminal.h"
|
||||
|
||||
@@ -319,7 +319,7 @@ int CLCompileAndDependencies(const std::vector<std::string>& args)
|
||||
} else if (subStatus.TermSignal != 0) {
|
||||
status = 1;
|
||||
} else {
|
||||
status = subStatus.ExitStatus;
|
||||
status = static_cast<int>(subStatus.ExitStatus);
|
||||
}
|
||||
|
||||
if (status != 0) {
|
||||
@@ -1883,21 +1883,6 @@ int cmcmd::ExecuteLinkScript(std::vector<std::string> const& args)
|
||||
}
|
||||
}
|
||||
|
||||
// Allocate a process instance.
|
||||
cmsysProcess* cp = cmsysProcess_New();
|
||||
if (!cp) {
|
||||
std::cerr << "Error allocating process instance in link script."
|
||||
<< std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Children should share stdout and stderr with this process.
|
||||
cmsysProcess_SetPipeShared(cp, cmsysProcess_Pipe_STDOUT, 1);
|
||||
cmsysProcess_SetPipeShared(cp, cmsysProcess_Pipe_STDERR, 1);
|
||||
|
||||
// Run the command lines verbatim.
|
||||
cmsysProcess_SetOption(cp, cmsysProcess_Option_Verbatim, 1);
|
||||
|
||||
// Read command lines from the script.
|
||||
cmsys::ifstream fin(args[2].c_str());
|
||||
if (!fin) {
|
||||
@@ -1915,9 +1900,24 @@ int cmcmd::ExecuteLinkScript(std::vector<std::string> const& args)
|
||||
continue;
|
||||
}
|
||||
|
||||
// Allocate a process instance.
|
||||
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));
|
||||
|
||||
// Setup this command line.
|
||||
const char* cmd[2] = { command.c_str(), nullptr };
|
||||
cmsysProcess_SetCommand(cp, cmd);
|
||||
std::vector<std::string> args2;
|
||||
#ifdef _WIN32
|
||||
cmSystemTools::ParseWindowsCommandLine(command.c_str(), args2);
|
||||
#else
|
||||
cmSystemTools::ParseUnixCommandLine(command.c_str(), args2);
|
||||
#endif
|
||||
builder.AddCommand(args2);
|
||||
|
||||
// Report the command if verbose output is enabled.
|
||||
if (verbose) {
|
||||
@@ -1925,35 +1925,29 @@ int cmcmd::ExecuteLinkScript(std::vector<std::string> const& args)
|
||||
}
|
||||
|
||||
// Run the command and wait for it to exit.
|
||||
cmsysProcess_Execute(cp);
|
||||
cmsysProcess_WaitForExit(cp, nullptr);
|
||||
auto chain = builder.Start();
|
||||
chain.Wait();
|
||||
|
||||
// Report failure if any.
|
||||
switch (cmsysProcess_GetState(cp)) {
|
||||
case cmsysProcess_State_Exited: {
|
||||
int value = cmsysProcess_GetExitValue(cp);
|
||||
if (value != 0) {
|
||||
result = value;
|
||||
auto const& status = chain.GetStatus(0);
|
||||
auto exception = status.GetException();
|
||||
switch (exception.first) {
|
||||
case cmUVProcessChain::ExceptionCode::None:
|
||||
if (status.ExitStatus != 0) {
|
||||
result = static_cast<int>(status.ExitStatus);
|
||||
}
|
||||
} break;
|
||||
case cmsysProcess_State_Exception:
|
||||
std::cerr << "Error running link command: "
|
||||
<< cmsysProcess_GetExceptionString(cp) << std::endl;
|
||||
result = 1;
|
||||
break;
|
||||
case cmsysProcess_State_Error:
|
||||
std::cerr << "Error running link command: "
|
||||
<< cmsysProcess_GetErrorString(cp) << std::endl;
|
||||
case cmUVProcessChain::ExceptionCode::Spawn:
|
||||
std::cerr << "Error running link command: " << exception.second;
|
||||
result = 2;
|
||||
break;
|
||||
default:
|
||||
std::cerr << "Error running link command: " << exception.second;
|
||||
result = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Free the process instance.
|
||||
cmsysProcess_Delete(cp);
|
||||
|
||||
// Return the final resulting return value.
|
||||
return result;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user