Browse Source

link dependencies: deactivate the feature

Unfortunately it breaks in combination with LTO due to a bug in the GNU
linker.

Fixes: #25014
Marc Chevrier 2 years ago
parent
commit
5945a98ced

+ 8 - 0
Help/variable/CMAKE_LINK_DEPENDS_USE_LINKER.rst

@@ -10,3 +10,11 @@ variable with value ``FALSE``, you can deactivate this feature.
 
 This feature is also deactivated if the :prop_tgt:`LINK_DEPENDS_NO_SHARED`
 target property is true.
+
+.. note::
+
+  CMake version |release| defaults this variable to ``FALSE`` because
+  GNU binutils linkers (``ld``, ``ld.bfd``, ``ld.gold``) generate spurious
+  dependencies on temporary files when LTO is enabled.  See `GNU bug 30568`_.
+
+.. _`GNU bug 30568`: https://sourceware.org/bugzilla/show_bug.cgi?id=30568

+ 10 - 3
Modules/Compiler/GNU.cmake

@@ -53,6 +53,9 @@ macro(__compiler_gnu lang)
   endif()
 
   # define flags for linker depfile generation
+  set(CMAKE_${lang}_LINKER_DEPFILE_FLAGS "LINKER:--dependency-file,<DEP_FILE>")
+  set(CMAKE_${lang}_LINKER_DEPFILE_FORMAT gcc)
+
   if(NOT DEFINED CMAKE_${lang}_LINKER_DEPFILE_SUPPORTED)
     ## Ensure ninja tool is recent enough...
     if(CMAKE_GENERATOR MATCHES "^Ninja")
@@ -82,15 +85,19 @@ macro(__compiler_gnu lang)
       unset(_linker_capabilities)
     endif()
   endif()
-
   if (CMAKE_${lang}_LINKER_DEPFILE_SUPPORTED)
-    set(CMAKE_${lang}_LINKER_DEPFILE_FLAGS "LINKER:--dependency-file,<DEP_FILE>")
-    set(CMAKE_${lang}_LINKER_DEPFILE_FORMAT gcc)
     set(CMAKE_${lang}_LINK_DEPENDS_USE_LINKER TRUE)
   else()
     unset(CMAKE_${lang}_LINK_DEPENDS_USE_LINKER)
   endif()
 
+  # For now, due to GNU binutils ld bug when LTO is enabled (see GNU bug
+    # `30568 <https://sourceware.org/bugzilla/show_bug.cgi?id=30568>`_),
+  # deactivate this feature.
+  if (NOT DEFINED CMAKE_LINK_DEPENDS_USE_LINKER)
+    set(CMAKE_LINK_DEPENDS_USE_LINKER FALSE)
+  endif()
+
   # Initial configuration flags.
   string(APPEND CMAKE_${lang}_FLAGS_INIT " ")
   string(APPEND CMAKE_${lang}_FLAGS_DEBUG_INIT " -g")

+ 2 - 1
Tests/RunCMake/BuildDepends/LinkDependsCheck.cmake

@@ -2,7 +2,8 @@
 enable_language(C)
 
 file(WRITE "${CMAKE_BINARY_DIR}/LinkDependsUseLinker.cmake"
-     "set(CMAKE_C_LINK_DEPENDS_USE_LINKER \"${CMAKE_C_LINK_DEPENDS_USE_LINKER}\")\n")
+     "set(CMAKE_LINK_DEPENDS_USE_LINKER ${CMAKE_LINK_DEPENDS_USE_LINKER})
+set(CMAKE_C_LINK_DEPENDS_USE_LINKER ${CMAKE_C_LINK_DEPENDS_USE_LINKER})\n")
 
 
 file(GENERATE  OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/check-$<LOWER_CASE:$<CONFIG>>.cmake"

+ 2 - 2
Tests/RunCMake/BuildDepends/RunCMakeTest.cmake

@@ -199,12 +199,12 @@ endif()
 run_BuildDepends(CustomCommandUnityBuild)
 unset(run_BuildDepends_skip_step_2)
 
-#if (RunCMake_GENERATOR MATCHES "Make|Ninja" AND CMAKE_C_LINK_DEPENDS_USE_LINKER)
 if (RunCMake_GENERATOR MATCHES "Make|Ninja")
   set(run_BuildDepends_skip_step_2 1)
   run_BuildDepends(LinkDependsCheck)
   include("${RunCMake_BINARY_DIR}/LinkDependsCheck-build/LinkDependsUseLinker.cmake")
-  if (CMAKE_C_LINK_DEPENDS_USE_LINKER)
+  if ((NOT DEFINED CMAKE_LINK_DEPENDS_USE_LINKER OR CMAKE_LINK_DEPENDS_USE_LINKER)
+      AND CMAKE_C_LINK_DEPENDS_USE_LINKER)
     run_BuildDepends(LinkDependsExternalLibrary)
     unset(run_BuildDepends_skip_step_2)
     run_BuildDepends(LinkDepends)