Introduce CMAKE_<LANG>_LINK_MODE variable.

This variable define how the link step is done. Possible values are:
* DRIVER: the compiler is used as driver for the link step
* LINKER: the linker is used directly for the link step.
This commit is contained in:
Marc Chevrier
2025-01-09 18:57:13 +01:00
parent db740c72ca
commit 00932ea864
36 changed files with 94 additions and 1 deletions

View File

@@ -79,6 +79,7 @@ Variables that Provide Information
/variable/CMAKE_LANG_COMPILER_LINKER_VERSION
/variable/CMAKE_LANG_COMPILER_RANLIB
/variable/CMAKE_LANG_LINK_LIBRARY_SUFFIX
/variable/CMAKE_LANG_LINK_MODE
/variable/CMAKE_LINK_LIBRARY_SUFFIX
/variable/CMAKE_LINK_SEARCH_END_STATIC
/variable/CMAKE_LINK_SEARCH_START_STATIC

View File

@@ -0,0 +1,5 @@
CMAKE_LANG_LINK_MODE
--------------------
* The :variable:`CMAKE_<LANG>_LINK_MODE` variable was added to provide
information on how the link step is done.

View File

@@ -0,0 +1,12 @@
CMAKE_<LANG>_LINK_MODE
----------------------
.. versionadded:: 3.32
Defines how the link step is done. The possible values are:
``DRIVER``
The compiler is used as driver for the link step.
``LINKER``
The linker is used directly for the link step.

View File

@@ -8,6 +8,8 @@ macro(__compiler_adsp lang)
set(CMAKE_${lang}_LINKER_WRAPPER_FLAG "-flags-link" " ")
set(CMAKE_${lang}_LINKER_WRAPPER_FLAG_SEP ",")
set(CMAKE_${lang}_LINK_MODE DRIVER)
set(_CMAKE_${lang}_ADSP_FLAGS "-proc=${CMAKE_ADSP_PROCESSOR}")
set(CMAKE_DEPFILE_FLAGS_${lang} "-MD -Mo <DEP_FILE>")

View File

@@ -30,6 +30,8 @@ macro(__compiler_armcc lang)
set(CMAKE_${lang}_OUTPUT_EXTENSION_REPLACE 1)
set(CMAKE_${lang}_RESPONSE_FILE_LINK_FLAG "--via=")
set(CMAKE_${lang}_LINK_MODE LINKER)
set(CMAKE_${lang}_LINK_EXECUTABLE "<CMAKE_LINKER> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <LINK_LIBRARIES> <OBJECTS> -o <TARGET> --list <TARGET_BASE>.map")
set(CMAKE_${lang}_CREATE_STATIC_LIBRARY "<CMAKE_AR> --create -cr <TARGET> <LINK_FLAGS> <OBJECTS>")

View File

@@ -11,3 +11,5 @@ set(CMAKE_Fortran_FORMAT_FREE_FLAG "-ffree")
set(CMAKE_Fortran_LINKER_WRAPPER_FLAG "-X")
set(CMAKE_Fortran_COMPILE_OPTIONS_PREPROCESS_ON "-cpp")
set(CMAKE_Fortran_COMPILE_OPTIONS_PREPROCESS_OFF "-no-cpp")
set(CMAKE_Fortran_LINK_MODE DRIVER)

View File

@@ -7,3 +7,5 @@ string(APPEND CMAKE_C_FLAGS_RELEASE_INIT " -DNDEBUG")
string(APPEND CMAKE_C_FLAGS_RELWITHDEBINFO_INIT " -g -DNDEBUG")
set(CMAKE_C_LINKER_WRAPPER_FLAG "-X")
set(CMAKE_C_LINK_MODE DRIVER)

View File

@@ -20,6 +20,7 @@ if("x${CMAKE_C_SIMULATE_ID}" STREQUAL "xMSVC"
OR "x${CMAKE_CUDA_SIMULATE_ID}" STREQUAL "xMSVC"
OR "x${CMAKE_Fortran_SIMULATE_ID}" STREQUAL "xMSVC")
macro(__compiler_clang lang)
set(CMAKE_${lang}_LINK_MODE LINKER)
endmacro()
else()
include(Compiler/GNU)

View File

@@ -14,4 +14,6 @@ macro(__compiler_cray lang)
set(CMAKE_${lang}_COMPILE_OPTIONS_PIC -h PIC)
set(CMAKE_${lang}_COMPILE_OPTIONS_PIE -h PIC)
set(CMAKE_SHARED_LIBRARY_${lang}_FLAGS "-h PIC")
set(CMAKE_${lang}_LINK_MODE DRIVER)
endmacro()

View File

@@ -27,6 +27,8 @@ macro(__compiler_fujitsu lang)
set(CMAKE_${lang}_LINKER_WRAPPER_FLAG "-Wl,")
set(CMAKE_${lang}_LINKER_WRAPPER_FLAG_SEP ",")
set(CMAKE_${lang}_LINK_MODE DRIVER)
# IPO flag
set(_CMAKE_${lang}_IPO_SUPPORTED_BY_CMAKE YES)
if ("${lang}" STREQUAL "Fortran")

View File

@@ -11,3 +11,5 @@ set(CMAKE_Fortran_LINKER_WRAPPER_FLAG "-Wl,")
set(CMAKE_Fortran_LINKER_WRAPPER_FLAG_SEP ",")
set(CMAKE_Fortran_COMPILE_OPTIONS_PREPROCESS_ON "-cpp")
set(CMAKE_Fortran_COMPILE_OPTIONS_PREPROCESS_OFF "-no-cpp")
set(CMAKE_Fortran_LINK_MODE DRIVER)

View File

@@ -39,6 +39,8 @@ macro(__compiler_gnu lang)
set(CMAKE_${lang}_LINKER_WRAPPER_FLAG "-Wl,")
set(CMAKE_${lang}_LINKER_WRAPPER_FLAG_SEP ",")
set(CMAKE_${lang}_LINK_MODE DRIVER)
# Older versions of gcc (< 4.5) contain a bug causing them to report a missing
# header file as a warning if depfiles are enabled, causing check_header_file
# tests to always succeed. Work around this by disabling dependency tracking

View File

@@ -5,3 +5,5 @@ set(CMAKE_C_CREATE_PREPROCESSED_SOURCE "<CMAKE_C_COMPILER> <DEFINES> <INCLUDES>
set(CMAKE_C_LINKER_WRAPPER_FLAG "-Wl,")
set(CMAKE_C_LINKER_WRAPPER_FLAG_SEP ",")
set(CMAKE_C_LINK_MODE DRIVER)

View File

@@ -6,6 +6,8 @@ set(CMAKE_CXX_CREATE_PREPROCESSED_SOURCE "<CMAKE_CXX_COMPILER> <DEFINES> <INCLUD
set(CMAKE_CXX_LINKER_WRAPPER_FLAG "-Wl,")
set(CMAKE_CXX_LINKER_WRAPPER_FLAG_SEP ",")
set(CMAKE_CXX_LINK_MODE DRIVER)
# HP aCC since version 3.80 supports the flag +hpxstd98 to get ANSI C++98
# template support. It is known that version 6.25 doesn't need that flag.
# Current assumption: the flag is needed for every version from 3.80 to 4

View File

@@ -21,6 +21,8 @@ macro(__compiler_iar_common lang)
string(APPEND CMAKE_${lang}_FLAGS_RELEASE_INIT " -Oh -DNDEBUG")
string(APPEND CMAKE_${lang}_FLAGS_MINSIZEREL_INIT " -Ohz -DNDEBUG")
string(APPEND CMAKE_${lang}_FLAGS_RELWITHDEBINFO_INIT " -Oh -r -DNDEBUG")
set(CMAKE_${lang}_LINK_MODE LINKER)
endif()
set(CMAKE_${lang}_OUTPUT_EXTENSION_REPLACE 1)

View File

@@ -18,6 +18,8 @@ if(CMAKE_HOST_WIN32)
else()
set(CMAKE_${lang}_COMPILE_OPTIONS_WARNING_AS_ERROR "-Werror-all")
endif()
set(CMAKE_${lang}_LINK_MODE LINKER)
endmacro()
else()
# GNU-like
@@ -57,5 +59,7 @@ else()
# COMPILE_WARNING_AS_ERROR
set(CMAKE_${lang}_COMPILE_OPTIONS_WARNING_AS_ERROR "-Werror-all")
endif()
set(CMAKE_${lang}_LINK_MODE DRIVER)
endmacro()
endif()

View File

@@ -22,6 +22,8 @@ macro(__compiler_intel_llvm_common lang)
set(CMAKE_${lang}_ARCHIVE_CREATE_IPO "\"${CMAKE_${lang}_COMPILER_AR}\" qc <TARGET> <LINK_FLAGS> <OBJECTS>")
set(CMAKE_${lang}_ARCHIVE_APPEND_IPO "\"${CMAKE_${lang}_COMPILER_AR}\" q <TARGET> <LINK_FLAGS> <OBJECTS>")
set(CMAKE_${lang}_ARCHIVE_FINISH_IPO "\"${CMAKE_${lang}_COMPILER_RANLIB}\" <TARGET>")
set(CMAKE_${lang}_LINK_MODE DRIVER)
endmacro()
if(CMAKE_HOST_WIN32)
@@ -73,6 +75,8 @@ else()
set(CMAKE_${lang}_LINKER_WRAPPER_FLAG "-Wl,")
set(CMAKE_${lang}_LINKER_WRAPPER_FLAG_SEP ",")
set(CMAKE_${lang}_LINK_MODE DRIVER)
# distcc does not transform -o to -MT when invoking the preprocessor
# internally, as it ought to. Work around this bug by setting -MT here
# even though it isn't strictly necessary.

View File

@@ -35,6 +35,8 @@ macro(__compiler_lcc lang)
set(CMAKE_${lang}_LINKER_WRAPPER_FLAG "-Wl,")
set(CMAKE_${lang}_LINKER_WRAPPER_FLAG_SEP ",")
set(CMAKE_${lang}_LINK_MODE DRIVER)
# Older versions of gcc (< 4.5) contain a bug causing them to report a missing
# header file as a warning if depfiles are enabled, causing check_header_file
# tests to always succeed. Work around this by disabling dependency tracking

View File

@@ -12,3 +12,5 @@ set(CMAKE_Fortran_PREPROCESS_SOURCE "<CMAKE_Fortran_COMPILER> --cpp <DEFINES> <I
set(CMAKE_Fortran_COMPILE_OBJECT "<CMAKE_Fortran_COMPILER> --cpp-infer <DEFINES> <INCLUDES> <FLAGS> --generate-object-code -c <SOURCE> -o <OBJECT>")
set(CMAKE_SHARED_LIBRARY_CREATE_Fortran_FLAGS "--shared")
set(CMAKE_SHARED_LIBRARY_LINK_Fortran_FLAGS "-Wl,-export-dynamic")
set(CMAKE_Fortran_LINK_MODE DRIVER)

View File

@@ -18,9 +18,13 @@ set(CMAKE_Fortran_COMPILE_OPTIONS_TARGET "--target=")
set(CMAKE_Fortran_LINKER_WRAPPER_FLAG "-Wl,")
set(CMAKE_Fortran_LINKER_WRAPPER_FLAG_SEP ",")
if(NOT "x${CMAKE_Fortran_SIMULATE_ID}" STREQUAL "xMSVC")
if("x${CMAKE_Fortran_SIMULATE_ID}" STREQUAL "xMSVC")
set(CMAKE_Fortran_LINK_MODE LINKER)
else()
set(CMAKE_Fortran_VERBOSE_FLAG "-v")
set(CMAKE_Fortran_LINK_MODE DRIVER)
string(APPEND CMAKE_Fortran_FLAGS_DEBUG_INIT " -O0 -g")
string(APPEND CMAKE_Fortran_FLAGS_RELWITHDEBINFO_INIT " -O2 -g")
string(APPEND CMAKE_Fortran_FLAGS_RELEASE_INIT " -O3")

View File

@@ -22,4 +22,6 @@ macro(__compiler_msvc lang)
set(CMAKE_INCLUDE_SYSTEM_FLAG_${lang} "-external:I")
set(CMAKE_INCLUDE_SYSTEM_FLAG_${lang}_WARNING "-external:W0 ")
endif ()
set(CMAKE_${lang}_LINK_MODE LINKER)
endmacro()

View File

@@ -47,5 +47,7 @@ set(CMAKE_Fortran_COMPILE_OPTIONS_PIE "-PIC")
set(CMAKE_Fortran_RESPONSE_FILE_LINK_FLAG "-Wl,@")
set(CMAKE_Fortran_COMPILE_OPTIONS_PREPROCESS_ON "-fpp")
set(CMAKE_Fortran_LINK_MODE DRIVER)
set(CMAKE_Fortran_PREPROCESS_SOURCE
"<CMAKE_Fortran_COMPILER> -fpp <DEFINES> <INCLUDES> <FLAGS> -F <SOURCE> -o <PREPROCESSED_SOURCE>")

View File

@@ -15,4 +15,6 @@ macro(__compiler_nvhpc lang)
set(CMAKE_INCLUDE_SYSTEM_FLAG_${lang} "-isystem ")
set(CMAKE_${lang}_COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN "--gcc-toolchain=")
set(CMAKE_${lang}_COMPILE_OPTIONS_WARNING_AS_ERROR "-Werror")
set(CMAKE_${lang}_LINK_MODE DRIVER)
endmacro()

View File

@@ -155,6 +155,12 @@ macro(__compiler_nvidia_cuda_flags lang)
set(CMAKE_${lang}_LINKER_WRAPPER_FLAG_SEP)
endif()
if (CMAKE_${lang}_SIMULATE_ID STREQUAL "MSVC")
set(CMAKE_${lang}_LINK_MODE LINKER)
else()
set(CMAKE_${lang}_LINK_MODE DRIVER)
endif()
set(CMAKE_${lang}_RUNTIME_LIBRARY_LINK_OPTIONS_STATIC "cudadevrt;cudart_static")
set(CMAKE_${lang}_RUNTIME_LIBRARY_LINK_OPTIONS_SHARED "cudadevrt;cudart")
set(CMAKE_${lang}_RUNTIME_LIBRARY_LINK_OPTIONS_NONE "")

View File

@@ -40,6 +40,8 @@ foreach(lang C CXX)
string(APPEND CMAKE_${lang}_FLAGS_MINSIZEREL_INIT " -s -os -d0 -dNDEBUG")
string(APPEND CMAKE_${lang}_FLAGS_RELEASE_INIT " -s -ot -d0 -dNDEBUG")
string(APPEND CMAKE_${lang}_FLAGS_RELWITHDEBINFO_INIT " -s -ot -d1 -dNDEBUG")
set(CMAKE_${lang}_LINK_MODE LINKER)
endforeach()
# C create import library

View File

@@ -12,6 +12,8 @@ macro(__compiler_orangec lang)
set(CMAKE_${lang}_DEPFILE_FORMAT gcc)
set(CMAKE_${lang}_DEPENDS_USE_COMPILER TRUE)
set(CMAKE_${lang}_LINK_MODE DRIVER)
string(APPEND CMAKE_${lang}_FLAGS_INIT " ")
string(APPEND CMAKE_${lang}_FLAGS_DEBUG_INIT " -g")
string(APPEND CMAKE_${lang}_FLAGS_RELEASE_INIT " -O2 -DNDEBUG")

View File

@@ -28,6 +28,8 @@ macro(__compiler_pgi lang)
set(CMAKE_${lang}_LINKER_WRAPPER_FLAG "-Wl,")
set(CMAKE_${lang}_LINKER_WRAPPER_FLAG_SEP ",")
set(CMAKE_${lang}_LINK_MODE DRIVER)
set(_CMAKE_${lang}_IPO_SUPPORTED_BY_CMAKE YES)
if(NOT CMAKE_SYSTEM_PROCESSOR STREQUAL ppc64le AND (NOT CMAKE_HOST_WIN32 OR CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 16.3) AND CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 23.3)
set(_CMAKE_${lang}_IPO_MAY_BE_SUPPORTED_BY_COMPILER YES)

View File

@@ -12,6 +12,8 @@ macro(__compiler_pathscale lang)
# Feature flags.
set(CMAKE_${lang}_VERBOSE_FLAG "-v")
set(CMAKE_${lang}_LINK_MODE DRIVER)
# Initial configuration flags.
string(APPEND CMAKE_${lang}_FLAGS_INIT " ")
string(APPEND CMAKE_${lang}_FLAGS_DEBUG_INIT " -g -O0")

View File

@@ -18,4 +18,6 @@ macro(__compiler_sco lang)
set(CMAKE_${lang}_LINKER_WRAPPER_FLAG "-Wl,")
set(CMAKE_${lang}_LINKER_WRAPPER_FLAG_SEP ",")
set(CMAKE_${lang}_LINK_MODE DRIVER)
endmacro()

View File

@@ -11,4 +11,6 @@ include(Compiler/CMakeCommonCompilerMacros)
macro(__compiler_sunpro lang)
set(CMAKE_${lang}_COMPILE_OPTIONS_WARNING_AS_ERROR "-errwarn=%all")
set(CMAKE_${lang}_LINK_MODE DRIVER)
endmacro()

View File

@@ -25,6 +25,8 @@ macro(__compiler_ti lang)
set(CMAKE_INCLUDE_FLAG_${lang} "--include_path=")
set(CMAKE_DEPFILE_FLAGS_${lang} "--preproc_with_compile --preproc_dependency=<DEP_FILE>")
set(CMAKE_${lang}_LINK_MODE DRIVER)
set(CMAKE_${lang}_CREATE_PREPROCESSED_SOURCE "<CMAKE_${lang}_COMPILER> --preproc_only ${__COMPILER_TI_SOURCE_FLAG_${lang}}=<SOURCE> <DEFINES> <INCLUDES> <FLAGS> --output_file=<PREPROCESSED_SOURCE>")
set(CMAKE_${lang}_CREATE_ASSEMBLY_SOURCE "<CMAKE_${lang}_COMPILER> --compile_only --skip_assembler ${__COMPILER_TI_SOURCE_FLAG_${lang}}=<SOURCE> <DEFINES> <INCLUDES> <FLAGS> --output_file=<ASSEMBLY_SOURCE>")

View File

@@ -23,6 +23,8 @@ macro(__compiler_ticlang lang)
set(CMAKE_${lang}_LINKER_WRAPPER_FLAG "-Xlinker" " ")
set(CMAKE_${lang}_LINKER_WRAPPER_FLAG_SEP)
set(CMAKE_${lang}_LINK_MODE DRIVER)
endmacro()
set(CMAKE_EXECUTABLE_SUFFIX ".out")

View File

@@ -30,6 +30,8 @@ macro(__compiler_tasking lang)
set(CMAKE_DEPFILE_FLAGS_${lang} "--dep-file=<DEP_FILE>")
set(CMAKE_${lang}_COMPILE_OPTIONS_WARNING_AS_ERROR "--warning-as-errors")
set(CMAKE_${lang}_LINK_MODE DRIVER)
string(APPEND CMAKE_${lang}_FLAGS_INIT " ")
string(APPEND CMAKE_${lang}_FLAGS_DEBUG_INIT " -O0 -g")
string(APPEND CMAKE_${lang}_FLAGS_MINSIZEREL_INIT " -O2 -t4 -DNDEBUG")

View File

@@ -9,3 +9,5 @@ string(APPEND CMAKE_C_FLAGS_RELWITHDEBINFO_INIT " -g -DNDEBUG")
set(CMAKE_C_LINKER_WRAPPER_FLAG "-Wl,")
set(CMAKE_C_LINKER_WRAPPER_FLAG_SEP ",")
set(CMAKE_C_LINK_MODE DRIVER)

View File

@@ -24,6 +24,8 @@ macro(__compiler_xl lang)
set(CMAKE_${lang}_LINKER_WRAPPER_FLAG "-Wl,")
set(CMAKE_${lang}_LINKER_WRAPPER_FLAG_SEP ",")
set(CMAKE_${lang}_LINK_MODE DRIVER)
string(APPEND CMAKE_${lang}_FLAGS_DEBUG_INIT " -g")
string(APPEND CMAKE_${lang}_FLAGS_RELEASE_INIT " -O")
string(APPEND CMAKE_${lang}_FLAGS_MINSIZEREL_INIT " -O")

View File

@@ -12,6 +12,8 @@ if(CMAKE_GENERATOR MATCHES "Visual Studio")
# MSBuild invokes the "link" tool directly.
set(_IntelLLVM_LINKER_WRAPPER_FLAG "")
set(_IntelLLVM_LINKER_WRAPPER_FLAG_SEP "")
set(CMAKE_${lang}_LINK_MODE LINKER)
else()
# Our rules below drive linking through the compiler front-end.
# Wrap flags meant for the linker.