Merge topic 'improve_device_link_policy_cross_ref' into release-3.18

e5279c2c8f Help: Better document that CMP0105 controls DEVICE_LINK parsing

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !4919
diff --git a/Help/manual/cmake-properties.7.rst b/Help/manual/cmake-properties.7.rst
index 7f7ed50..30b2a05 100644
--- a/Help/manual/cmake-properties.7.rst
+++ b/Help/manual/cmake-properties.7.rst
@@ -128,7 +128,6 @@
    /prop_tgt/ARCHIVE_OUTPUT_DIRECTORY
    /prop_tgt/ARCHIVE_OUTPUT_NAME_CONFIG
    /prop_tgt/ARCHIVE_OUTPUT_NAME
-   /prop_tgt/PCH_WARN_INVALID
    /prop_tgt/AUTOGEN_BUILD_DIR
    /prop_tgt/AUTOGEN_ORIGIN_DEPENDS
    /prop_tgt/AUTOGEN_PARALLEL
@@ -312,6 +311,7 @@
    /prop_tgt/OSX_ARCHITECTURES
    /prop_tgt/OUTPUT_NAME_CONFIG
    /prop_tgt/OUTPUT_NAME
+   /prop_tgt/PCH_WARN_INVALID
    /prop_tgt/PDB_NAME_CONFIG
    /prop_tgt/PDB_NAME
    /prop_tgt/PDB_OUTPUT_DIRECTORY_CONFIG
diff --git a/Help/prop_sf/VS_SETTINGS.rst b/Help/prop_sf/VS_SETTINGS.rst
index 0719406..50034fb 100644
--- a/Help/prop_sf/VS_SETTINGS.rst
+++ b/Help/prop_sf/VS_SETTINGS.rst
@@ -15,4 +15,4 @@
 will set ``Key`` to ``Value`` and ``Key2`` to ``Value2`` on the
 ``file.hlsl`` item as metadata.
 
-Generator expressions are supported.
+:manual:`Generator expressions <cmake-generator-expressions(7)>` are supported.
diff --git a/Help/prop_tgt/FRAMEWORK_MULTI_CONFIG_POSTFIX_CONFIG.rst b/Help/prop_tgt/FRAMEWORK_MULTI_CONFIG_POSTFIX_CONFIG.rst
index 2b20bf9..5d0fc3d 100644
--- a/Help/prop_tgt/FRAMEWORK_MULTI_CONFIG_POSTFIX_CONFIG.rst
+++ b/Help/prop_tgt/FRAMEWORK_MULTI_CONFIG_POSTFIX_CONFIG.rst
@@ -1,24 +1,25 @@
 FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG>
 ---------------------------------------
 
-Postfix to append to the framework file name for configuration <CONFIG>,
+Postfix to append to the framework file name for configuration ``<CONFIG>``,
 when using a multi-config generator (like Xcode and Ninja Multi-Config).
 
-When building with configuration <CONFIG> the value of this property
+When building with configuration ``<CONFIG>`` the value of this property
 is appended to the framework file name built on disk.
 
-For example given a framework called ``my_fw``, a value of ``_debug``
-for the :prop_tgt:`FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG>` property, and
-``Debug;Release`` in `CMAKE_CONFIGURATION_TYPES`, the following relevant
-files would be created for the ``Debug`` and ``Release`` configurations:
+For example, given a framework called ``my_fw``, a value of ``_debug``
+for the ``FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG>`` property, and
+``Debug;Release`` in :variable:`CMAKE_CONFIGURATION_TYPES`, the following
+relevant files would be created for the ``Debug`` and ``Release``
+configurations:
 
-- Release/my_fw.framework/my_fw
-- Release/my_fw.framework/Versions/A/my_fw
-- Debug/my_fw.framework/my_fw_debug
-- Debug/my_fw.framework/Versions/A/my_fw_debug
+- ``Release/my_fw.framework/my_fw``
+- ``Release/my_fw.framework/Versions/A/my_fw``
+- ``Debug/my_fw.framework/my_fw_debug``
+- ``Debug/my_fw.framework/Versions/A/my_fw_debug``
 
 For framework targets, this property is initialized by the value of the
-variable :variable:`CMAKE_FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG>` if it
+:variable:`CMAKE_FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG>` variable if it
 is set when a target is created.
 
 This property is ignored for non-framework targets, and when using single
diff --git a/Help/prop_tgt/PCH_WARN_INVALID.rst b/Help/prop_tgt/PCH_WARN_INVALID.rst
index 36ec348..96e1abd 100644
--- a/Help/prop_tgt/PCH_WARN_INVALID.rst
+++ b/Help/prop_tgt/PCH_WARN_INVALID.rst
@@ -2,7 +2,9 @@
 ----------------
 
 When this property is set to true, the precompile header compiler options
-will contain a compiler flag wich should warn about invalid precompiled
+will contain a compiler flag which should warn about invalid precompiled
 headers e.g. ``-Winvalid-pch`` for GNU compiler.
 
-The defalut value is ``ON``.
+This property is initialized by the value of the
+:variable:`CMAKE_PCH_WARN_INVALID` variable if it is set when a target is
+created.  If that variable is not set, the property defaults to ``ON``.
diff --git a/Help/prop_tgt/VS_SOLUTION_DEPLOY.rst b/Help/prop_tgt/VS_SOLUTION_DEPLOY.rst
index 7906d75..eef848f 100644
--- a/Help/prop_tgt/VS_SOLUTION_DEPLOY.rst
+++ b/Help/prop_tgt/VS_SOLUTION_DEPLOY.rst
@@ -4,24 +4,22 @@
 Specify that the target should be marked for deployment when not targeting
 Windows CE, Windows Phone or a Windows Store application.
 
-If the target platform doesn't support deployment, this property won't have any effect.
+If the target platform doesn't support deployment, this property won't have
+any effect.
 
-Generator expressions are supported.
+:manual:`Generator expressions <cmake-generator-expressions(7)>` are supported.
 
-Example 1
-^^^^^^^^^
+Examples
+^^^^^^^^
 
-This shows setting the variable for the target foo.
+Always deploy target ``foo``:
 
 .. code-block:: cmake
 
   add_executable(foo SHARED foo.cpp)
   set_property(TARGET foo PROPERTY VS_SOLUTION_DEPLOY ON)
 
-Example 2
-^^^^^^^^^
-
-This shows setting the variable for the Release configuration only.
+Deploy target ``foo`` for all configurations except ``Release``:
 
 .. code-block:: cmake
 
diff --git a/Help/prop_tgt/VS_SOURCE_SETTINGS_tool.rst b/Help/prop_tgt/VS_SOURCE_SETTINGS_tool.rst
index f706888..738a912 100644
--- a/Help/prop_tgt/VS_SOURCE_SETTINGS_tool.rst
+++ b/Help/prop_tgt/VS_SOURCE_SETTINGS_tool.rst
@@ -16,4 +16,4 @@
 will set ``Key`` to ``Value`` and ``Key2`` to ``Value2`` for all
 non-built files that use ``FXCompile``.
 
-Generator expressions are supported.
+:manual:`Generator expressions <cmake-generator-expressions(7)>` are supported.
diff --git a/Help/release/3.18.rst b/Help/release/3.18.rst
index 072f9aa..c98b12a 100644
--- a/Help/release/3.18.rst
+++ b/Help/release/3.18.rst
@@ -117,6 +117,9 @@
 * The :prop_sf:`OBJECT_OUTPUTS` source file property now supports
   :manual:`generator expressions <cmake-generator-expressions(7)>`.
 
+* The :prop_tgt:`PCH_WARN_INVALID` target property was added to allow the
+  removal of the precompiled header invalid warning.
+
 * The :prop_tgt:`UNITY_BUILD_MODE` target property was added to tell
   generators which algorithm to use for grouping included source
   files.
@@ -157,6 +160,14 @@
 
 * The :module:`FindBLAS` module now provides an imported target.
 
+* The :module:`FindCUDAToolkit` module:
+
+  * gained the variable
+    ``CUDAToolkit_LIBRARY_ROOT``, which is the directory containing the
+    ``nvvm`` directory and ``version.txt``.
+
+  * uses toolkit and library root found during ``CUDA`` compiler detection.
+
 * The :module:`FindLAPACK` module now provides an imported target.
 
 * The :module:`FindPython3`, :module:`FindPython2` and :module:`FindPython`
@@ -195,14 +206,6 @@
 
 .. _`SWIG-Fortran`: https://github.com/swig-fortran/swig
 
-* The :module:`FindCUDAToolkit` module:
-
-  * gained the variable
-    ``CUDAToolkit_LIBRARY_ROOT``, which is the directory containing the
-    ``nvvm`` directory and ``version.txt``.
-
-  * uses toolkit and library root found during ``CUDA`` compiler detection.
-
 Generator Expressions
 ---------------------
 
@@ -243,9 +246,9 @@
   installer is DPI-aware.
 
 * The :cpack_gen:`CPack RPM Generator` gained
-  :variable:`CPACK_RPM_PRE_TRANS_SCRIPT_FILE`
+  :variable:`CPACK_RPM_PRE_TRANS_SCRIPT_FILE` and
   :variable:`CPACK_RPM_POST_TRANS_SCRIPT_FILE`
-  variables to specify pre- and post-trans scripts.
+  variables to specify pre- and post-transaction scripts.
 
 Other
 -----
diff --git a/Modules/Compiler/ARMClang.cmake b/Modules/Compiler/ARMClang.cmake
index d412399..01ce91d 100644
--- a/Modules/Compiler/ARMClang.cmake
+++ b/Modules/Compiler/ARMClang.cmake
@@ -61,7 +61,7 @@
   if(__CMAKE_ARMClang_USING_armlink)
     set(__linker_wrapper_flags "")
   else()
-    set(__linker_wrapper_flags --target=${CMAKE_${lang}_COMPILER_TARGET} -XLinker)
+    set(__linker_wrapper_flags --target=${CMAKE_${lang}_COMPILER_TARGET} -Xlinker)
   endif()
 
   execute_process(COMMAND "${CMAKE_LINKER}" ${__linker_wrapper_flags} --cpu=list
diff --git a/Modules/GoogleTest.cmake b/Modules/GoogleTest.cmake
index 975ce6c..f75d6ad 100644
--- a/Modules/GoogleTest.cmake
+++ b/Modules/GoogleTest.cmake
@@ -155,7 +155,7 @@
                          [DISCOVERY_MODE <POST_BUILD|PRE_TEST>]
     )
 
-  ``gtest_discover_tests`` sets up a post-build command on the test executable
+  ``gtest_discover_tests()`` sets up a post-build command on the test executable
   that generates the list of tests by parsing the output from running the test
   with the ``--gtest_list_tests`` argument.  Compared to the source parsing
   approach of :command:`gtest_add_tests`, this ensures that the full list of
@@ -212,7 +212,7 @@
 
   ``PROPERTIES name1 value1...``
     Specifies additional properties to be set on all tests discovered by this
-    invocation of ``gtest_discover_tests``.
+    invocation of ``gtest_discover_tests()``.
 
   ``TEST_LIST var``
     Make the list of tests available in the variable ``var``, rather than the
@@ -246,7 +246,7 @@
     XML result output when using parallel test execution.
 
   ``DISCOVERY_MODE``
-    Provides greater control over when ``gtest_discover_tests``performs test
+    Provides greater control over when ``gtest_discover_tests()`` performs test
     discovery. By default, ``POST_BUILD`` sets up a post-build command
     to perform test discovery at build time. In certain scenarios, like
     cross-compiling, this ``POST_BUILD`` behavior is not desirable.
@@ -257,7 +257,7 @@
 
     ``DISCOVERY_MODE`` defaults to the value of the
     ``CMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE`` variable if it is not
-    passed when calling ``gtest_discover_tests``. This provides a mechanism
+    passed when calling ``gtest_discover_tests()``. This provides a mechanism
     for globally selecting a preferred test discovery behavior without having
     to modify each call site.
 
diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt
index 866e7c0..6c634b5 100644
--- a/Tests/RunCMake/CMakeLists.txt
+++ b/Tests/RunCMake/CMakeLists.txt
@@ -494,6 +494,9 @@
 add_RunCMake_test(ExportWithoutLanguage)
 add_RunCMake_test(target_link_directories)
 add_RunCMake_test(target_link_libraries)
+add_RunCMake_test(target_link_libraries-ALIAS)
+add_RunCMake_test(target_link_libraries-LINK_LANGUAGE)
+add_RunCMake_test(target_link_libraries-LINK_LANG_AND_ID)
 add_RunCMake_test(add_link_options -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID})
 add_RunCMake_test(target_link_options -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID}
                                       -DCMake_TEST_CUDA=${CMake_TEST_CUDA})
diff --git a/Tests/RunCMake/target_link_libraries/AliasTargets.cmake b/Tests/RunCMake/target_link_libraries-ALIAS/AliasTargets.cmake
similarity index 100%
rename from Tests/RunCMake/target_link_libraries/AliasTargets.cmake
rename to Tests/RunCMake/target_link_libraries-ALIAS/AliasTargets.cmake
diff --git a/Tests/RunCMake/target_link_libraries-ALIAS/CMakeLists.txt b/Tests/RunCMake/target_link_libraries-ALIAS/CMakeLists.txt
new file mode 100644
index 0000000..9cf020f
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries-ALIAS/CMakeLists.txt
@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 3.1)
+project(${RunCMake_TEST} NONE)
+include(${RunCMake_TEST}.cmake NO_POLICY_SCOPE)
diff --git a/Tests/RunCMake/target_link_libraries-ALIAS/RunCMakeTest.cmake b/Tests/RunCMake/target_link_libraries-ALIAS/RunCMakeTest.cmake
new file mode 100644
index 0000000..4d24a6e
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries-ALIAS/RunCMakeTest.cmake
@@ -0,0 +1,23 @@
+include(RunCMake)
+
+macro(run_cmake_target test subtest target)
+  set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${test}-build)
+  set(RunCMake_TEST_NO_CLEAN 1)
+  run_cmake_command(${test}-${subtest} ${CMAKE_COMMAND} --build . --target ${target} ${ARGN})
+
+  unset(RunCMake_TEST_BINARY_DIR)
+  unset(RunCMake_TEST_NO_CLEAN)
+endmacro()
+
+set(RunCMake_TEST_OUTPUT_MERGE TRUE)
+if (NOT RunCMake_GENERATOR_IS_MULTI_CONFIG)
+  set(RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Release)
+endif()
+run_cmake(AliasTargets)
+run_cmake_target(AliasTargets func func --config Release)
+run_cmake_target(AliasTargets lib-local lib-local --config Release)
+run_cmake_target(AliasTargets main-local main-local --config Release)
+run_cmake_target(AliasTargets lib-global lib-global --config Release)
+run_cmake_target(AliasTargets main-global main-global --config Release)
+unset(RunCMake_TEST_OPTIONS)
+unset(RunCMake_TEST_OUTPUT_MERGE)
diff --git a/Tests/RunCMake/target_link_libraries/func.c b/Tests/RunCMake/target_link_libraries-ALIAS/func.c
similarity index 100%
rename from Tests/RunCMake/target_link_libraries/func.c
rename to Tests/RunCMake/target_link_libraries-ALIAS/func.c
diff --git a/Tests/RunCMake/target_link_libraries-ALIAS/lib.c b/Tests/RunCMake/target_link_libraries-ALIAS/lib.c
new file mode 100644
index 0000000..b2d1b66
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries-ALIAS/lib.c
@@ -0,0 +1,10 @@
+
+#if defined(_WIN32)
+__declspec(dllimport)
+#endif
+  void func_c();
+
+void lib()
+{
+  func_c();
+}
diff --git a/Tests/RunCMake/target_link_libraries/main.c b/Tests/RunCMake/target_link_libraries-ALIAS/main.c
similarity index 100%
rename from Tests/RunCMake/target_link_libraries/main.c
rename to Tests/RunCMake/target_link_libraries-ALIAS/main.c
diff --git a/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/CMakeLists.txt b/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/CMakeLists.txt
new file mode 100644
index 0000000..9cf020f
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/CMakeLists.txt
@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 3.1)
+project(${RunCMake_TEST} NONE)
+include(${RunCMake_TEST}.cmake NO_POLICY_SCOPE)
diff --git a/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/RunCMakeTest.cmake b/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/RunCMakeTest.cmake
new file mode 100644
index 0000000..0f0e5d8
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/RunCMakeTest.cmake
@@ -0,0 +1,41 @@
+include(RunCMake)
+
+macro(run_cmake_target test subtest target)
+  set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${test}-build)
+  set(RunCMake_TEST_NO_CLEAN 1)
+  run_cmake_command(${test}-${subtest} ${CMAKE_COMMAND} --build . --target ${target} ${ARGN})
+
+  unset(RunCMake_TEST_BINARY_DIR)
+  unset(RunCMake_TEST_NO_CLEAN)
+endmacro()
+
+run_cmake(bad-usage)
+
+if (RunCMake_GENERATOR MATCHES "Makefiles|Ninja|Visual Studio|Xcode|Watcom WMake")
+
+  run_cmake(bad-mix-lang)
+
+  set(RunCMake_TEST_OUTPUT_MERGE TRUE)
+  if (NOT RunCMake_GENERATOR_IS_MULTI_CONFIG)
+    set(RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Release)
+  endif()
+
+  run_cmake(genex)
+
+  run_cmake_target(genex lib LinkLibraries_lib --config Release)
+  run_cmake_target(genex lib2 LinkLibraries_lib2 --config Release)
+  run_cmake_target(genex lib3 LinkLibraries_lib3 --config Release)
+  run_cmake_target(genex exe LinkLibraries_exe --config Release)
+  run_cmake_target(genex C_import LinkLibraries_C_import --config Release)
+  run_cmake_target(genex CXX_import LinkLibraries_CXX_import --config Release)
+  run_cmake_target(genex C_interface LinkLibraries_C_interface --config Release)
+  run_cmake_target(genex CXX_interface LinkLibraries_CXX_interface --config Release)
+  run_cmake_target(genex C_interface2 LinkLibraries_C_interface2 --config Release)
+  run_cmake_target(genex CXX_interface2 LinkLibraries_CXX_interface2 --config Release)
+  run_cmake_target(genex C_static LinkLibraries_C_static --config Release)
+  run_cmake_target(genex CXX_static LinkLibraries_CXX_static --config Release)
+
+  unset(RunCMake_TEST_OPTIONS)
+  unset(RunCMake_TEST_OUTPUT_MERGE)
+
+endif()
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang-result.txt b/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/bad-mix-lang-result.txt
similarity index 100%
rename from Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang-result.txt
rename to Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/bad-mix-lang-result.txt
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang-stderr.txt b/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/bad-mix-lang-stderr.txt
similarity index 100%
rename from Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang-stderr.txt
rename to Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/bad-mix-lang-stderr.txt
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang.cmake b/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/bad-mix-lang.cmake
similarity index 100%
rename from Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang.cmake
rename to Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/bad-mix-lang.cmake
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-usage-result.txt b/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/bad-usage-result.txt
similarity index 100%
rename from Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-usage-result.txt
rename to Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/bad-usage-result.txt
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-usage-stderr.txt b/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/bad-usage-stderr.txt
similarity index 71%
rename from Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-usage-stderr.txt
rename to Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/bad-usage-stderr.txt
index 469f1fe..d61f789 100644
--- a/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-usage-stderr.txt
+++ b/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/bad-usage-stderr.txt
@@ -1,4 +1,4 @@
-CMake Error at genex_LINK_LANGUAGE-bad-usage.cmake:4 \(target_link_libraries\):
+CMake Error at bad-usage.cmake:4 \(target_link_libraries\):
   Error evaluating generator expression:
 
     \$<LINK_LANGUAGE>
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-usage.cmake b/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/bad-usage.cmake
similarity index 100%
rename from Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-usage.cmake
rename to Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/bad-usage.cmake
diff --git a/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/empty.c b/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/empty.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/empty.c
diff --git a/Tests/RunCMake/target_link_libraries/func.c b/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/func.c
similarity index 100%
copy from Tests/RunCMake/target_link_libraries/func.c
copy to Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/func.c
diff --git a/Tests/RunCMake/target_link_libraries/func.cxx b/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/func.cxx
similarity index 100%
rename from Tests/RunCMake/target_link_libraries/func.cxx
rename to Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/func.cxx
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE.cmake b/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/genex.cmake
similarity index 100%
rename from Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE.cmake
rename to Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/genex.cmake
diff --git a/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/lib.c b/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/lib.c
new file mode 100644
index 0000000..b2d1b66
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/lib.c
@@ -0,0 +1,10 @@
+
+#if defined(_WIN32)
+__declspec(dllimport)
+#endif
+  void func_c();
+
+void lib()
+{
+  func_c();
+}
diff --git a/Tests/RunCMake/target_link_libraries/main.c b/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/main.c
similarity index 100%
copy from Tests/RunCMake/target_link_libraries/main.c
copy to Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/main.c
diff --git a/Tests/RunCMake/target_link_libraries/main.cxx b/Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/main.cxx
similarity index 100%
rename from Tests/RunCMake/target_link_libraries/main.cxx
rename to Tests/RunCMake/target_link_libraries-LINK_LANGUAGE/main.cxx
diff --git a/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/CMakeLists.txt b/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/CMakeLists.txt
new file mode 100644
index 0000000..9cf020f
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/CMakeLists.txt
@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 3.1)
+project(${RunCMake_TEST} NONE)
+include(${RunCMake_TEST}.cmake NO_POLICY_SCOPE)
diff --git a/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/RunCMakeTest.cmake b/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/RunCMakeTest.cmake
new file mode 100644
index 0000000..3b16f9e
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/RunCMakeTest.cmake
@@ -0,0 +1,38 @@
+include(RunCMake)
+
+macro(run_cmake_target test subtest target)
+  set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${test}-build)
+  set(RunCMake_TEST_NO_CLEAN 1)
+  run_cmake_command(${test}-${subtest} ${CMAKE_COMMAND} --build . --target ${target} ${ARGN})
+
+  unset(RunCMake_TEST_BINARY_DIR)
+  unset(RunCMake_TEST_NO_CLEAN)
+endmacro()
+
+if (RunCMake_GENERATOR MATCHES "Makefiles|Ninja|Visual Studio|Xcode|Watcom WMake")
+
+  run_cmake(bad-mix-lang)
+
+  set(RunCMake_TEST_OUTPUT_MERGE TRUE)
+  if (NOT RunCMake_GENERATOR_IS_MULTI_CONFIG)
+    set(RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Release)
+  endif()
+
+  run_cmake(genex)
+
+  run_cmake_target(genex lib LinkLibraries_lib --config Release)
+  run_cmake_target(genex lib2 LinkLibraries_lib2 --config Release)
+  run_cmake_target(genex lib3 LinkLibraries_lib3 --config Release)
+  run_cmake_target(genex exe LinkLibraries_exe --config Release)
+  run_cmake_target(genex C_import LinkLibraries_C_import --config Release)
+  run_cmake_target(genex CXX_import LinkLibraries_CXX_import --config Release)
+  run_cmake_target(genex C_interface LinkLibraries_C_interface --config Release)
+  run_cmake_target(genex CXX_interface LinkLibraries_CXX_interface --config Release)
+  run_cmake_target(genex C_interface2 LinkLibraries_C_interface2 --config Release)
+  run_cmake_target(genex CXX_interface2 LinkLibraries_CXX_interface2 --config Release)
+  run_cmake_target(genex CXX_static LinkLibraries_CXX_static --config Release)
+
+  unset(RunCMake_TEST_OPTIONS)
+  unset(RunCMake_TEST_OUTPUT_MERGE)
+
+endif()
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang-result.txt b/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/bad-mix-lang-result.txt
similarity index 100%
copy from Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang-result.txt
copy to Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/bad-mix-lang-result.txt
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang-stderr.txt b/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/bad-mix-lang-stderr.txt
similarity index 100%
copy from Tests/RunCMake/target_link_libraries/genex_LINK_LANGUAGE-bad-mix-lang-stderr.txt
copy to Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/bad-mix-lang-stderr.txt
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-bad-mix-lang.cmake b/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/bad-mix-lang.cmake
similarity index 100%
rename from Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-bad-mix-lang.cmake
rename to Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/bad-mix-lang.cmake
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-basic-result.txt b/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/basic-result.txt
similarity index 100%
rename from Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-basic-result.txt
rename to Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/basic-result.txt
diff --git a/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/empty.c b/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/empty.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/empty.c
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-exe_c-result.txt b/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/exe_c-result.txt
similarity index 100%
rename from Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-exe_c-result.txt
rename to Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/exe_c-result.txt
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-exe_cxx-result.txt b/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/exe_cxx-result.txt
similarity index 100%
rename from Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-exe_cxx-result.txt
rename to Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/exe_cxx-result.txt
diff --git a/Tests/RunCMake/target_link_libraries/func.c b/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/func.c
similarity index 100%
copy from Tests/RunCMake/target_link_libraries/func.c
copy to Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/func.c
diff --git a/Tests/RunCMake/target_link_libraries/func.cxx b/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/func.cxx
similarity index 100%
copy from Tests/RunCMake/target_link_libraries/func.cxx
copy to Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/func.cxx
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID.cmake b/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/genex.cmake
similarity index 100%
rename from Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID.cmake
rename to Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/genex.cmake
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-interface-result.txt b/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/interface-result.txt
similarity index 100%
rename from Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-interface-result.txt
rename to Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/interface-result.txt
diff --git a/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/lib.c b/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/lib.c
new file mode 100644
index 0000000..b2d1b66
--- /dev/null
+++ b/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/lib.c
@@ -0,0 +1,10 @@
+
+#if defined(_WIN32)
+__declspec(dllimport)
+#endif
+  void func_c();
+
+void lib()
+{
+  func_c();
+}
diff --git a/Tests/RunCMake/target_link_libraries/main.c b/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/main.c
similarity index 100%
copy from Tests/RunCMake/target_link_libraries/main.c
copy to Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/main.c
diff --git a/Tests/RunCMake/target_link_libraries/main.cxx b/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/main.cxx
similarity index 100%
copy from Tests/RunCMake/target_link_libraries/main.cxx
copy to Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/main.cxx
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-no_language-result.txt b/Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/no_language-result.txt
similarity index 100%
rename from Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-no_language-result.txt
rename to Tests/RunCMake/target_link_libraries-LINK_LANG_AND_ID/no_language-result.txt
diff --git a/Tests/RunCMake/target_link_libraries/RunCMakeTest.cmake b/Tests/RunCMake/target_link_libraries/RunCMakeTest.cmake
index 1f4077c..189592d 100644
--- a/Tests/RunCMake/target_link_libraries/RunCMakeTest.cmake
+++ b/Tests/RunCMake/target_link_libraries/RunCMakeTest.cmake
@@ -30,71 +30,3 @@
 run_cmake(StaticPrivateDepNotTarget)
 run_cmake(UNKNOWN-IMPORTED-GLOBAL)
 run_cmake(empty_keyword_args)
-
-macro(run_cmake_target test subtest target)
-  set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${test}-build)
-  set(RunCMake_TEST_NO_CLEAN 1)
-  run_cmake_command(${test}-${subtest} ${CMAKE_COMMAND} --build . --target ${target} ${ARGN})
-
-  unset(RunCMake_TEST_BINARY_DIR)
-  unset(RunCMake_TEST_NO_CLEAN)
-endmacro()
-
-set(RunCMake_TEST_OUTPUT_MERGE TRUE)
-if (NOT RunCMake_GENERATOR_IS_MULTI_CONFIG)
-  set(RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Release)
-endif()
-run_cmake(AliasTargets)
-run_cmake_target(AliasTargets func func --config Release)
-run_cmake_target(AliasTargets lib-local lib-local --config Release)
-run_cmake_target(AliasTargets main-local main-local --config Release)
-run_cmake_target(AliasTargets lib-global lib-global --config Release)
-run_cmake_target(AliasTargets main-global main-global --config Release)
-unset(RunCMake_TEST_OPTIONS)
-unset(RunCMake_TEST_OUTPUT_MERGE)
-
-run_cmake(genex_LINK_LANGUAGE-bad-usage)
-
-if (RunCMake_GENERATOR MATCHES "Makefiles|Ninja|Visual Studio|Xcode|Watcom WMake")
-
-  run_cmake(genex_LINK_LANGUAGE-bad-mix-lang)
-  run_cmake(genex_LINK_LANG_AND_ID-bad-mix-lang)
-
-  set(RunCMake_TEST_OUTPUT_MERGE TRUE)
-  if (NOT RunCMake_GENERATOR_IS_MULTI_CONFIG)
-    set(RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Release)
-  endif()
-
-  run_cmake(genex_LINK_LANGUAGE)
-
-  run_cmake_target(genex_LINK_LANGUAGE lib LinkLibraries_lib --config Release)
-  run_cmake_target(genex_LINK_LANGUAGE lib2 LinkLibraries_lib2 --config Release)
-  run_cmake_target(genex_LINK_LANGUAGE lib3 LinkLibraries_lib3 --config Release)
-  run_cmake_target(genex_LINK_LANGUAGE exe LinkLibraries_exe --config Release)
-  run_cmake_target(genex_LINK_LANGUAGE C_import LinkLibraries_C_import --config Release)
-  run_cmake_target(genex_LINK_LANGUAGE CXX_import LinkLibraries_CXX_import --config Release)
-  run_cmake_target(genex_LINK_LANGUAGE C_interface LinkLibraries_C_interface --config Release)
-  run_cmake_target(genex_LINK_LANGUAGE CXX_interface LinkLibraries_CXX_interface --config Release)
-  run_cmake_target(genex_LINK_LANGUAGE C_interface2 LinkLibraries_C_interface2 --config Release)
-  run_cmake_target(genex_LINK_LANGUAGE CXX_interface2 LinkLibraries_CXX_interface2 --config Release)
-  run_cmake_target(genex_LINK_LANGUAGE C_static LinkLibraries_C_static --config Release)
-  run_cmake_target(genex_LINK_LANGUAGE CXX_static LinkLibraries_CXX_static --config Release)
-
-  run_cmake(genex_LINK_LANG_AND_ID)
-
-  run_cmake_target(genex_LINK_LANG_AND_ID lib LinkLibraries_lib --config Release)
-  run_cmake_target(genex_LINK_LANG_AND_ID lib2 LinkLibraries_lib2 --config Release)
-  run_cmake_target(genex_LINK_LANG_AND_ID lib3 LinkLibraries_lib3 --config Release)
-  run_cmake_target(genex_LINK_LANG_AND_ID exe LinkLibraries_exe --config Release)
-  run_cmake_target(genex_LINK_LANG_AND_ID C_import LinkLibraries_C_import --config Release)
-  run_cmake_target(genex_LINK_LANG_AND_ID CXX_import LinkLibraries_CXX_import --config Release)
-  run_cmake_target(genex_LINK_LANG_AND_ID C_interface LinkLibraries_C_interface --config Release)
-  run_cmake_target(genex_LINK_LANG_AND_ID CXX_interface LinkLibraries_CXX_interface --config Release)
-  run_cmake_target(genex_LINK_LANG_AND_ID C_interface2 LinkLibraries_C_interface2 --config Release)
-  run_cmake_target(genex_LINK_LANG_AND_ID CXX_interface2 LinkLibraries_CXX_interface2 --config Release)
-  run_cmake_target(genex_LINK_LANG_AND_ID CXX_static LinkLibraries_CXX_static --config Release)
-
-  unset(RunCMake_TEST_OPTIONS)
-  unset(RunCMake_TEST_OUTPUT_MERGE)
-
-endif()
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-bad-mix-lang-result.txt b/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-bad-mix-lang-result.txt
deleted file mode 100644
index d00491f..0000000
--- a/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-bad-mix-lang-result.txt
+++ /dev/null
@@ -1 +0,0 @@
-1
diff --git a/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-bad-mix-lang-stderr.txt b/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-bad-mix-lang-stderr.txt
deleted file mode 100644
index 2ecdc0c..0000000
--- a/Tests/RunCMake/target_link_libraries/genex_LINK_LANG_AND_ID-bad-mix-lang-stderr.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-CMake Error: Evaluation of \$<LINK_LANGUAGE:...> or \$<LINK_LAND_AND_ID:...> changes
-the linker language for target "LinkLibraries_bad_mix_languages" \(from 'C' to 'CXX'\) which is invalid.