diff --git a/Source/cmake.cxx b/Source/cmake.cxx index 65a5ad463b..775b04b962 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -4174,19 +4174,23 @@ T const* cmake::FindPresetForWorkflow( return &*it->second.Expanded; } -std::function cmake::BuildWorkflowStep( +namespace { + +std::function buildWorkflowStep( std::vector const& args) { cmUVProcessChainBuilder builder; builder.AddCommand(args) .SetExternalStream(cmUVProcessChainBuilder::Stream_OUTPUT, stdout) .SetExternalStream(cmUVProcessChainBuilder::Stream_ERROR, stderr); - return [builder]() -> int { + return [builder]() -> cmUVProcessChain::Status { auto chain = builder.Start(); chain.Wait(); - return static_cast(chain.GetStatus(0).ExitStatus); + return chain.GetStatus(0); }; } + +} #endif int cmake::Workflow(std::string const& presetName, @@ -4248,10 +4252,11 @@ int cmake::Workflow(std::string const& presetName, int StepNumber; cm::static_string_view Type; std::string Name; - std::function Action; + std::function Action; CalculatedStep(int stepNumber, cm::static_string_view type, - std::string name, std::function action) + std::string name, + std::function action) : StepNumber(stepNumber) , Type(type) , Name(std::move(name)) @@ -4278,7 +4283,7 @@ int cmake::Workflow(std::string const& presetName, args.emplace_back("--fresh"); } steps.emplace_back(stepNumber, "configure"_s, step.PresetName, - this->BuildWorkflowStep(args)); + buildWorkflowStep(args)); } break; case cmCMakePresetsGraph::WorkflowPreset::WorkflowStep::Type::Build: { auto const* buildPreset = this->FindPresetForWorkflow( @@ -4288,8 +4293,8 @@ int cmake::Workflow(std::string const& presetName, } steps.emplace_back( stepNumber, "build"_s, step.PresetName, - this->BuildWorkflowStep({ cmSystemTools::GetCMakeCommand(), - "--build", "--preset", step.PresetName })); + buildWorkflowStep({ cmSystemTools::GetCMakeCommand(), "--build", + "--preset", step.PresetName })); } break; case cmCMakePresetsGraph::WorkflowPreset::WorkflowStep::Type::Test: { auto const* testPreset = this->FindPresetForWorkflow( @@ -4299,8 +4304,8 @@ int cmake::Workflow(std::string const& presetName, } steps.emplace_back( stepNumber, "test"_s, step.PresetName, - this->BuildWorkflowStep({ cmSystemTools::GetCTestCommand(), - "--preset", step.PresetName })); + buildWorkflowStep({ cmSystemTools::GetCTestCommand(), "--preset", + step.PresetName })); } break; case cmCMakePresetsGraph::WorkflowPreset::WorkflowStep::Type::Package: { auto const* packagePreset = this->FindPresetForWorkflow( @@ -4310,14 +4315,13 @@ int cmake::Workflow(std::string const& presetName, } steps.emplace_back( stepNumber, "package"_s, step.PresetName, - this->BuildWorkflowStep({ cmSystemTools::GetCPackCommand(), - "--preset", step.PresetName })); + buildWorkflowStep({ cmSystemTools::GetCPackCommand(), "--preset", + step.PresetName })); } break; } stepNumber++; } - int stepResult; bool first = true; for (auto const& step : steps) { if (!first) { @@ -4327,8 +4331,15 @@ int cmake::Workflow(std::string const& presetName, << steps.size() << ": " << step.Type << " preset \"" << step.Name << "\"\n\n" << std::flush; - if ((stepResult = step.Action()) != 0) { - return stepResult; + cmUVProcessChain::Status const status = step.Action(); + if (status.ExitStatus != 0) { + return static_cast(status.ExitStatus); + } + auto const codeReasonPair = status.GetException(); + if (codeReasonPair.first != cmUVProcessChain::ExceptionCode::None) { + std::cout << "Step command ended abnormally: " << codeReasonPair.second + << std::endl; + return status.SpawnResult != 0 ? status.SpawnResult : status.TermSignal; } first = false; } diff --git a/Source/cmake.h b/Source/cmake.h index b2f706205a..2e754d8f83 100644 --- a/Source/cmake.h +++ b/Source/cmake.h @@ -910,8 +910,6 @@ private: cm::static_string_view type, std::map> const& presets, cmCMakePresetsGraph::WorkflowPreset::WorkflowStep const& step); - - std::function BuildWorkflowStep(std::vector const& args); #endif #if !defined(CMAKE_BOOTSTRAP)