浏览代码

try_run: Do not require unrequested stdout/stderr when cross-compiling

Since commit 048a02d5bb (ConfigureLog: Log try_compile and try_run
checks, 2022-11-23) we always capture the stdout/stderr for logging.
When cross-compiling, do not require `__TRYRUN_OUTPUT_STD{OUT,ERR}`
variables to be populated just for the logging.
Brad King 2 年之前
父节点
当前提交
0191e8b512
共有 1 个文件被更改,包括 10 次插入4 次删除
  1. 10 4
      Source/cmTryRunCommand.cxx

+ 10 - 4
Source/cmTryRunCommand.cxx

@@ -90,7 +90,8 @@ public:
                           std::string const& compileResultVariable,
                           std::string* runOutputContents,
                           std::string* runOutputStdOutContents,
-                          std::string* runOutputStdErrContents);
+                          std::string* runOutputStdErrContents,
+                          bool stdOutErrRequired);
 
   bool NoCache;
   std::string RunResultVariable;
@@ -185,12 +186,17 @@ bool TryRunCommandImpl::TryRunCode(std::vector<std::string> const& argv)
       std::string runOutputStdErrContents;
       if (this->Makefile->IsOn("CMAKE_CROSSCOMPILING") &&
           !this->Makefile->IsDefinitionSet("CMAKE_CROSSCOMPILING_EMULATOR")) {
+        // We only require the stdout/stderr cache entries if the project
+        // actually asked for the values, not just for logging.
+        bool const stdOutErrRequired = (arguments.RunOutputStdOutVariable ||
+                                        arguments.RunOutputStdErrVariable);
         this->DoNotRunExecutable(
           runArgs, *arguments.SourceDirectoryOrFile,
           *arguments.CompileResultVariable,
           captureRunOutput ? &runOutputContents : nullptr,
           captureRunOutputStdOutErr ? &runOutputStdOutContents : nullptr,
-          captureRunOutputStdOutErr ? &runOutputStdErrContents : nullptr);
+          captureRunOutputStdOutErr ? &runOutputStdErrContents : nullptr,
+          stdOutErrRequired);
       } else {
         this->RunExecutable(
           runArgs, arguments.RunWorkingDirectory,
@@ -311,7 +317,7 @@ void TryRunCommandImpl::RunExecutable(const std::string& runArgs,
 void TryRunCommandImpl::DoNotRunExecutable(
   const std::string& runArgs, const std::string& srcFile,
   std::string const& compileResultVariable, std::string* out,
-  std::string* stdOut, std::string* stdErr)
+  std::string* stdOut, std::string* stdErr, bool stdOutErrRequired)
 {
   // copy the executable out of the CMakeFiles/ directory, so it is not
   // removed at the end of try_run() and the user can run it manually
@@ -357,7 +363,7 @@ void TryRunCommandImpl::DoNotRunExecutable(
   }
 
   // is the output from the executable used ?
-  if (stdOut || stdErr) {
+  if (stdOutErrRequired) {
     if (!this->Makefile->GetDefinition(internalRunOutputStdOutName)) {
       // if the variables doesn't exist, create it with a helpful error text
       // and mark it as advanced