From 38ee29a66af1956b08a881a6ee610fae3455fca8 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 24 Nov 2025 21:05:14 -0500 Subject: [PATCH] cmUVProcessChain: Build stdout before stderr This is more intuitive in the case of merged streams. --- Source/cmUVProcessChain.cxx | 87 ++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 44 deletions(-) diff --git a/Source/cmUVProcessChain.cxx b/Source/cmUVProcessChain.cxx index 2462dabfc2..d0e97ed253 100644 --- a/Source/cmUVProcessChain.cxx +++ b/Source/cmUVProcessChain.cxx @@ -219,6 +219,38 @@ bool cmUVProcessChain::InternalData::Prepare( break; } + auto const& output = + this->Builder->Stdio[cmUVProcessChainBuilder::Stream_OUTPUT]; + auto& outputData = this->OutputStreamData; + switch (output.Type) { + case cmUVProcessChainBuilder::None: + outputData.Stdio.flags = UV_IGNORE; + break; + + case cmUVProcessChainBuilder::Builtin: { + int pipeFd[2]; + if (cmGetPipes(pipeFd) < 0) { + return false; + } + + outputData.BuiltinStream = pipeFd[0]; + outputData.Stdio.flags = UV_INHERIT_FD; + outputData.Stdio.data.fd = pipeFd[1]; + + if (this->TempOutputPipe.init(*this->Loop, 0) < 0) { + return false; + } + if (uv_pipe_open(this->TempOutputPipe, outputData.Stdio.data.fd) < 0) { + return false; + } + } break; + + case cmUVProcessChainBuilder::External: + outputData.Stdio.flags = UV_INHERIT_FD; + outputData.Stdio.data.fd = output.FileDescriptor; + break; + } + auto const& error = this->Builder->Stdio[cmUVProcessChainBuilder::Stream_ERROR]; auto& errorData = this->ErrorStreamData; @@ -228,66 +260,33 @@ bool cmUVProcessChain::InternalData::Prepare( break; case cmUVProcessChainBuilder::Builtin: { - int pipeFd[2]; - if (cmGetPipes(pipeFd) < 0) { - return false; - } - - errorData.BuiltinStream = pipeFd[0]; - errorData.Stdio.flags = UV_INHERIT_FD; - errorData.Stdio.data.fd = pipeFd[1]; - - if (this->TempErrorPipe.init(*this->Loop, 0) < 0) { - return false; - } - if (uv_pipe_open(this->TempErrorPipe, errorData.Stdio.data.fd) < 0) { - return false; - } - - break; - } - - case cmUVProcessChainBuilder::External: - errorData.Stdio.flags = UV_INHERIT_FD; - errorData.Stdio.data.fd = error.FileDescriptor; - break; - } - - auto const& output = - this->Builder->Stdio[cmUVProcessChainBuilder::Stream_OUTPUT]; - auto& outputData = this->OutputStreamData; - switch (output.Type) { - case cmUVProcessChainBuilder::None: - outputData.Stdio.flags = UV_IGNORE; - break; - - case cmUVProcessChainBuilder::Builtin: if (this->Builder->MergedBuiltinStreams) { - outputData.BuiltinStream = errorData.BuiltinStream; - outputData.Stdio.flags = UV_INHERIT_FD; - outputData.Stdio.data.fd = errorData.Stdio.data.fd; + errorData.BuiltinStream = outputData.BuiltinStream; + errorData.Stdio.flags = UV_INHERIT_FD; + errorData.Stdio.data.fd = outputData.Stdio.data.fd; } else { int pipeFd[2]; if (cmGetPipes(pipeFd) < 0) { return false; } - outputData.BuiltinStream = pipeFd[0]; - outputData.Stdio.flags = UV_INHERIT_FD; - outputData.Stdio.data.fd = pipeFd[1]; + errorData.BuiltinStream = pipeFd[0]; + errorData.Stdio.flags = UV_INHERIT_FD; + errorData.Stdio.data.fd = pipeFd[1]; - if (this->TempOutputPipe.init(*this->Loop, 0) < 0) { + if (this->TempErrorPipe.init(*this->Loop, 0) < 0) { return false; } - if (uv_pipe_open(this->TempOutputPipe, outputData.Stdio.data.fd) < 0) { + if (uv_pipe_open(this->TempErrorPipe, errorData.Stdio.data.fd) < 0) { return false; } } break; + } case cmUVProcessChainBuilder::External: - outputData.Stdio.flags = UV_INHERIT_FD; - outputData.Stdio.data.fd = output.FileDescriptor; + errorData.Stdio.flags = UV_INHERIT_FD; + errorData.Stdio.data.fd = error.FileDescriptor; break; }