Browse Source

Merge topic 'LINKER_TYPE-mold-support'

801ae06952 LINKER_TYPE: Support MOLD only on GCC versions that support it
939ac5287e LINKER_TYPE: fix spelling error in message
922883782b LINKER_TYPE: Document that linker tool should be in the PATH

Acked-by: Kitware Robot <[email protected]>
Merge-request: !9334
Brad King 1 year ago
parent
commit
8526943b8c

+ 6 - 0
Help/variable/CMAKE_LANG_USING_LINKER_TYPE.rst

@@ -9,6 +9,12 @@ property :prop_tgt:`LINKER_TYPE`. It can hold compiler flags for the link step
 or directly the linker tool. The type of data is given by the variable
 or directly the linker tool. The type of data is given by the variable
 :variable:`CMAKE_<LANG>_USING_LINKER_MODE`.
 :variable:`CMAKE_<LANG>_USING_LINKER_MODE`.
 
 
+.. note::
+
+  The specified linker tool is expected to be accessible through
+  the ``PATH`` environment variable, particularly when the
+  :variable:`CMAKE_<LANG>_USING_LINKER_MODE` variable is set to ``FLAG``.
+
 For example, to specify the ``LLVM`` linker for ``GNU`` compilers, we have:
 For example, to specify the ``LLVM`` linker for ``GNU`` compilers, we have:
 
 
 .. code-block:: cmake
 .. code-block:: cmake

+ 4 - 1
Modules/Platform/Linux-GNU.cmake

@@ -20,5 +20,8 @@ macro(__linux_compiler_gnu lang)
   set(CMAKE_${lang}_USING_LINKER_LLD "-fuse-ld=lld")
   set(CMAKE_${lang}_USING_LINKER_LLD "-fuse-ld=lld")
   set(CMAKE_${lang}_USING_LINKER_BFD "-fuse-ld=bfd")
   set(CMAKE_${lang}_USING_LINKER_BFD "-fuse-ld=bfd")
   set(CMAKE_${lang}_USING_LINKER_GOLD "-fuse-ld=gold")
   set(CMAKE_${lang}_USING_LINKER_GOLD "-fuse-ld=gold")
-  set(CMAKE_${lang}_USING_LINKER_MOLD "-fuse-ld=mold")
+  if(NOT CMAKE_${lang}_COMPILER_ID STREQUAL "GNU"
+      OR CMAKE_${lang}_COMPILER_VERSION VERSION_GREATER_EQUAL "12.1")
+    set(CMAKE_${lang}_USING_LINKER_MOLD "-fuse-ld=mold")
+  endif()
 endmacro()
 endmacro()

+ 17 - 5
Source/cmGeneratorTarget.cxx

@@ -5,6 +5,7 @@
 #include <algorithm>
 #include <algorithm>
 #include <array>
 #include <array>
 #include <cassert>
 #include <cassert>
+#include <cctype>
 #include <cerrno>
 #include <cerrno>
 #include <cstddef>
 #include <cstddef>
 #include <cstdio>
 #include <cstdio>
@@ -5585,11 +5586,22 @@ std::string cmGeneratorTarget::GetLinkerTool(const std::string& lang,
     linkerTool = this->Makefile->GetDefinition("CMAKE_LINKER");
     linkerTool = this->Makefile->GetDefinition("CMAKE_LINKER");
 
 
     if (linkerType != "DEFAULT"_s) {
     if (linkerType != "DEFAULT"_s) {
-      this->LocalGenerator->IssueMessage(
-        MessageType::FATAL_ERROR,
-        cmStrCat("LINKER_TYPE '", linkerType,
-                 "' is unknown. Did you forgot to define '", usingLinker,
-                 "' variable?"));
+      auto isCMakeLinkerType = [](const std::string& type) -> bool {
+        return std::all_of(type.cbegin(), type.cend(),
+                           [](char c) { return std::isupper(c); });
+      };
+      if (isCMakeLinkerType(linkerType)) {
+        this->LocalGenerator->IssueMessage(
+          MessageType::FATAL_ERROR,
+          cmStrCat("LINKER_TYPE '", linkerType,
+                   "' is unknown or not supported by this toolchain."));
+      } else {
+        this->LocalGenerator->IssueMessage(
+          MessageType::FATAL_ERROR,
+          cmStrCat("LINKER_TYPE '", linkerType,
+                   "' is unknown. Did you forget to define the '", usingLinker,
+                   "' variable?"));
+      }
     }
     }
   }
   }
 
 

+ 17 - 4
Source/cmLocalGenerator.cxx

@@ -5,6 +5,7 @@
 #include <algorithm>
 #include <algorithm>
 #include <array>
 #include <array>
 #include <cassert>
 #include <cassert>
+#include <cctype>
 #include <cstdio>
 #include <cstdio>
 #include <cstdlib>
 #include <cstdlib>
 #include <initializer_list>
 #include <initializer_list>
@@ -3356,10 +3357,22 @@ void cmLocalGenerator::AppendLinkerTypeFlags(std::string& flags,
       this->AppendFlags(flags, linkerFlags);
       this->AppendFlags(flags, linkerFlags);
     }
     }
   } else if (linkerType != "DEFAULT"_s) {
   } else if (linkerType != "DEFAULT"_s) {
-    this->IssueMessage(MessageType::FATAL_ERROR,
-                       cmStrCat("LINKER_TYPE '", linkerType,
-                                "' is unknown. Did you forgot to define '",
-                                usingLinker, "' variable?"));
+    auto isCMakeLinkerType = [](const std::string& type) -> bool {
+      return std::all_of(type.cbegin(), type.cend(),
+                         [](char c) { return std::isupper(c); });
+    };
+    if (isCMakeLinkerType(linkerType)) {
+      this->IssueMessage(
+        MessageType::FATAL_ERROR,
+        cmStrCat("LINKER_TYPE '", linkerType,
+                 "' is unknown or not supported by this toolchain."));
+    } else {
+      this->IssueMessage(
+        MessageType::FATAL_ERROR,
+        cmStrCat("LINKER_TYPE '", linkerType,
+                 "' is unknown. Did you forget to define the '", usingLinker,
+                 "' variable?"));
+    }
   }
   }
 }
 }
 
 

+ 0 - 3
Tests/RunCMake/LinkerSelection/InvalidLinkerType-stderr.txt

@@ -1,3 +0,0 @@
-CMake Error in CMakeLists.txt:
-  LINKER_TYPE 'FOO' is unknown.  Did you forgot to define
-  'CMAKE_C_USING_LINKER_FOO' variable\?

+ 0 - 0
Tests/RunCMake/LinkerSelection/InvalidLinkerType-result.txt → Tests/RunCMake/LinkerSelection/InvalidLinkerType1-result.txt


+ 2 - 0
Tests/RunCMake/LinkerSelection/InvalidLinkerType1-stderr.txt

@@ -0,0 +1,2 @@
+CMake Error in CMakeLists.txt:
+  LINKER_TYPE 'FOO' is unknown or not supported by this toolchain.

+ 0 - 0
Tests/RunCMake/LinkerSelection/InvalidLinkerType.cmake → Tests/RunCMake/LinkerSelection/InvalidLinkerType1.cmake


+ 1 - 0
Tests/RunCMake/LinkerSelection/InvalidLinkerType2-result.txt

@@ -0,0 +1 @@
+1

+ 3 - 0
Tests/RunCMake/LinkerSelection/InvalidLinkerType2-stderr.txt

@@ -0,0 +1,3 @@
+CMake Error in CMakeLists.txt:
+  LINKER_TYPE 'foo' is unknown.  Did you forget to define the
+  'CMAKE_C_USING_LINKER_foo' variable\?

+ 5 - 0
Tests/RunCMake/LinkerSelection/InvalidLinkerType2.cmake

@@ -0,0 +1,5 @@
+
+enable_language(C)
+
+set(CMAKE_LINKER_TYPE foo)
+add_executable(main main.c)

+ 2 - 1
Tests/RunCMake/LinkerSelection/RunCMakeTest.cmake

@@ -5,7 +5,8 @@ if (RunCMake_GENERATOR MATCHES "Visual Studio 9 2008")
   return()
   return()
 endif()
 endif()
 
 
-run_cmake(InvalidLinkerType)
+run_cmake(InvalidLinkerType1)
+run_cmake(InvalidLinkerType2)
 
 
 # look-up for LLVM linker
 # look-up for LLVM linker
 if (WIN32)
 if (WIN32)