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
|
usually cannot be run on the build host. The ``try_run`` command checks
|
||||||
the :variable:`CMAKE_CROSSCOMPILING` variable to detect whether CMake is in
|
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
|
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
|
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
|
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.
|
would have produced if it had been run on its actual target platform.
|
||||||
|
|
|
@ -1,5 +1,12 @@
|
||||||
CMAKE_CROSSCOMPILING_EMULATOR
|
CMAKE_CROSSCOMPILING_EMULATOR
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
Default value for the :prop_tgt:`CROSSCOMPILING_EMULATOR` target property of
|
This variable is only used when :variable:`CMAKE_CROSSCOMPILING` is on. It
|
||||||
executables. See that target property for additional information.
|
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
|
// "run" it and capture the output
|
||||||
std::string runOutputContents;
|
std::string runOutputContents;
|
||||||
if (this->Makefile->IsOn("CMAKE_CROSSCOMPILING"))
|
if (this->Makefile->IsOn("CMAKE_CROSSCOMPILING") &&
|
||||||
|
!this->Makefile->IsDefinitionSet("CMAKE_CROSSCOMPILING_EMULATOR"))
|
||||||
{
|
{
|
||||||
this->DoNotRunExecutable(runArgs,
|
this->DoNotRunExecutable(runArgs,
|
||||||
argv[3],
|
argv[3],
|
||||||
|
@ -195,7 +196,28 @@ void cmTryRunCommand::RunExecutable(const std::string& runArgs,
|
||||||
std::string* out)
|
std::string* out)
|
||||||
{
|
{
|
||||||
int retVal = -1;
|
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());
|
this->OutputFile.c_str());
|
||||||
if (!runArgs.empty())
|
if (!runArgs.empty())
|
||||||
{
|
{
|
||||||
|
|
|
@ -4,3 +4,4 @@ set(RunCMake_TEST_OPTIONS
|
||||||
"-DCMAKE_CROSSCOMPILING_EMULATOR=${PSEUDO_EMULATOR}")
|
"-DCMAKE_CROSSCOMPILING_EMULATOR=${PSEUDO_EMULATOR}")
|
||||||
|
|
||||||
run_cmake(CrosscompilingEmulatorProperty)
|
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 **)
|
int main(int, char **)
|
||||||
{
|
{
|
||||||
return 0;
|
return 13;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue