summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/cmBinUtilsLinuxELFObjdumpGetRuntimeDependenciesTool.cxx5
-rw-r--r--Source/cmBinUtilsMacOSMachOOToolGetRuntimeDependenciesTool.cxx5
-rw-r--r--Source/cmBinUtilsWindowsPEDumpbinGetRuntimeDependenciesTool.cxx5
-rw-r--r--Source/cmBinUtilsWindowsPEObjdumpGetRuntimeDependenciesTool.cxx5
-rw-r--r--Source/cmLDConfigLDConfigTool.cxx5
-rw-r--r--Source/cmUVProcessChain.cxx61
-rw-r--r--Source/cmUVProcessChain.h5
-rw-r--r--Source/cmake.cxx2
-rw-r--r--Source/cmcmd.cxx10
9 files changed, 47 insertions, 56 deletions
diff --git a/Source/cmBinUtilsLinuxELFObjdumpGetRuntimeDependenciesTool.cxx b/Source/cmBinUtilsLinuxELFObjdumpGetRuntimeDependenciesTool.cxx
index 566e4a4..c5c41e0 100644
--- a/Source/cmBinUtilsLinuxELFObjdumpGetRuntimeDependenciesTool.cxx
+++ b/Source/cmBinUtilsLinuxELFObjdumpGetRuntimeDependenciesTool.cxx
@@ -35,7 +35,7 @@ bool cmBinUtilsLinuxELFObjdumpGetRuntimeDependenciesTool::GetFileInfo(
builder.AddCommand(command);
auto process = builder.Start();
- if (!process.Valid()) {
+ if (!process.Valid() || process.GetStatus(0).SpawnResult != 0) {
std::ostringstream e;
e << "Failed to start objdump process for:\n " << file;
this->SetError(e.str());
@@ -73,8 +73,7 @@ bool cmBinUtilsLinuxELFObjdumpGetRuntimeDependenciesTool::GetFileInfo(
this->SetError(e.str());
return false;
}
- auto status = process.GetStatus();
- if (!status[0] || status[0]->ExitStatus != 0) {
+ if (process.GetStatus(0).ExitStatus != 0) {
std::ostringstream e;
e << "Failed to run objdump on:\n " << file;
this->SetError(e.str());
diff --git a/Source/cmBinUtilsMacOSMachOOToolGetRuntimeDependenciesTool.cxx b/Source/cmBinUtilsMacOSMachOOToolGetRuntimeDependenciesTool.cxx
index 6d97720..cf4a8fe 100644
--- a/Source/cmBinUtilsMacOSMachOOToolGetRuntimeDependenciesTool.cxx
+++ b/Source/cmBinUtilsMacOSMachOOToolGetRuntimeDependenciesTool.cxx
@@ -34,7 +34,7 @@ bool cmBinUtilsMacOSMachOOToolGetRuntimeDependenciesTool::GetFileInfo(
.AddCommand(command);
auto process = builder.Start();
- if (!process.Valid()) {
+ if (!process.Valid() || process.GetStatus(0).SpawnResult != 0) {
std::ostringstream e;
e << "Failed to start otool process for:\n " << file;
this->SetError(e.str());
@@ -88,8 +88,7 @@ bool cmBinUtilsMacOSMachOOToolGetRuntimeDependenciesTool::GetFileInfo(
this->SetError(e.str());
return false;
}
- auto status = process.GetStatus();
- if (!status[0] || status[0]->ExitStatus != 0) {
+ if (process.GetStatus(0).ExitStatus != 0) {
std::ostringstream e;
e << "Failed to run otool on:\n " << file;
this->SetError(e.str());
diff --git a/Source/cmBinUtilsWindowsPEDumpbinGetRuntimeDependenciesTool.cxx b/Source/cmBinUtilsWindowsPEDumpbinGetRuntimeDependenciesTool.cxx
index f342884..3b02c2e 100644
--- a/Source/cmBinUtilsWindowsPEDumpbinGetRuntimeDependenciesTool.cxx
+++ b/Source/cmBinUtilsWindowsPEDumpbinGetRuntimeDependenciesTool.cxx
@@ -33,7 +33,7 @@ bool cmBinUtilsWindowsPEDumpbinGetRuntimeDependenciesTool::GetFileInfo(
builder.AddCommand(command);
auto process = builder.Start();
- if (!process.Valid()) {
+ if (!process.Valid() || process.GetStatus(0).SpawnResult != 0) {
std::ostringstream e;
e << "Failed to start dumpbin process for:\n " << file;
this->SetError(e.str());
@@ -56,8 +56,7 @@ bool cmBinUtilsWindowsPEDumpbinGetRuntimeDependenciesTool::GetFileInfo(
this->SetError(e.str());
return false;
}
- auto status = process.GetStatus();
- if (!status[0] || status[0]->ExitStatus != 0) {
+ if (process.GetStatus(0).ExitStatus != 0) {
std::ostringstream e;
e << "Failed to run dumpbin on:\n " << file;
this->SetError(e.str());
diff --git a/Source/cmBinUtilsWindowsPEObjdumpGetRuntimeDependenciesTool.cxx b/Source/cmBinUtilsWindowsPEObjdumpGetRuntimeDependenciesTool.cxx
index f14de55..2139b4b 100644
--- a/Source/cmBinUtilsWindowsPEObjdumpGetRuntimeDependenciesTool.cxx
+++ b/Source/cmBinUtilsWindowsPEObjdumpGetRuntimeDependenciesTool.cxx
@@ -34,7 +34,7 @@ bool cmBinUtilsWindowsPEObjdumpGetRuntimeDependenciesTool::GetFileInfo(
builder.AddCommand(command);
auto process = builder.Start();
- if (!process.Valid()) {
+ if (!process.Valid() || process.GetStatus(0).SpawnResult != 0) {
std::ostringstream e;
e << "Failed to start objdump process for:\n " << file;
this->SetError(e.str());
@@ -57,8 +57,7 @@ bool cmBinUtilsWindowsPEObjdumpGetRuntimeDependenciesTool::GetFileInfo(
this->SetError(e.str());
return false;
}
- auto status = process.GetStatus();
- if (!status[0] || status[0]->ExitStatus != 0) {
+ if (process.GetStatus(0).ExitStatus != 0) {
std::ostringstream e;
e << "Failed to run objdump on:\n " << file;
this->SetError(e.str());
diff --git a/Source/cmLDConfigLDConfigTool.cxx b/Source/cmLDConfigLDConfigTool.cxx
index 0752b33..7ce1a59 100644
--- a/Source/cmLDConfigLDConfigTool.cxx
+++ b/Source/cmLDConfigLDConfigTool.cxx
@@ -43,7 +43,7 @@ bool cmLDConfigLDConfigTool::GetLDConfigPaths(std::vector<std::string>& paths)
builder.SetBuiltinStream(cmUVProcessChainBuilder::Stream_OUTPUT)
.AddCommand(ldConfigCommand);
auto process = builder.Start();
- if (!process.Valid()) {
+ if (!process.Valid() || process.GetStatus(0).SpawnResult != 0) {
this->Archive->SetError("Failed to start ldconfig process");
return false;
}
@@ -61,8 +61,7 @@ bool cmLDConfigLDConfigTool::GetLDConfigPaths(std::vector<std::string>& paths)
this->Archive->SetError("Failed to wait on ldconfig process");
return false;
}
- auto status = process.GetStatus();
- if (!status[0] || status[0]->ExitStatus != 0) {
+ if (process.GetStatus(0).ExitStatus != 0) {
this->Archive->SetError("Failed to run ldconfig");
return false;
}
diff --git a/Source/cmUVProcessChain.cxx b/Source/cmUVProcessChain.cxx
index 6517e60..a9e57e6 100644
--- a/Source/cmUVProcessChain.cxx
+++ b/Source/cmUVProcessChain.cxx
@@ -53,8 +53,9 @@ struct cmUVProcessChain::InternalData
cm::uv_process_ptr Process;
cm::uv_pipe_ptr InputPipe;
cm::uv_pipe_ptr OutputPipe;
- bool Finished = false;
Status ProcessStatus;
+
+ void Finish();
};
const cmUVProcessChainBuilder* Builder = nullptr;
@@ -72,13 +73,11 @@ struct cmUVProcessChain::InternalData
std::vector<std::unique_ptr<ProcessData>> Processes;
bool Prepare(const cmUVProcessChainBuilder* builder);
- bool SpawnProcess(
+ void SpawnProcess(
std::size_t index,
const cmUVProcessChainBuilder::ProcessConfiguration& config, bool first,
bool last);
void Finish();
-
- static const Status* GetStatus(const ProcessData& data);
};
cmUVProcessChainBuilder::cmUVProcessChainBuilder()
@@ -171,10 +170,8 @@ cmUVProcessChain cmUVProcessChainBuilder::Start() const
}
for (std::size_t i = 0; i < this->Processes.size(); i++) {
- if (!chain.Data->SpawnProcess(i, this->Processes[i], i == 0,
- i == this->Processes.size() - 1)) {
- return chain;
- }
+ chain.Data->SpawnProcess(i, this->Processes[i], i == 0,
+ i == this->Processes.size() - 1);
}
chain.Data->Finish();
@@ -182,15 +179,6 @@ cmUVProcessChain cmUVProcessChainBuilder::Start() const
return chain;
}
-const cmUVProcessChain::Status* cmUVProcessChain::InternalData::GetStatus(
- const cmUVProcessChain::InternalData::ProcessData& data)
-{
- if (data.Finished) {
- return &data.ProcessStatus;
- }
- return nullptr;
-}
-
bool cmUVProcessChain::InternalData::Prepare(
const cmUVProcessChainBuilder* builder)
{
@@ -285,6 +273,7 @@ bool cmUVProcessChain::InternalData::Prepare(
this->Processes.emplace_back(cm::make_unique<ProcessData>());
auto& process = *this->Processes.back();
process.Data = this;
+ process.ProcessStatus.Finished = false;
if (!first) {
auto& prevProcess = *this->Processes[i - 1];
@@ -314,7 +303,7 @@ bool cmUVProcessChain::InternalData::Prepare(
return true;
}
-bool cmUVProcessChain::InternalData::SpawnProcess(
+void cmUVProcessChain::InternalData::SpawnProcess(
std::size_t index,
const cmUVProcessChainBuilder::ProcessConfiguration& config, bool first,
bool last)
@@ -360,16 +349,17 @@ bool cmUVProcessChain::InternalData::SpawnProcess(
options.exit_cb = [](uv_process_t* handle, int64_t exitStatus,
int termSignal) {
auto* processData = static_cast<ProcessData*>(handle->data);
- processData->Finished = true;
processData->ProcessStatus.ExitStatus = exitStatus;
processData->ProcessStatus.TermSignal = termSignal;
- processData->Data->ProcessesCompleted++;
+ processData->Finish();
};
- bool result = process.Process.spawn(*this->Loop, options, &process) >= 0;
+ if ((process.ProcessStatus.SpawnResult =
+ process.Process.spawn(*this->Loop, options, &process)) < 0) {
+ process.Finish();
+ }
process.InputPipe.reset();
process.OutputPipe.reset();
- return result;
}
void cmUVProcessChain::InternalData::Finish()
@@ -451,19 +441,15 @@ std::vector<const cmUVProcessChain::Status*> cmUVProcessChain::GetStatus()
std::vector<const cmUVProcessChain::Status*> statuses(
this->Data->Processes.size(), nullptr);
for (std::size_t i = 0; i < statuses.size(); i++) {
- statuses[i] = this->GetStatus(i);
+ statuses[i] = &this->GetStatus(i);
}
return statuses;
}
-const cmUVProcessChain::Status* cmUVProcessChain::GetStatus(
+const cmUVProcessChain::Status& cmUVProcessChain::GetStatus(
std::size_t index) const
{
- auto const& process = *this->Data->Processes[index];
- if (process.Finished) {
- return &process.ProcessStatus;
- }
- return nullptr;
+ return this->Data->Processes[index]->ProcessStatus;
}
bool cmUVProcessChain::Finished() const
@@ -474,8 +460,12 @@ bool cmUVProcessChain::Finished() const
std::pair<cmUVProcessChain::ExceptionCode, std::string>
cmUVProcessChain::Status::GetException() const
{
+ if (this->SpawnResult) {
+ return std::make_pair(ExceptionCode::Spawn,
+ uv_strerror(this->SpawnResult));
+ }
#ifdef _WIN32
- if ((this->ExitStatus & 0xF0000000) == 0xC0000000) {
+ if (this->Finished && (this->ExitStatus & 0xF0000000) == 0xC0000000) {
// Child terminated due to exceptional behavior.
switch (this->ExitStatus) {
case STATUS_CONTROL_C_EXIT:
@@ -550,9 +540,8 @@ cmUVProcessChain::Status::GetException() const
}
}
}
- return std::make_pair(ExceptionCode::None, "");
#else
- if (this->TermSignal) {
+ if (this->Finished && this->TermSignal) {
switch (this->TermSignal) {
# ifdef SIGSEGV
case SIGSEGV:
@@ -709,6 +698,12 @@ cmUVProcessChain::Status::GetException() const
}
}
}
- return std::make_pair(ExceptionCode::None, "");
#endif
+ return std::make_pair(ExceptionCode::None, "");
+}
+
+void cmUVProcessChain::InternalData::ProcessData::Finish()
+{
+ this->ProcessStatus.Finished = true;
+ this->Data->ProcessesCompleted++;
}
diff --git a/Source/cmUVProcessChain.h b/Source/cmUVProcessChain.h
index f92742f..547a944 100644
--- a/Source/cmUVProcessChain.h
+++ b/Source/cmUVProcessChain.h
@@ -74,11 +74,14 @@ public:
Illegal,
Interrupt,
Numerical,
+ Spawn,
Other,
};
struct Status
{
+ int SpawnResult;
+ bool Finished;
int64_t ExitStatus;
int TermSignal;
@@ -102,7 +105,7 @@ public:
bool Valid() const;
bool Wait(int64_t milliseconds = -1);
std::vector<const Status*> GetStatus() const;
- const Status* GetStatus(std::size_t index) const;
+ const Status& GetStatus(std::size_t index) const;
bool Finished() const;
private:
diff --git a/Source/cmake.cxx b/Source/cmake.cxx
index f30d4d3..791569c 100644
--- a/Source/cmake.cxx
+++ b/Source/cmake.cxx
@@ -3916,7 +3916,7 @@ std::function<int()> cmake::BuildWorkflowStep(
return [builder]() -> int {
auto chain = builder.Start();
chain.Wait();
- return static_cast<int>(chain.GetStatus().front()->ExitStatus);
+ return static_cast<int>(chain.GetStatus(0).ExitStatus);
};
}
#endif
diff --git a/Source/cmcmd.cxx b/Source/cmcmd.cxx
index 9929e85..1bbd0ac 100644
--- a/Source/cmcmd.cxx
+++ b/Source/cmcmd.cxx
@@ -2008,7 +2008,7 @@ int cmcmd::RunPreprocessor(const std::vector<std::string>& command,
.SetBuiltinStream(cmUVProcessChainBuilder::Stream_ERROR)
.AddCommand(command);
auto process = builder.Start();
- if (!process.Valid()) {
+ if (!process.Valid() || process.GetStatus(0).SpawnResult != 0) {
std::cerr << "Failed to start preprocessor.";
return 1;
}
@@ -2016,8 +2016,7 @@ int cmcmd::RunPreprocessor(const std::vector<std::string>& command,
std::cerr << "Failed to wait for preprocessor";
return 1;
}
- auto status = process.GetStatus();
- if (!status[0] || status[0]->ExitStatus != 0) {
+ if (process.GetStatus(0).ExitStatus != 0) {
auto* errorStream = process.ErrorStream();
if (errorStream) {
std::cerr << errorStream->rdbuf();
@@ -2130,7 +2129,7 @@ int cmcmd::RunLLVMRC(std::vector<std::string> const& args)
.AddCommand(resource_compile);
auto process = builder.Start();
result = 0;
- if (!process.Valid()) {
+ if (!process.Valid() || process.GetStatus(0).SpawnResult != 0) {
std::cerr << "Failed to start resource compiler.";
result = 1;
} else {
@@ -2144,8 +2143,7 @@ int cmcmd::RunLLVMRC(std::vector<std::string> const& args)
if (result != 0) {
return result;
}
- auto status = process.GetStatus();
- if (!status[0] || status[0]->ExitStatus != 0) {
+ if (process.GetStatus(0).ExitStatus != 0) {
auto* errorStream = process.ErrorStream();
if (errorStream) {
std::cerr << errorStream->rdbuf();