Explorar o código

Merge topic 'try_run-cross-compile' into release-3.25

2f85ec0a37 try_run: Avoid crash in keyword-dispatched signature when cross-compiling

Acked-by: Kitware Robot <[email protected]>
Acked-by: buildbot <[email protected]>
Merge-request: !8066
Brad King %!s(int64=2) %!d(string=hai) anos
pai
achega
e35255f2a5

+ 8 - 6
Source/cmTryRunCommand.cxx

@@ -40,7 +40,7 @@ public:
                      std::string* runOutputStdOutContents,
                      std::string* runOutputStdErrContents);
   void DoNotRunExecutable(const std::string& runArgs,
-                          const std::string& srcFile,
+                          cm::optional<std::string> const& srcFile,
                           std::string const& compileResultVariable,
                           std::string* runOutputContents,
                           std::string* runOutputStdOutContents,
@@ -128,7 +128,7 @@ bool TryRunCommandImpl::TryRunCode(std::vector<std::string> const& argv)
       if (this->Makefile->IsOn("CMAKE_CROSSCOMPILING") &&
           !this->Makefile->IsDefinitionSet("CMAKE_CROSSCOMPILING_EMULATOR")) {
         this->DoNotRunExecutable(
-          runArgs, *arguments.SourceDirectoryOrFile,
+          runArgs, arguments.SourceDirectoryOrFile,
           *arguments.CompileResultVariable,
           captureRunOutput ? &runOutputContents : nullptr,
           captureRunOutputStdOutErr && arguments.RunOutputStdOutVariable
@@ -238,7 +238,7 @@ void TryRunCommandImpl::RunExecutable(const std::string& runArgs,
  the executable would have produced.
 */
 void TryRunCommandImpl::DoNotRunExecutable(
-  const std::string& runArgs, const std::string& srcFile,
+  const std::string& runArgs, cm::optional<std::string> const& srcFile,
   std::string const& compileResultVariable, std::string* out,
   std::string* stdOut, std::string* stdErr)
 {
@@ -421,9 +421,11 @@ void TryRunCommandImpl::DoNotRunExecutable(
 
       comment += "The ";
       comment += compileResultVariable;
-      comment += " variable holds the build result for this try_run().\n\n"
-                 "Source file   : ";
-      comment += srcFile + "\n";
+      comment += " variable holds the build result for this try_run().\n\n";
+      if (srcFile) {
+        comment += "Source file   : ";
+        comment += *srcFile + "\n";
+      }
       comment += "Executable    : ";
       comment += copyDest + "\n";
       comment += "Run arguments : ";

+ 8 - 0
Tests/RunCMake/try_run/CrossCompile.cmake

@@ -0,0 +1,8 @@
+include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS})
+
+# Pretend we are cross-compiling to take that try_run code path.
+set(CMAKE_CROSSCOMPILING 1)
+set(RUN_RESULT 0)
+try_run(RUN_RESULT COMPILE_RESULT ${try_compile_bindir_or_SOURCES}
+  ${CMAKE_CURRENT_SOURCE_DIR}/src.c)
+unset(CMAKE_CROSSCOMPILING)

+ 2 - 0
Tests/RunCMake/try_run/old_and_new_signature_tests.cmake

@@ -11,6 +11,8 @@ run_cmake(BadLinkLibraries)
 run_cmake(BinDirEmpty)
 run_cmake(BinDirRelative)
 
+run_cmake(CrossCompile)
+
 run_cmake(WorkingDirArg)
 
 run_cmake(NoCompileOutputVariable)