Browse Source

Linker: Save GNU push-/pop-state detection with compiler inspection results

Previously we saved it in the cache, which:

* Persists even if a new version of CMake changes how the check works.
* Does not propagate to `try_compile` checks.
Marc Chevrier 8 months ago
parent
commit
7b552b9a64

+ 2 - 0
Modules/CMakeASMCompiler.cmake.in

@@ -24,5 +24,7 @@ set(CMAKE_ASM@ASM_DIALECT@_COMPILER_ENV_VAR "@_CMAKE_ASM_COMPILER_ENV_VAR@")
 set(CMAKE_ASM@ASM_DIALECT@_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC)
 set(CMAKE_ASM@ASM_DIALECT@_LINKER_PREFERENCE 0)
 set(CMAKE_ASM@ASM_DIALECT@_LINKER_DEPFILE_SUPPORTED @_CMAKE_ASM_LINKER_DEPFILE_SUPPORTED@)
+set(CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED @CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED@)
+set(CMAKE_ASM@ASM_DIALECT@_LINKER_PUSHPOP_STATE_SUPPORTED @_CMAKE_ASM_LINKER_PUSHPOP_STATE_SUPPORTED@)
 
 @CMAKE_ASM_COMPILER_CUSTOM_CODE@

+ 2 - 0
Modules/CMakeCCompiler.cmake.in

@@ -47,6 +47,8 @@ set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m)
 set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC)
 set(CMAKE_C_LINKER_PREFERENCE 10)
 set(CMAKE_C_LINKER_DEPFILE_SUPPORTED @CMAKE_C_LINKER_DEPFILE_SUPPORTED@)
+set(CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED @CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED@)
+set(CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED @CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED@)
 
 # Save compiler ABI information.
 set(CMAKE_C_SIZEOF_DATA_PTR "@CMAKE_C_SIZEOF_DATA_PTR@")

+ 2 - 0
Modules/CMakeCUDACompiler.cmake.in

@@ -35,6 +35,8 @@ set(CMAKE_CUDA_SOURCE_FILE_EXTENSIONS cu)
 set(CMAKE_CUDA_LINKER_PREFERENCE 15)
 set(CMAKE_CUDA_LINKER_PREFERENCE_PROPAGATES 1)
 set(CMAKE_CUDA_LINKER_DEPFILE_SUPPORTED @CMAKE_CUDA_LINKER_DEPFILE_SUPPORTED@)
+set(CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED @CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED@)
+set(CMAKE_CUDA_LINKER_PUSHPOP_STATE_SUPPORTED @CMAKE_CUDA_LINKER_PUSHPOP_STATE_SUPPORTED@)
 
 set(CMAKE_CUDA_SIZEOF_DATA_PTR "@CMAKE_CUDA_SIZEOF_DATA_PTR@")
 set(CMAKE_CUDA_COMPILER_ABI "@CMAKE_CUDA_COMPILER_ABI@")

+ 2 - 0
Modules/CMakeCXXCompiler.cmake.in

@@ -59,6 +59,8 @@ endforeach()
 set(CMAKE_CXX_LINKER_PREFERENCE 30)
 set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1)
 set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED @CMAKE_CXX_LINKER_DEPFILE_SUPPORTED@)
+set(CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED @CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED@)
+set(CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED @CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED@)
 
 # Save compiler ABI information.
 set(CMAKE_CXX_SIZEOF_DATA_PTR "@CMAKE_CXX_SIZEOF_DATA_PTR@")

+ 2 - 0
Modules/CMakeFortranCompiler.cmake.in

@@ -35,6 +35,8 @@ set(CMAKE_Fortran_SOURCE_FILE_EXTENSIONS f;F;fpp;FPP;f77;F77;f90;F90;for;For;FOR
 set(CMAKE_Fortran_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC)
 set(CMAKE_Fortran_LINKER_PREFERENCE 20)
 set(CMAKE_Fortran_LINKER_DEPFILE_SUPPORTED @CMAKE_Fortran_LINKER_DEPFILE_SUPPORTED@)
+set(CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED @CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED@)
+set(CMAKE_Fortran_LINKER_PUSHPOP_STATE_SUPPORTED @CMAKE_Fortran_LINKER_PUSHPOP_STATE_SUPPORTED@)
 if(UNIX)
   set(CMAKE_Fortran_OUTPUT_EXTENSION .o)
 else()

+ 2 - 0
Modules/CMakeHIPCompiler.cmake.in

@@ -34,6 +34,8 @@ set(CMAKE_HIP_SOURCE_FILE_EXTENSIONS hip)
 set(CMAKE_HIP_LINKER_PREFERENCE 90)
 set(CMAKE_HIP_LINKER_PREFERENCE_PROPAGATES 1)
 set(CMAKE_HIP_LINKER_DEPFILE_SUPPORTED @CMAKE_HIP_LINKER_DEPFILE_SUPPORTED@)
+set(CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED @CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED@)
+set(CMAKE_HIP_LINKER_PUSHPOP_STATE_SUPPORTED @CMAKE_HIP_LINKER_PUSHPOP_STATE_SUPPORTED@)
 
 set(CMAKE_HIP_SIZEOF_DATA_PTR "@CMAKE_HIP_SIZEOF_DATA_PTR@")
 set(CMAKE_HIP_COMPILER_ABI "@CMAKE_HIP_COMPILER_ABI@")

+ 2 - 0
Modules/CMakeOBJCCompiler.cmake.in

@@ -45,6 +45,8 @@ set(CMAKE_OBJC_SOURCE_FILE_EXTENSIONS m)
 set(CMAKE_OBJC_IGNORE_EXTENSIONS h;H;o;O)
 set(CMAKE_OBJC_LINKER_PREFERENCE 5)
 set(CMAKE_OBJC_LINKER_DEPFILE_SUPPORTED @CMAKE_OBJC_LINKER_DEPFILE_SUPPORTED@)
+set(CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED @CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED@)
+set(CMAKE_OBJC_LINKER_PUSHPOP_STATE_SUPPORTED @CMAKE_OBJC_LINKER_PUSHPOP_STATE_SUPPORTED@)
 
 foreach (lang C CXX OBJCXX)
   foreach(extension IN LISTS CMAKE_OBJC_SOURCE_FILE_EXTENSIONS)

+ 2 - 0
Modules/CMakeOBJCXXCompiler.cmake.in

@@ -62,6 +62,8 @@ endforeach()
 set(CMAKE_OBJCXX_LINKER_PREFERENCE 25)
 set(CMAKE_OBJCXX_LINKER_PREFERENCE_PROPAGATES 1)
 set(CMAKE_OBJCXX_LINKER_DEPFILE_SUPPORTED @CMAKE_OBJCXX_LINKER_DEPFILE_SUPPORTED@)
+set(CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED @CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED@)
+set(CMAKE_OBJCXX_LINKER_PUSHPOP_STATE_SUPPORTED @CMAKE_OBJCXX_LINKER_PUSHPOP_STATE_SUPPORTED@)
 
 # Save compiler ABI information.
 set(CMAKE_OBJCXX_SIZEOF_DATA_PTR "@CMAKE_OBJCXX_SIZEOF_DATA_PTR@")

+ 1 - 0
Modules/Internal/CMakeInspectASMLinker.cmake

@@ -16,6 +16,7 @@ block()
       COMPILER_LINKER_VERSION
       COMPILER_LINKER_FRONTEND_VARIANT
       LINKER_DEPFILE_SUPPORTED
+      LINKER_PUSHPOP_STATE_SUPPORTED
       )
     set(_CMAKE_ASM_${_var} "${CMAKE_ASM${ASM_DIALECT}_${_var}}")
   endforeach()

+ 6 - 5
Modules/Platform/Linker/GNU.cmake

@@ -17,21 +17,22 @@ function(__cmake_set_whole_archive_feature __linker)
   endif()
 
   if(NOT __linker)
-    set(_CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED FALSE CACHE INTERNAL "linker supports push/pop state")
+    set(CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED FALSE)
   endif()
 
-  if(NOT DEFINED _CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED)
+  if(NOT DEFINED CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED)
     execute_process(COMMAND "${__linker}" --help
                     OUTPUT_VARIABLE __linker_help
                     ERROR_VARIABLE __linker_help)
     if(__linker_help MATCHES "--push-state" AND __linker_help MATCHES "--pop-state")
-      set(_CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED TRUE CACHE INTERNAL "linker supports push/pop state")
+      set(CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED FALSE)
     else()
-      set(_CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED FALSE CACHE INTERNAL "linker supports push/pop state")
+      set(CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED TRUE)
     endif()
+    set(CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED ${CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED} PARENT_SCOPE)
   endif()
   ## WHOLE_ARCHIVE: Force loading all members of an archive
-  if(_CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED)
+  if(CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED)
     set(CMAKE_${__lang}LINK_LIBRARY_USING_WHOLE_ARCHIVE "LINKER:--push-state,--whole-archive"
                                                         "<LINK_ITEM>"
                                                         "LINKER:--pop-state" PARENT_SCOPE)

+ 1 - 1
Modules/Platform/Linux-Intel.cmake

@@ -42,7 +42,7 @@ macro(__linux_compiler_intel lang)
   # FIXME(#26157): compute CMAKE_<LANG>_COMPILER_LINKER* variables
   # in the meantime, enforce deactivation of push/pop state linker options
   # because xild front-end linker do not support these options even if the platform linker does...
-  set(_CMAKE_${lang}_LINKER_PUSHPOP_STATE_SUPPORTED FALSE CACHE INTERNAL "linker supports push/pop state")
+  set(CMAKE_${lang}_LINKER_PUSHPOP_STATE_SUPPORTED FALSE)
 
   set(_CMAKE_${lang}_IPO_SUPPORTED_BY_CMAKE YES)