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.
This commit is contained in:
Matt McCormick 2015-03-28 22:05:35 -04:00 committed by Brad King
parent e942526b3d
commit 9160d6c241
6 changed files with 45 additions and 2 deletions

View File

@ -1,4 +1,6 @@
CROSSCOMPILING_EMULATOR 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.

View File

@ -82,11 +82,31 @@ void cmTestGenerator::GenerateScriptForConfig(std::ostream& os,
// be translated. // be translated.
std::string exe = command[0]; std::string exe = command[0];
cmMakefile* mf = this->Test->GetMakefile(); cmMakefile* mf = this->Test->GetMakefile();
cmLocalGenerator* lg = mf->GetLocalGenerator();
cmTarget* target = mf->FindTargetToUse(exe); cmTarget* target = mf->FindTargetToUse(exe);
if(target && target->GetType() == cmTarget::EXECUTABLE) if(target && target->GetType() == cmTarget::EXECUTABLE)
{ {
// Use the target file on disk. // Use the target file on disk.
exe = target->GetFullPath(config); 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 else
{ {
@ -96,7 +116,6 @@ void cmTestGenerator::GenerateScriptForConfig(std::ostream& os,
} }
// Generate the command line with full escapes. // Generate the command line with full escapes.
cmLocalGenerator* lg = mf->GetLocalGenerator();
os << lg->EscapeForCMake(exe); os << lg->EscapeForCMake(exe);
for(std::vector<std::string>::const_iterator ci = command.begin()+1; for(std::vector<std::string>::const_iterator ci = command.begin()+1;
ci != command.end(); ++ci) ci != command.end(); ++ci)

View File

@ -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()

View File

@ -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)

View File

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

View File

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