فهرست منبع

TestGenerator: Add CROSSCOMPILING_EMULATOR support.

Prefix test commands with the CROSSCOMPILING_EMULATOR property
for target executables. This allows test suites to be run on the host
when crosscompiling.
Matt McCormick 10 سال پیش
والد
کامیت
9160d6c241

+ 3 - 1
Help/prop_tgt/CROSSCOMPILING_EMULATOR.rst

@@ -1,4 +1,6 @@
 CROSSCOMPILING_EMULATOR
 -----------------------
 
-Use the given emulator to run executables created when crosscompiling.
+Use the given emulator to run executables created when crosscompiling.  This
+command will be added as a prefix to :command:`add_test` test commands for
+built target system executables.

+ 20 - 1
Source/cmTestGenerator.cxx

@@ -82,11 +82,31 @@ void cmTestGenerator::GenerateScriptForConfig(std::ostream& os,
   // be translated.
   std::string exe = command[0];
   cmMakefile* mf = this->Test->GetMakefile();
+  cmLocalGenerator* lg = mf->GetLocalGenerator();
   cmTarget* target = mf->FindTargetToUse(exe);
   if(target && target->GetType() == cmTarget::EXECUTABLE)
     {
     // Use the target file on disk.
     exe = target->GetFullPath(config);
+
+    // Prepend with the emulator when cross compiling if required.
+    const char * emulator =
+      target->GetProperty("CROSSCOMPILING_EMULATOR");
+    if (emulator != 0)
+      {
+      std::vector<std::string> emulatorWithArgs;
+      cmSystemTools::ExpandListArgument(emulator, emulatorWithArgs);
+      std::string emulatorExe(emulatorWithArgs[0]);
+      cmSystemTools::ConvertToUnixSlashes(emulatorExe);
+      os << lg->EscapeForCMake(emulatorExe) << " ";
+      for(std::vector<std::string>::const_iterator ei =
+          emulatorWithArgs.begin()+1;
+          ei != emulatorWithArgs.end();
+          ++ei)
+        {
+        os << lg->EscapeForCMake(*ei) << " ";
+        }
+      }
     }
   else
     {
@@ -96,7 +116,6 @@ void cmTestGenerator::GenerateScriptForConfig(std::ostream& os,
     }
 
   // Generate the command line with full escapes.
-  cmLocalGenerator* lg = mf->GetLocalGenerator();
   os << lg->EscapeForCMake(exe);
   for(std::vector<std::string>::const_iterator ci = command.begin()+1;
       ci != command.end(); ++ci)

+ 12 - 0
Tests/RunCMake/CrosscompilingEmulator/AddTest-check.cmake

@@ -0,0 +1,12 @@
+set(testfile "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake")
+if(EXISTS "${testfile}")
+  file(READ "${testfile}" testfile_contents)
+else()
+  message(FATAL_ERROR "Could not find expected CTestTestfile.cmake.")
+endif()
+if(testfile_contents MATCHES "add_test[(]DoesNotUseEmulator ^(pseudo_emulator)+$")
+  message(SEND_ERROR "Used emulator when it should not be used.")
+endif()
+if(NOT testfile_contents MATCHES "add_test[(]UsesEmulator .+pseudo_emulator.+$")
+  message(SEND_ERROR "Did not use emulator when it should be used.")
+endif()

+ 8 - 0
Tests/RunCMake/CrosscompilingEmulator/AddTest.cmake

@@ -0,0 +1,8 @@
+set(CMAKE_CROSSCOMPILING 1)
+enable_testing()
+add_test(NAME DoesNotUseEmulator
+  COMMAND ${CMAKE_COMMAND} -E echo "Hi")
+
+add_executable(generated_exe simple_src.cxx)
+add_test(NAME UsesEmulator
+  COMMAND generated_exe)

+ 1 - 0
Tests/RunCMake/CrosscompilingEmulator/InitialCache.txt.in

@@ -0,0 +1 @@
+CMAKE_EMULATOR:STRING=@PSEUDO_EMULATOR@

+ 1 - 0
Tests/RunCMake/CrosscompilingEmulator/RunCMakeTest.cmake

@@ -5,3 +5,4 @@ set(RunCMake_TEST_OPTIONS
 
 run_cmake(CrosscompilingEmulatorProperty)
 run_cmake(TryRun)
+run_cmake(AddTest)