try_run: Use CMAKE_CROSSCOMPILING_EMULATOR.
If the CMAKE_CROSSCOMPILING_EMULATOR variable is defined, and CMAKE_CROSSCOMPILING is TRUE, then use CMAKE_CROSSCOMPILING_EMULATOR to run the try_run executables. This prevents the need to populate TryRunResults.cmake when cross compiling.
This commit is contained in:
parent
579c4bec6e
commit
e942526b3d
|
@ -73,7 +73,8 @@ When cross compiling, the executable compiled in the first step
|
|||
usually cannot be run on the build host. The ``try_run`` command checks
|
||||
the :variable:`CMAKE_CROSSCOMPILING` variable to detect whether CMake is in
|
||||
cross-compiling mode. If that is the case, it will still try to compile
|
||||
the executable, but it will not try to run the executable. Instead it
|
||||
the executable, but it will not try to run the executable unless the
|
||||
:variable:`CMAKE_CROSSCOMPILING_EMULATOR` variable is set. Instead it
|
||||
will create cache variables which must be filled by the user or by
|
||||
presetting them in some CMake script file to the values the executable
|
||||
would have produced if it had been run on its actual target platform.
|
||||
|
|
|
@ -1,5 +1,12 @@
|
|||
CMAKE_CROSSCOMPILING_EMULATOR
|
||||
-----------------------------
|
||||
|
||||
Default value for the :prop_tgt:`CROSSCOMPILING_EMULATOR` target property of
|
||||
executables. See that target property for additional information.
|
||||
This variable is only used when :variable:`CMAKE_CROSSCOMPILING` is on. It
|
||||
should point to a command on the host system that can run executable built
|
||||
for the target system.
|
||||
|
||||
The command will be used to run :command:`try_run` generated executables,
|
||||
which avoids manual population of the TryRunResults.cmake file.
|
||||
|
||||
It is also used as the default value for the
|
||||
:prop_tgt:`CROSSCOMPILING_EMULATOR` target property of executables.
|
||||
|
|
|
@ -149,7 +149,8 @@ bool cmTryRunCommand
|
|||
{
|
||||
// "run" it and capture the output
|
||||
std::string runOutputContents;
|
||||
if (this->Makefile->IsOn("CMAKE_CROSSCOMPILING"))
|
||||
if (this->Makefile->IsOn("CMAKE_CROSSCOMPILING") &&
|
||||
!this->Makefile->IsDefinitionSet("CMAKE_CROSSCOMPILING_EMULATOR"))
|
||||
{
|
||||
this->DoNotRunExecutable(runArgs,
|
||||
argv[3],
|
||||
|
@ -195,7 +196,28 @@ void cmTryRunCommand::RunExecutable(const std::string& runArgs,
|
|||
std::string* out)
|
||||
{
|
||||
int retVal = -1;
|
||||
std::string finalCommand = cmSystemTools::ConvertToRunCommandPath(
|
||||
|
||||
std::string finalCommand;
|
||||
const std::string emulator =
|
||||
this->Makefile->GetSafeDefinition("CMAKE_CROSSCOMPILING_EMULATOR");
|
||||
if (!emulator.empty())
|
||||
{
|
||||
std::vector<std::string> emulatorWithArgs;
|
||||
cmSystemTools::ExpandListArgument(emulator, emulatorWithArgs);
|
||||
finalCommand += cmSystemTools::ConvertToRunCommandPath(
|
||||
emulatorWithArgs[0].c_str());
|
||||
finalCommand += " ";
|
||||
for (std::vector<std::string>::const_iterator ei =
|
||||
emulatorWithArgs.begin()+1;
|
||||
ei != emulatorWithArgs.end(); ++ei)
|
||||
{
|
||||
finalCommand += "\"";
|
||||
finalCommand += *ei;
|
||||
finalCommand += "\"";
|
||||
finalCommand += " ";
|
||||
}
|
||||
}
|
||||
finalCommand += cmSystemTools::ConvertToRunCommandPath(
|
||||
this->OutputFile.c_str());
|
||||
if (!runArgs.empty())
|
||||
{
|
||||
|
|
|
@ -4,3 +4,4 @@ set(RunCMake_TEST_OPTIONS
|
|||
"-DCMAKE_CROSSCOMPILING_EMULATOR=${PSEUDO_EMULATOR}")
|
||||
|
||||
run_cmake(CrosscompilingEmulatorProperty)
|
||||
run_cmake(TryRun)
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
run_result: 42
|
|
@ -0,0 +1,18 @@
|
|||
set(CMAKE_CROSSCOMPILING 1)
|
||||
|
||||
try_run(run_result compile_result
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/simple_src.cxx
|
||||
RUN_OUTPUT_VARIABLE run_output)
|
||||
|
||||
message(STATUS "run_output: ${run_output}")
|
||||
message(STATUS "run_result: ${run_result}")
|
||||
|
||||
set(CMAKE_CROSSCOMPILING_EMULATOR ${CMAKE_CROSSCOMPILING_EMULATOR}
|
||||
--flag
|
||||
"multi arg")
|
||||
try_run(run_result compile_result
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/simple_src.cxx
|
||||
RUN_OUTPUT_VARIABLE run_output)
|
||||
message(STATUS "Emulator with arguments run_output: ${run_output}")
|
|
@ -1,4 +1,4 @@
|
|||
int main(int, char **)
|
||||
{
|
||||
return 0;
|
||||
return 13;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue