Merge topic 'linker-configuration-enhancements' into release-3.31

0619c064ff Linker configuration: enhance usability

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: buildbot <buildbot@kitware.com>
Merge-request: !9937
diff --git a/Modules/CMakeASMInformation.cmake b/Modules/CMakeASMInformation.cmake
index 2dc1585..7030034 100644
--- a/Modules/CMakeASMInformation.cmake
+++ b/Modules/CMakeASMInformation.cmake
@@ -96,5 +96,6 @@
   set(CMAKE_EXECUTABLE_RPATH_LINK_ASM${ASM_DIALECT}_FLAG ${CMAKE_SHARED_LIBRARY_RPATH_LINK_ASM${ASM_DIALECT}_FLAG})
 endif()
 
+set(CMAKE_ASM${ASM_DIALECT}_USE_LINKER_INFORMATION TRUE)
 
 set(CMAKE_ASM${ASM_DIALECT}_INFOMATION_LOADED 1)
diff --git a/Modules/CMakeAddNewLanguage.txt b/Modules/CMakeAddNewLanguage.txt
index b0be590..011195c 100644
--- a/Modules/CMakeAddNewLanguage.txt
+++ b/Modules/CMakeAddNewLanguage.txt
@@ -20,12 +20,20 @@
   This file is used to store compiler information and is copied down into try
   compile directories so that try compiles do not need to re-determine and test the LANG
 
-CMakeTest(LANG)Compiler.cmake -> test the compiler and set:
-  SET(CMAKE_(LANG)_COMPILER_WORKS 1 CACHE INTERNAL "")
-
-CMake(LANG)Information.cmake  -> set up rule variables for LANG :
+CMake(LANG)Information.cmake => set compiler configuration:
   CMAKE_(LANG)_CREATE_SHARED_LIBRARY
   CMAKE_(LANG)_CREATE_SHARED_MODULE
   CMAKE_(LANG)_CREATE_STATIC_LIBRARY
   CMAKE_(LANG)_COMPILE_OBJECT
   CMAKE_(LANG)_LINK_EXECUTABLE
+
+  CMAKE_(LANG)_USE_LINKER_INFORMATION
+
+CMakeTest(LANG)Compiler.cmake -> test the compiler and set:
+  SET(CMAKE_(LANG)_COMPILER_WORKS 1 CACHE INTERNAL "")
+
+
+If the variable CMAKE_(LANG)_USE_LINKER_INFORMATION has value TRUE, the file CMake(LANG)LinkerInformation.cmake
+should be defined.
+
+CMake(LANG)LinkerInformation.cmake  -> set up linker configuration for LANG.
diff --git a/Modules/CMakeCInformation.cmake b/Modules/CMakeCInformation.cmake
index 72fb801..977e51a 100644
--- a/Modules/CMakeCInformation.cmake
+++ b/Modules/CMakeCInformation.cmake
@@ -175,4 +175,6 @@
     "<CMAKE_C_COMPILER> <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
 endif()
 
+set(CMAKE_C_USE_LINKER_INFORMATION TRUE)
+
 set(CMAKE_C_INFORMATION_LOADED 1)
diff --git a/Modules/CMakeCSharpInformation.cmake b/Modules/CMakeCSharpInformation.cmake
index 41cd449..f698bdf 100644
--- a/Modules/CMakeCSharpInformation.cmake
+++ b/Modules/CMakeCSharpInformation.cmake
@@ -64,4 +64,7 @@
 set(CMAKE_CSharp_LINK_EXECUTABLE "CSharp_NO_LINK_EXECUTABLE")
 
 set(CMAKE_CSharp_USE_RESPONSE_FILE_FOR_OBJECTS 1)
+
+set(CMAKE_CSharp_USE_LINKER_INFORMATION FALSE)
+
 set(CMAKE_CSharp_INFORMATION_LOADED 1)
diff --git a/Modules/CMakeCUDAInformation.cmake b/Modules/CMakeCUDAInformation.cmake
index 66a5faa..fa197b2 100644
--- a/Modules/CMakeCUDAInformation.cmake
+++ b/Modules/CMakeCUDAInformation.cmake
@@ -150,4 +150,6 @@
 
 unset(__IMPLICIT_DLINK_FLAGS)
 
+set(CMAKE_CUDA_USE_LINKER_INFORMATION TRUE)
+
 set(CMAKE_CUDA_INFORMATION_LOADED 1)
diff --git a/Modules/CMakeCXXInformation.cmake b/Modules/CMakeCXXInformation.cmake
index e521fb8..cc130ae 100644
--- a/Modules/CMakeCXXInformation.cmake
+++ b/Modules/CMakeCXXInformation.cmake
@@ -183,4 +183,6 @@
 CMAKE_VERBOSE_MAKEFILE
 )
 
+set(CMAKE_CXX_USE_LINKER_INFORMATION TRUE)
+
 set(CMAKE_CXX_INFORMATION_LOADED 1)
diff --git a/Modules/CMakeFortranInformation.cmake b/Modules/CMakeFortranInformation.cmake
index 984a39d..a376e10 100644
--- a/Modules/CMakeFortranInformation.cmake
+++ b/Modules/CMakeFortranInformation.cmake
@@ -129,5 +129,7 @@
   mark_as_advanced(CMAKE_Fortran_STANDARD_LIBRARIES)
 endif()
 
+set(CMAKE_Fortran_USE_LINKER_INFORMATION TRUE)
+
 # set this variable so we can avoid loading this more than once.
 set(CMAKE_Fortran_INFORMATION_LOADED 1)
diff --git a/Modules/CMakeHIPInformation.cmake b/Modules/CMakeHIPInformation.cmake
index dc76c63..c013df8 100644
--- a/Modules/CMakeHIPInformation.cmake
+++ b/Modules/CMakeHIPInformation.cmake
@@ -98,6 +98,8 @@
     "<CMAKE_HIP_COMPILER> <FLAGS> <CMAKE_HIP_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
 endif()
 
+set(CMAKE_HIP_USE_LINKER_INFORMATION TRUE)
+
 set(CMAKE_HIP_INFORMATION_LOADED 1)
 
 # Load the file and find the relevant HIP runtime.
diff --git a/Modules/CMakeISPCInformation.cmake b/Modules/CMakeISPCInformation.cmake
index 5acb682..4a4b72a 100644
--- a/Modules/CMakeISPCInformation.cmake
+++ b/Modules/CMakeISPCInformation.cmake
@@ -62,4 +62,6 @@
     "<CMAKE_ISPC_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> --emit-obj <SOURCE> -h <ISPC_HEADER>")
 endif()
 
+set(CMAKE_ISPC_USE_LINKER_INFORMATION FALSE)
+
 set(CMAKE_ISPC_INFORMATION_LOADED 1)
diff --git a/Modules/CMakeJavaInformation.cmake b/Modules/CMakeJavaInformation.cmake
index 989afc1..0ca8395 100644
--- a/Modules/CMakeJavaInformation.cmake
+++ b/Modules/CMakeJavaInformation.cmake
@@ -47,3 +47,5 @@
 else()
   set(CMAKE_INCLUDE_FLAG_SEP_Java ":")
 endif()
+
+set(CMAKE_Java_USE_LINKER_INFORMATION FALSE)
diff --git a/Modules/CMakeOBJCInformation.cmake b/Modules/CMakeOBJCInformation.cmake
index bcb8b11..56e8239 100644
--- a/Modules/CMakeOBJCInformation.cmake
+++ b/Modules/CMakeOBJCInformation.cmake
@@ -187,4 +187,6 @@
   set(CMAKE_EXECUTABLE_RPATH_LINK_OBJC_FLAG ${CMAKE_SHARED_LIBRARY_RPATH_LINK_OBJC_FLAG})
 endif()
 
+set(CMAKE_OBJC_USE_LINKER_INFORMATION TRUE)
+
 set(CMAKE_OBJC_INFORMATION_LOADED 1)
diff --git a/Modules/CMakeOBJCXXInformation.cmake b/Modules/CMakeOBJCXXInformation.cmake
index 4fcd469..a242dab 100644
--- a/Modules/CMakeOBJCXXInformation.cmake
+++ b/Modules/CMakeOBJCXXInformation.cmake
@@ -179,4 +179,6 @@
 CMAKE_VERBOSE_MAKEFILE
 )
 
+set(CMAKE_OBJCXX_USE_LINKER_INFORMATION TRUE)
+
 set(CMAKE_OBJCXX_INFORMATION_LOADED 1)
diff --git a/Modules/CMakeRCInformation.cmake b/Modules/CMakeRCInformation.cmake
index b634796..d716469 100644
--- a/Modules/CMakeRCInformation.cmake
+++ b/Modules/CMakeRCInformation.cmake
@@ -46,5 +46,7 @@
     "<CMAKE_RC_COMPILER> <DEFINES> <INCLUDES> <FLAGS> /fo <OBJECT> <SOURCE>")
 endif()
 
+set(CMAKE_RC_USE_LINKER_INFORMATION FALSE)
+
 # set this variable so we can avoid loading this more than once.
 set(CMAKE_RC_INFORMATION_LOADED 1)
diff --git a/Modules/CMakeSwiftInformation.cmake b/Modules/CMakeSwiftInformation.cmake
index a46d298..904a528 100644
--- a/Modules/CMakeSwiftInformation.cmake
+++ b/Modules/CMakeSwiftInformation.cmake
@@ -172,4 +172,6 @@
   endif()
 endif()
 
+set(CMAKE_Swift_USE_LINKER_INFORMATION TRUE)
+
 set(CMAKE_Swift_INFORMATION_LOADED 1)
diff --git a/Modules/Internal/CMakeCSharpLinkerInformation.cmake b/Modules/Internal/CMakeCSharpLinkerInformation.cmake
deleted file mode 100644
index ff73a37..0000000
--- a/Modules/Internal/CMakeCSharpLinkerInformation.cmake
+++ /dev/null
@@ -1,8 +0,0 @@
-# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
-# file Copyright.txt or https://cmake.org/licensing for details.
-
-
-# This file sets the basic flags for the linker used by the CSharp compiler in CMake.
-# For now, nothing to define
-
-set(CMAKE_CSharp_LINKER_INFORMATION_LOADED 1)
diff --git a/Modules/Internal/CMakeISPCLinkerInformation.cmake b/Modules/Internal/CMakeISPCLinkerInformation.cmake
deleted file mode 100644
index 47950aa..0000000
--- a/Modules/Internal/CMakeISPCLinkerInformation.cmake
+++ /dev/null
@@ -1,8 +0,0 @@
-# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
-# file Copyright.txt or https://cmake.org/licensing for details.
-
-
-# This file sets the basic flags for the linker used by the ISPC compiler in CMake.
-# For now, ISPC is not able to handle the link step
-
-set(CMAKE_ISPC_LINKER_INFORMATION_LOADED 1)
diff --git a/Modules/Internal/CMakeJavaLinkerInformation.cmake b/Modules/Internal/CMakeJavaLinkerInformation.cmake
deleted file mode 100644
index c0edadd..0000000
--- a/Modules/Internal/CMakeJavaLinkerInformation.cmake
+++ /dev/null
@@ -1,5 +0,0 @@
-# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
-# file Copyright.txt or https://cmake.org/licensing for details.
-
-
-# Java language does not have a concept of linker, so nothing to configure.
diff --git a/Modules/Internal/CMakeRCLinkerInformation.cmake b/Modules/Internal/CMakeRCLinkerInformation.cmake
deleted file mode 100644
index 1b0563e..0000000
--- a/Modules/Internal/CMakeRCLinkerInformation.cmake
+++ /dev/null
@@ -1,17 +0,0 @@
-# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
-# file Copyright.txt or https://cmake.org/licensing for details.
-
-
-# This file sets the basic flags for the linker used by the C compiler in CMake.
-# It also loads the available platform file for the system-linker
-# if it exists.
-# It also loads a system - linker - processor (or target hardware)
-# specific file, which is mainly useful for crosscompiling and embedded systems.
-
-include(Internal/CMakeCommonLinkerInformation)
-
-set(_INCLUDED_FILE 0)
-
-# Foe now, no linker associated with RC language
-
-set(CMAKE_RC_LINKER_INFORMATION_LOADED 1)
diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx
index ec44817..e3a38b0 100644
--- a/Source/cmGlobalGenerator.cxx
+++ b/Source/cmGlobalGenerator.cxx
@@ -963,18 +963,24 @@
       } // end if in try compile
     }   // end need test language
 
-    // load linker configuration
-    std::string langLinkerLoadedVar =
-      cmStrCat("CMAKE_", lang, "_LINKER_INFORMATION_LOADED");
-    if (!mf->GetDefinition(langLinkerLoadedVar)) {
-      fpath = cmStrCat("Internal/CMake", lang, "LinkerInformation.cmake");
-      std::string informationFile = mf->GetModulesFile(fpath);
-      if (informationFile.empty()) {
-        cmSystemTools::Error(
-          cmStrCat("Could not find cmake module file: ", fpath));
-      } else if (!mf->ReadListFile(informationFile)) {
-        cmSystemTools::Error(
-          cmStrCat("Could not process cmake module file: ", informationFile));
+    // load linker configuration,  if required
+    if (mf->GetDefinition(cmStrCat("CMAKE_", lang, "_USE_LINKER_INFORMATION"))
+          .IsOn()) {
+      std::string langLinkerLoadedVar =
+        cmStrCat("CMAKE_", lang, "_LINKER_INFORMATION_LOADED");
+      if (!mf->GetDefinition(langLinkerLoadedVar)) {
+        fpath = cmStrCat("CMake", lang, "LinkerInformation.cmake");
+        std::string informationFile = mf->GetModulesFile(fpath);
+        if (informationFile.empty()) {
+          informationFile = mf->GetModulesFile(cmStrCat("Internal/", fpath));
+        }
+        if (informationFile.empty()) {
+          cmSystemTools::Error(
+            cmStrCat("Could not find cmake module file: ", fpath));
+        } else if (!mf->ReadListFile(informationFile)) {
+          cmSystemTools::Error(cmStrCat(
+            "Could not process cmake module file: ", informationFile));
+        }
       }
     }