From e2b1f0583f7293bce280dfab397e96acf8a5b26e Mon Sep 17 00:00:00 2001
From: Matt McCormick <matt.mccormick@kitware.com>
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 <Flags>]
+          bindir srcfile [CMAKE_FLAGS <flags>]
           [COMPILE_DEFINITIONS <flags>]
+          [LINK_LIBRARIES <libs>]
           [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<std::string> 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 <matt.mccormick@kitware.com>
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 <matt.mccormick@kitware.com>
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