diff options
author | Jean-Christophe Fillion-Robin <jchris.fillionr@kitware.com> | 2016-05-04 17:30:19 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2016-05-09 12:56:27 (GMT) |
commit | 8c2cedc6243b281a0814b284abbcd1c45c42b085 (patch) | |
tree | b4bd057053fff493dc9ed8f9538e5e039faa6e89 /Tests | |
parent | eccfc0d185526b746b722ed3d3d1302515698c9e (diff) | |
download | CMake-8c2cedc6243b281a0814b284abbcd1c45c42b085.zip CMake-8c2cedc6243b281a0814b284abbcd1c45c42b085.tar.gz CMake-8c2cedc6243b281a0814b284abbcd1c45c42b085.tar.bz2 |
CustomCommandGenerator: Add support for CROSSCOMPILING_EMULATOR
Teach the `add_custom_command` and `add_custom_target' commands to
substitute argv0 with the crosscompiling emulator if it is a target with
the `CROSSCOMPILING_EMULATOR` property set.
Diffstat (limited to 'Tests')
8 files changed, 134 insertions, 1 deletions
diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index 02e14e6..d16e5e7 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -289,8 +289,10 @@ if(CMake_TEST_FindMatlab) endif() add_executable(pseudo_emulator pseudo_emulator.c) +add_executable(pseudo_emulator_custom_command pseudo_emulator_custom_command.c) add_RunCMake_test(CrosscompilingEmulator - -DPSEUDO_EMULATOR=$<TARGET_FILE:pseudo_emulator>) + -DPSEUDO_EMULATOR=$<TARGET_FILE:pseudo_emulator> + -DPSEUDO_EMULATOR_CUSTOM_COMMAND=$<TARGET_FILE:pseudo_emulator_custom_command>) # Xcode 2.x forgets to create the output directory before linking # the individual architectures. if(CMAKE_OSX_ARCHITECTURES AND XCODE AND NOT "${XCODE_VERSION}" MATCHES "^[^12]") @@ -298,6 +300,10 @@ if(CMAKE_OSX_ARCHITECTURES AND XCODE AND NOT "${XCODE_VERSION}" MATCHES "^[^12]" TARGET pseudo_emulator PRE_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CFG_INTDIR}" ) + add_custom_command( + TARGET pseudo_emulator_custom_command + PRE_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CFG_INTDIR}" + ) endif() if("${CMAKE_GENERATOR}" MATCHES "Make|Ninja") diff --git a/Tests/RunCMake/CrosscompilingEmulator/AddCustomCommand-build-check.cmake b/Tests/RunCMake/CrosscompilingEmulator/AddCustomCommand-build-check.cmake new file mode 100644 index 0000000..e10b161 --- /dev/null +++ b/Tests/RunCMake/CrosscompilingEmulator/AddCustomCommand-build-check.cmake @@ -0,0 +1,5 @@ +foreach(output IN ITEMS output1 output2 output3 output4) + if(NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/${output}") + message(FATAL_ERROR "Failed to create output: ${RunCMake_TEST_BINARY_DIR}/${output}") + endif() +endforeach() diff --git a/Tests/RunCMake/CrosscompilingEmulator/AddCustomCommand.cmake b/Tests/RunCMake/CrosscompilingEmulator/AddCustomCommand.cmake new file mode 100644 index 0000000..67fa30f --- /dev/null +++ b/Tests/RunCMake/CrosscompilingEmulator/AddCustomCommand.cmake @@ -0,0 +1,38 @@ +set(CMAKE_CROSSCOMPILING 1) + +# Executable: Return error code different from 0 +add_executable(generated_exe_emulator_expected simple_src_exiterror.cxx) + +# Executable: Return error code equal to 0 +add_executable(generated_exe_emulator_unexpected simple_src_exitsuccess.cxx) + +# DoesNotUseEmulator +add_custom_command(OUTPUT output1 + COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/output1) + +# DoesNotUseEmulator: The command will fail if emulator is prepended +add_custom_command(OUTPUT output2 + COMMAND ${CMAKE_COMMAND} -E echo "$<TARGET_FILE:generated_exe_emulator_unexpected>" + COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/output2 + DEPENDS generated_exe_emulator_unexpected) + +# DoesNotUseEmulator: The command will fail if emulator is prepended +add_custom_command(OUTPUT output3 + COMMAND $<TARGET_FILE:generated_exe_emulator_unexpected> + COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/output3 + DEPENDS generated_exe_emulator_unexpected) + +# UsesEmulator: The command only succeeds if the emulator is prepended +# to the command. +add_custom_command(OUTPUT output4 + COMMAND generated_exe_emulator_expected + COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/output4 + DEPENDS generated_exe_emulator_expected) + +add_custom_target(ensure_build ALL + SOURCES + ${CMAKE_CURRENT_BINARY_DIR}/output1 + ${CMAKE_CURRENT_BINARY_DIR}/output2 + ${CMAKE_CURRENT_BINARY_DIR}/output3 + ${CMAKE_CURRENT_BINARY_DIR}/output4 +) diff --git a/Tests/RunCMake/CrosscompilingEmulator/AddCustomTarget-build-check.cmake b/Tests/RunCMake/CrosscompilingEmulator/AddCustomTarget-build-check.cmake new file mode 100644 index 0000000..c621922 --- /dev/null +++ b/Tests/RunCMake/CrosscompilingEmulator/AddCustomTarget-build-check.cmake @@ -0,0 +1 @@ +include(${CMAKE_CURRENT_LIST_DIR}/AddCustomCommand-build-check.cmake) diff --git a/Tests/RunCMake/CrosscompilingEmulator/AddCustomTarget.cmake b/Tests/RunCMake/CrosscompilingEmulator/AddCustomTarget.cmake new file mode 100644 index 0000000..ced569f --- /dev/null +++ b/Tests/RunCMake/CrosscompilingEmulator/AddCustomTarget.cmake @@ -0,0 +1,30 @@ +set(CMAKE_CROSSCOMPILING 1) + +# Executable: Return error code different from 0 +add_executable(generated_exe_emulator_expected simple_src_exiterror.cxx) + +# Executable: Return error code equal to 0 +add_executable(generated_exe_emulator_unexpected simple_src_exitsuccess.cxx) + +# DoesNotUseEmulator +add_custom_target(generate_output1 ALL + ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/output1) + +# DoesNotUseEmulator: The command will fail if emulator is prepended +add_custom_target(generate_output2 ALL + ${CMAKE_COMMAND} -E echo "$<TARGET_FILE:generated_exe_emulator_unexpected>" + COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/output2 + DEPENDS generated_exe_emulator_unexpected) + +# DoesNotUseEmulator: The command will fail if emulator is prepended +add_custom_target(generate_output3 ALL + $<TARGET_FILE:generated_exe_emulator_unexpected> + COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/output3 + DEPENDS generated_exe_emulator_unexpected) + +# UsesEmulator: The command only succeeds if the emulator is prepended +# to the command. +add_custom_target(generate_output4 ALL + generated_exe_emulator_expected + COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/output4 + DEPENDS generated_exe_emulator_expected) diff --git a/Tests/RunCMake/CrosscompilingEmulator/RunCMakeTest.cmake b/Tests/RunCMake/CrosscompilingEmulator/RunCMakeTest.cmake index 2581cfc..71aaad1 100644 --- a/Tests/RunCMake/CrosscompilingEmulator/RunCMakeTest.cmake +++ b/Tests/RunCMake/CrosscompilingEmulator/RunCMakeTest.cmake @@ -6,3 +6,18 @@ set(RunCMake_TEST_OPTIONS run_cmake(CrosscompilingEmulatorProperty) run_cmake(TryRun) run_cmake(AddTest) + +function(CustomCommandGenerator_run_and_build case) + # Use a single build tree for a few tests without cleaning. + set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${case}-build) + set(RunCMake_TEST_NO_CLEAN 1) + set(RunCMake_TEST_OPTIONS + "-DCMAKE_CROSSCOMPILING_EMULATOR=${PSEUDO_EMULATOR_CUSTOM_COMMAND}") + file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}") + file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}") + run_cmake(${case}) + run_cmake_command(${case}-build ${CMAKE_COMMAND} --build .) +endfunction() + +CustomCommandGenerator_run_and_build(AddCustomCommand) +CustomCommandGenerator_run_and_build(AddCustomTarget) diff --git a/Tests/RunCMake/CrosscompilingEmulator/simple_src_exitsuccess.cxx b/Tests/RunCMake/CrosscompilingEmulator/simple_src_exitsuccess.cxx new file mode 100644 index 0000000..630adc6 --- /dev/null +++ b/Tests/RunCMake/CrosscompilingEmulator/simple_src_exitsuccess.cxx @@ -0,0 +1,4 @@ +int main(int, char **) +{ + return 0; +} diff --git a/Tests/RunCMake/pseudo_emulator_custom_command.c b/Tests/RunCMake/pseudo_emulator_custom_command.c new file mode 100644 index 0000000..17181c9 --- /dev/null +++ b/Tests/RunCMake/pseudo_emulator_custom_command.c @@ -0,0 +1,34 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +// Usage: +// +// /path/to/program arg1 [arg2 [...]] +// +// Return EXIT_SUCCESS if 'generated_exe_emulator_expected' +// string was found in <arg1>. +// Return EXIT_FAILURE if 'generated_exe_emulator_unexpected' +// string was found in <arg1>. + +int main(int argc, const char* argv[]) +{ + const char* substring_failure = "generated_exe_emulator_unexpected"; + const char* substring_success = "generated_exe_emulator_expected"; + const char* str = argv[1]; + if (argc < 2) + { + return EXIT_FAILURE; + } + if (strstr(str, substring_success) != 0) + { + return EXIT_SUCCESS; + } + if (strstr(str, substring_failure) != 0) + { + return EXIT_FAILURE; + } + fprintf(stderr, "Failed to find string '%s' in '%s'\n", + substring_success, str); + return EXIT_FAILURE; +} |