From e2b1f0583f7293bce280dfab397e96acf8a5b26e Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Thu, 1 Jan 2015 22:30:08 -0500 Subject: try_run: Add support for LINK_LIBRARIES option. Most functionality is already implemented in Source/cmCoreTryCompile.{h,cxx}. Document and improve argument parsing. This functionality is already being used by a number of modules, like CheckCSourceCompiles.cmake, but it is not documented. --- Help/command/try_run.rst | 9 ++++++++- Help/release/dev/try-run-link-libraries.rst | 5 +++++ Source/cmCoreTryCompile.cxx | 2 +- Source/cmTryRunCommand.cxx | 3 ++- Tests/RunCMake/try_compile/BadLinkLibraries-stderr.txt | 4 ++-- 5 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 Help/release/dev/try-run-link-libraries.rst diff --git a/Help/command/try_run.rst b/Help/command/try_run.rst index 9a17ad9..b8ea0fe 100644 --- a/Help/command/try_run.rst +++ b/Help/command/try_run.rst @@ -6,8 +6,9 @@ Try compiling and then running some code. :: try_run(RUN_RESULT_VAR COMPILE_RESULT_VAR - bindir srcfile [CMAKE_FLAGS ] + bindir srcfile [CMAKE_FLAGS ] [COMPILE_DEFINITIONS ] + [LINK_LIBRARIES ] [COMPILE_OUTPUT_VARIABLE comp] [RUN_OUTPUT_VARIABLE run] [OUTPUT_VARIABLE var] @@ -22,6 +23,12 @@ where the output from the compile step goes. RUN_OUTPUT_VARIABLE specifies the variable where the output from the running executable goes. +The srcfile signature also accepts a LINK_LIBRARIES argument which may +contain a list of libraries or IMPORTED targets which will be linked +to in the generated project. If LINK_LIBRARIES is specified as a +parameter to try_run, then any LINK_LIBRARIES passed as +CMAKE_FLAGS will be ignored. + For compatibility reasons OUTPUT_VARIABLE is still supported, which gives you the output from the compile and run step combined. diff --git a/Help/release/dev/try-run-link-libraries.rst b/Help/release/dev/try-run-link-libraries.rst new file mode 100644 index 0000000..4f20cbd --- /dev/null +++ b/Help/release/dev/try-run-link-libraries.rst @@ -0,0 +1,5 @@ +try-run-link-libraries +---------------------- + +* The :command:`try_run` command learned to honor the ``LINK_LIBRARIES`` + option just as :command:`try_compile` already does. diff --git a/Source/cmCoreTryCompile.cxx b/Source/cmCoreTryCompile.cxx index 0030b84..2f58d96 100644 --- a/Source/cmCoreTryCompile.cxx +++ b/Source/cmCoreTryCompile.cxx @@ -109,7 +109,7 @@ int cmCoreTryCompile::TryCompileCode(std::vector const& argv) } default: this->Makefile->IssueMessage(cmake::FATAL_ERROR, - "Only libraries may be used as try_compile IMPORTED " + "Only libraries may be used as try_compile or try_run IMPORTED " "LINK_LIBRARIES. Got " + std::string(tgt->GetName()) + " of " "type " + tgt->GetTargetTypeName(tgt->GetType()) + "."); return -1; diff --git a/Source/cmTryRunCommand.cxx b/Source/cmTryRunCommand.cxx index 8f2deeb..8bd33d0 100644 --- a/Source/cmTryRunCommand.cxx +++ b/Source/cmTryRunCommand.cxx @@ -48,7 +48,8 @@ bool cmTryRunCommand { ++i; while (i < argv.size() && argv[i] != "COMPILE_DEFINITIONS" && - argv[i] != "CMAKE_FLAGS") + argv[i] != "CMAKE_FLAGS" && + argv[i] != "LINK_LIBRARIES") { runArgs += " "; runArgs += argv[i]; diff --git a/Tests/RunCMake/try_compile/BadLinkLibraries-stderr.txt b/Tests/RunCMake/try_compile/BadLinkLibraries-stderr.txt index eceffec..652bcfc 100644 --- a/Tests/RunCMake/try_compile/BadLinkLibraries-stderr.txt +++ b/Tests/RunCMake/try_compile/BadLinkLibraries-stderr.txt @@ -1,5 +1,5 @@ CMake Error at BadLinkLibraries.cmake:2 \(try_compile\): - Only libraries may be used as try_compile IMPORTED LINK_LIBRARIES. Got - not_a_library of type UTILITY. + Only libraries may be used as try_compile or try_run IMPORTED + LINK_LIBRARIES. Got not_a_library of type UTILITY. Call Stack \(most recent call first\): CMakeLists.txt:3 \(include\) -- cgit v0.12 From 223c5cb70b30b6a790fd916321f60c86d459e15e Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Thu, 22 Jan 2015 19:13:56 -0500 Subject: try_run: Add test for bad link libraries. Based off the corresponding try_compile test. --- Tests/RunCMake/CMakeLists.txt | 1 + Tests/RunCMake/try_run/BadLinkLibraries-result.txt | 1 + Tests/RunCMake/try_run/BadLinkLibraries-stderr.txt | 5 +++++ Tests/RunCMake/try_run/BadLinkLibraries.cmake | 4 ++++ Tests/RunCMake/try_run/CMakeLists.txt | 3 +++ Tests/RunCMake/try_run/RunCMakeTest.cmake | 3 +++ Tests/RunCMake/try_run/src.c | 1 + 7 files changed, 18 insertions(+) create mode 100644 Tests/RunCMake/try_run/BadLinkLibraries-result.txt create mode 100644 Tests/RunCMake/try_run/BadLinkLibraries-stderr.txt create mode 100644 Tests/RunCMake/try_run/BadLinkLibraries.cmake create mode 100644 Tests/RunCMake/try_run/CMakeLists.txt create mode 100644 Tests/RunCMake/try_run/RunCMakeTest.cmake create mode 100644 Tests/RunCMake/try_run/src.c diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index b5e41d9..78d375e 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -130,6 +130,7 @@ add_RunCMake_test(project) add_RunCMake_test(return) add_RunCMake_test(string) add_RunCMake_test(try_compile) +add_RunCMake_test(try_run) add_RunCMake_test(set) add_RunCMake_test(variable_watch) add_RunCMake_test(CMP0004) diff --git a/Tests/RunCMake/try_run/BadLinkLibraries-result.txt b/Tests/RunCMake/try_run/BadLinkLibraries-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/try_run/BadLinkLibraries-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/try_run/BadLinkLibraries-stderr.txt b/Tests/RunCMake/try_run/BadLinkLibraries-stderr.txt new file mode 100644 index 0000000..dcd1bfc --- /dev/null +++ b/Tests/RunCMake/try_run/BadLinkLibraries-stderr.txt @@ -0,0 +1,5 @@ +CMake Error at BadLinkLibraries.cmake:2 \(try_run\): + Only libraries may be used as try_compile or try_run IMPORTED + LINK_LIBRARIES. Got not_a_library of type UTILITY. +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/try_run/BadLinkLibraries.cmake b/Tests/RunCMake/try_run/BadLinkLibraries.cmake new file mode 100644 index 0000000..a124bf6 --- /dev/null +++ b/Tests/RunCMake/try_run/BadLinkLibraries.cmake @@ -0,0 +1,4 @@ +add_custom_target(not_a_library) +try_run(RUN_RESULT COMPILE_RESULT + ${CMAKE_CURRENT_BINARY_DIR}/CMakeTmp ${CMAKE_CURRENT_SOURCE_DIR}/src.c + LINK_LIBRARIES not_a_library) diff --git a/Tests/RunCMake/try_run/CMakeLists.txt b/Tests/RunCMake/try_run/CMakeLists.txt new file mode 100644 index 0000000..e034780 --- /dev/null +++ b/Tests/RunCMake/try_run/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 2.8.0) +project(${RunCMake_TEST} C) +include(${RunCMake_TEST}.cmake) diff --git a/Tests/RunCMake/try_run/RunCMakeTest.cmake b/Tests/RunCMake/try_run/RunCMakeTest.cmake new file mode 100644 index 0000000..1ec9a55 --- /dev/null +++ b/Tests/RunCMake/try_run/RunCMakeTest.cmake @@ -0,0 +1,3 @@ +include(RunCMake) + +run_cmake(BadLinkLibraries) diff --git a/Tests/RunCMake/try_run/src.c b/Tests/RunCMake/try_run/src.c new file mode 100644 index 0000000..78f2de1 --- /dev/null +++ b/Tests/RunCMake/try_run/src.c @@ -0,0 +1 @@ +int main(void) { return 0; } -- cgit v0.12 From d0adcccbf4321437f5ecb677c7f88b3e4af484ed Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Thu, 22 Jan 2015 19:53:16 -0500 Subject: try_run: Add tests for LINK_LIBRARIES with mock libraries. Extend the ExportImport test to try using an imported library with try_run. --- Tests/ExportImport/Import/A/CMakeLists.txt | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Tests/ExportImport/Import/A/CMakeLists.txt b/Tests/ExportImport/Import/A/CMakeLists.txt index 9450c82..358776b 100644 --- a/Tests/ExportImport/Import/A/CMakeLists.txt +++ b/Tests/ExportImport/Import/A/CMakeLists.txt @@ -311,6 +311,21 @@ if (((CMAKE_C_COMPILER_ID STREQUAL GNU AND CMAKE_C_COMPILER_VERSION VERSION_GREA message(SEND_ERROR "EXP_ERROR_VARIABLE try_compile failed, but it was expected to succeed ${OUTPUT}.") endif() + if(NOT CMAKE_CROSSCOMPILING) + unset(EXP_RUN_VAR CACHE) + unset(EXP_COMPILE_VAR CACHE) + try_run(EXP_RUN_VAR EXP_COMPILE_VAR + "${CMAKE_CURRENT_SOURCE_DIR}/test_system" + "${CMAKE_CURRENT_SOURCE_DIR}/test_system.cpp" + COMPILE_DEFINITIONS "-Wunused-variable -Werror=unused-variable" + LINK_LIBRARIES exp_systemlib + OUTPUT_VARIABLE OUTPUT + ) + if(NOT EXP_COMPILE_VAR) + message(SEND_ERROR "try_run compile failed, but it was expected to succeed ${OUTPUT}.") + endif() + endif() + add_executable(test_system_bld test_system.cpp) target_link_libraries(test_system_bld bld_systemlib) target_compile_options(test_system_bld PRIVATE -Wunused-variable -Werror=unused-variable) @@ -326,5 +341,20 @@ if (((CMAKE_C_COMPILER_ID STREQUAL GNU AND CMAKE_C_COMPILER_VERSION VERSION_GREA if(NOT BLD_ERROR_VARIABLE) message(SEND_ERROR "BLD_ERROR_VARIABLE try_compile failed, but it was expected to succeed.") endif() + + if(NOT CMAKE_CROSSCOMPILING) + unset(BLD_RUN_VAR CACHE) + unset(BLD_COMPILE_VAR CACHE) + try_run(BLD_RUN_VAR BLD_COMPILE_VAR + "${CMAKE_CURRENT_SOURCE_DIR}/test_system" + "${CMAKE_CURRENT_SOURCE_DIR}/test_system.cpp" + COMPILE_DEFINITIONS "-Wunused-variable -Werror=unused-variable" + LINK_LIBRARIES bld_systemlib + OUTPUT_VARIABLE OUTPUT + ) + if(NOT BLD_COMPILE_VAR) + message(SEND_ERROR "try_run compile failed, but it was expected to succeed ${OUTPUT}.") + endif() + endif() endif() endif() -- cgit v0.12