From 0ba67171d9ad4ea573aedebde138fb1985adf5b6 Mon Sep 17 00:00:00 2001 From: Marc Chevrier Date: Wed, 22 Jan 2025 18:14:24 +0100 Subject: Extend CMAKE__LINK_MODE support * Add CMAKE_Swift_LINK_MODE * Ensure correct definition for various clang usages on Windows --- Modules/Compiler/Clang.cmake | 1 - Modules/Platform/Apple-Apple-Swift.cmake | 2 ++ Modules/Platform/Linux-Apple-Swift.cmake | 2 ++ Modules/Platform/Windows-Apple-Swift.cmake | 2 ++ Modules/Platform/Windows-Clang.cmake | 8 +++++++- 5 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Modules/Compiler/Clang.cmake b/Modules/Compiler/Clang.cmake index 8cb14d7..f834f7a 100644 --- a/Modules/Compiler/Clang.cmake +++ b/Modules/Compiler/Clang.cmake @@ -20,7 +20,6 @@ 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) diff --git a/Modules/Platform/Apple-Apple-Swift.cmake b/Modules/Platform/Apple-Apple-Swift.cmake index 9f27efa..f8c376d 100644 --- a/Modules/Platform/Apple-Apple-Swift.cmake +++ b/Modules/Platform/Apple-Apple-Swift.cmake @@ -15,3 +15,5 @@ else() set(CMAKE_SHARED_MODULE_LOADER_Swift_FLAG "-Xclang-linker -Wl,-bundle_loader,") set(CMAKE_SHARED_MODULE_CREATE_Swift_FLAGS "-Xlinker -bundle") endif() + +set(CMAKE_Swift_LINK_MODE DRIVER) diff --git a/Modules/Platform/Linux-Apple-Swift.cmake b/Modules/Platform/Linux-Apple-Swift.cmake index 248d2de..a2b5c88 100644 --- a/Modules/Platform/Linux-Apple-Swift.cmake +++ b/Modules/Platform/Linux-Apple-Swift.cmake @@ -5,3 +5,5 @@ set(CMAKE_EXE_EXPORTS_Swift_FLAG "-Xclang-linker -Wl,--export-dynamic") set(CMAKE_Swift_USING_LINKER_SYSTEM "") set(CMAKE_Swift_USING_LINKER_GOLD "-use-ld=gold") set(CMAKE_Swift_USING_LINKER_LLD "-use-ld=lld") + +set(CMAKE_Swift_LINK_MODE DRIVER) diff --git a/Modules/Platform/Windows-Apple-Swift.cmake b/Modules/Platform/Windows-Apple-Swift.cmake index 87c81d6..3e34985 100644 --- a/Modules/Platform/Windows-Apple-Swift.cmake +++ b/Modules/Platform/Windows-Apple-Swift.cmake @@ -6,3 +6,5 @@ set(CMAKE_Swift_FLAGS_RELWITHDEBINFO_LINKER_FLAGS "-Xlinker -debug") set(CMAKE_Swift_USING_LINKER_SYSTEM "-use-ld=link") set(CMAKE_Swift_USING_LINKER_LLD "-use-ld=lld") set(CMAKE_Swift_USING_LINKER_MSVC "-use-ld=link") + +set(CMAKE_Swift_LINK_MODE DRIVER) diff --git a/Modules/Platform/Windows-Clang.cmake b/Modules/Platform/Windows-Clang.cmake index 7a05492..8c6a491 100644 --- a/Modules/Platform/Windows-Clang.cmake +++ b/Modules/Platform/Windows-Clang.cmake @@ -38,6 +38,8 @@ macro(__windows_compiler_clang_gnu lang) set(CMAKE_${lang}_LINKER_WRAPPER_FLAG "-Xlinker" " ") set(CMAKE_${lang}_LINKER_WRAPPER_FLAG_SEP) + set(CMAKE_${lang}_LINK_MODE DRIVER) + set(CMAKE_${lang}_LINKER_MANIFEST_FLAG " -Xlinker /MANIFESTINPUT:") set(CMAKE_${lang}_COMPILE_OPTIONS_WARNING_AS_ERROR "-Werror") @@ -217,7 +219,9 @@ if("x${CMAKE_C_SIMULATE_ID}" STREQUAL "xMSVC" unset(CMAKE_${lang}_COMPILE_OPTIONS_MSVC_DEBUG_INFORMATION_FORMAT_EditAndContinue) # -ZI not supported by Clang set(CMAKE_${lang}_COMPILE_OPTIONS_WARNING_AS_ERROR "-WX") set(CMAKE_INCLUDE_SYSTEM_FLAG_${lang} "-imsvc") - endmacro() + + set(CMAKE_${lang}_LINK_MODE LINKER) +endmacro() else() cmake_policy(GET CMP0091 __WINDOWS_CLANG_CMP0091) if(__WINDOWS_CLANG_CMP0091 STREQUAL "NEW") @@ -248,6 +252,8 @@ else() __enable_llvm_rc_preprocessing("" "-x c") macro(__windows_compiler_clang_base lang) __windows_compiler_gnu(${lang}) + + set(CMAKE_${lang}_LINK_MODE DRIVER) endmacro() endif() -- cgit v0.12 From 3d2709c1aef5472ae7570f1aa29eee1205800c2a Mon Sep 17 00:00:00 2001 From: Marc Chevrier Date: Thu, 23 Jan 2025 10:43:12 +0100 Subject: Linker configuration: rely now on CMAKE__LINK_MODE variable. CMake now provides the CMAKE__LINK_MODE variable which specify how the link step is done. So, the CMAKE__USING_LINKER_MODE variable is no longer needed. --- Help/manual/cmake-variables.7.rst | 2 +- Help/release/dev/linker-configuration.rst | 7 +++++++ Help/variable/CMAKE_LANG_USING_LINKER_MODE.rst | 15 ++++++++++++++ Help/variable/CMAKE_LANG_USING_LINKER_TYPE.rst | 23 +++++++++++++++------- Modules/Platform/Windows-MSVC.cmake | 1 - Modules/Platform/Windows-NVIDIA-CUDA.cmake | 1 - Source/cmGeneratorTarget.cxx | 13 ++++++------ Source/cmLocalGenerator.cxx | 15 +++++++------- .../LinkerSelection/CustomLinkerType.cmake | 6 +++--- .../RunCMake/LinkerSelection/ValidLinkerType.cmake | 6 +++--- Tests/RunCMake/try_compile/ProjectVars-stdout.txt | 3 --- Tests/RunCMake/try_compile/ProjectVars.cmake | 1 - .../RunCMake/try_compile/proj_vars/CMakeLists.txt | 2 -- 13 files changed, 60 insertions(+), 35 deletions(-) create mode 100644 Help/release/dev/linker-configuration.rst diff --git a/Help/manual/cmake-variables.7.rst b/Help/manual/cmake-variables.7.rst index 4b96f12..ca7741a 100644 --- a/Help/manual/cmake-variables.7.rst +++ b/Help/manual/cmake-variables.7.rst @@ -488,7 +488,6 @@ Variables that Control the Build /variable/CMAKE_LANG_LINK_LIBRARY_USING_FEATURE_SUPPORTED /variable/CMAKE_LANG_LINK_WHAT_YOU_USE_FLAG /variable/CMAKE_LANG_LINKER_LAUNCHER - /variable/CMAKE_LANG_USING_LINKER_MODE /variable/CMAKE_LANG_USING_LINKER_TYPE /variable/CMAKE_LANG_VISIBILITY_PRESET /variable/CMAKE_LIBRARY_OUTPUT_DIRECTORY @@ -854,6 +853,7 @@ Deprecated Variables that Control the Build :maxdepth: 1 /variable/CMAKE_IOS_INSTALL_COMBINED + /variable/CMAKE_LANG_USING_LINKER_MODE /variable/CMAKE_USE_RELATIVE_PATHS Deprecated Variables for Languages diff --git a/Help/release/dev/linker-configuration.rst b/Help/release/dev/linker-configuration.rst new file mode 100644 index 0000000..91fbd4c --- /dev/null +++ b/Help/release/dev/linker-configuration.rst @@ -0,0 +1,7 @@ +linker-configuration +-------------------- + +* The :variable:`CMAKE__USING_LINKER_MODE` variable is no longer used to + determine the type of the contents of the + :variable:`CMAKE__USING_LINKER_` variable. The + :variable:`CMAKE__LINK_MODE` variable, set by CMake, is used instead. diff --git a/Help/variable/CMAKE_LANG_USING_LINKER_MODE.rst b/Help/variable/CMAKE_LANG_USING_LINKER_MODE.rst index bfed407..7b252aa 100644 --- a/Help/variable/CMAKE_LANG_USING_LINKER_MODE.rst +++ b/Help/variable/CMAKE_LANG_USING_LINKER_MODE.rst @@ -15,3 +15,18 @@ variable should be interpreted. The supported linker mode values are: ``TOOL`` :variable:`CMAKE__USING_LINKER_` holds the path to the linker tool. + +.. warning:: + + The variable must be set accordingly to how CMake manage the link step: + + * value ``TOOL`` is expected and required when the linker is used directly + for the link step. + * value ``FLAGS`` is expected or the variable not set when the compiler is + used as driver for the link step. + +.. deprecated:: 4.0 + +This variable is no longer used. The type of information stored in the +:variable:`CMAKE__USING_LINKER_` variable is determined by the +:variable:`CMAKE__LINK_MODE` variable. diff --git a/Help/variable/CMAKE_LANG_USING_LINKER_TYPE.rst b/Help/variable/CMAKE_LANG_USING_LINKER_TYPE.rst index 1cf7d28..faed3b0 100644 --- a/Help/variable/CMAKE_LANG_USING_LINKER_TYPE.rst +++ b/Help/variable/CMAKE_LANG_USING_LINKER_TYPE.rst @@ -6,9 +6,15 @@ CMAKE__USING_LINKER_ This variable defines how to specify the ```` linker for the link step, as controlled by the :variable:`CMAKE_LINKER_TYPE` variable or the :prop_tgt:`LINKER_TYPE` target property. Depending on the value of the -:variable:`CMAKE__USING_LINKER_MODE` variable, +:variable:`CMAKE__LINK_MODE` variable, ``CMAKE__USING_LINKER_`` can hold compiler flags for the link step, -or flags to be given directly to the linker tool. +or the path to the linker tool. + +.. versionchanged:: 4.0 + +The type of information stored in this variable is now determined by the +:variable:`CMAKE__LINK_MODE` variable instead of the +:variable:`CMAKE__USING_LINKER_MODE` variable. .. note:: @@ -19,21 +25,25 @@ For example, the ``LLD`` linker for ``GNU`` compilers is defined like so: .. code-block:: cmake + # CMAKE_C_LINK_MODE holds value "DRIVER" set(CMAKE_C_USING_LINKER_LLD "-fuse-ld=lld") -On the ``Windows`` platform with ``Clang`` compilers simulating ``MSVC``: +On the ``Windows`` platform with ``Clang`` compilers simulating ``MSVC`` with +``GNU`` front-end: .. code-block:: cmake + # CMAKE_C_LINK_MODE holds value "DRIVER" set(CMAKE_C_USING_LINKER_LLD "-fuse-ld=lld-link") -And for the ``MSVC`` compiler, the linker is invoked directly, not via the -compiler frontend: +And for the ``MSVC`` compiler or ``Clang`` compilers simulating ``MSVC`` with +``MSVC`` front-end, the linker is invoked directly, not via the compiler +front-end: .. code-block:: cmake + # CMAKE_C_LINK_MODE holds value "LINKER" set(CMAKE_C_USING_LINKER_LLD "/path/to/lld-link.exe") - set(CMAKE_C_USING_LINKER_MODE TOOL) A custom linker type can also be defined, usually in a toolchain file: @@ -41,4 +51,3 @@ A custom linker type can also be defined, usually in a toolchain file: set(CMAKE_LINKER_TYPE lld_launcher) set(CMAKE_C_USING_LINKER_lld_launcher "-fuse-ld=/path/to/lld-launcher.sh") - set(CMAKE_C_USING_LINKER_MODE FLAG) diff --git a/Modules/Platform/Windows-MSVC.cmake b/Modules/Platform/Windows-MSVC.cmake index 0530441..c0f7363 100644 --- a/Modules/Platform/Windows-MSVC.cmake +++ b/Modules/Platform/Windows-MSVC.cmake @@ -510,7 +510,6 @@ macro(__windows_compiler_msvc lang) set(CMAKE_${lang}_USING_LINKER_SYSTEM "${CMAKE_LINKER_LINK}") set(CMAKE_${lang}_USING_LINKER_LLD "${CMAKE_LINKER_LLD}") set(CMAKE_${lang}_USING_LINKER_MSVC "${CMAKE_LINKER_LINK}") - set(CMAKE_${lang}_USING_LINKER_MODE TOOL) endmacro() macro(__windows_compiler_msvc_enable_rc flags) diff --git a/Modules/Platform/Windows-NVIDIA-CUDA.cmake b/Modules/Platform/Windows-NVIDIA-CUDA.cmake index 6489841..9333cb4 100644 --- a/Modules/Platform/Windows-NVIDIA-CUDA.cmake +++ b/Modules/Platform/Windows-NVIDIA-CUDA.cmake @@ -51,7 +51,6 @@ unset(__IMPLICIT_DLINK_FLAGS) set(CMAKE_CUDA_USING_LINKER_SYSTEM "${CMAKE_LINKER_LINK}") set(CMAKE_CUDA_USING_LINKER_LLD "${CMAKE_LINKER_LLD}") set(CMAKE_CUDA_USING_LINKER_MSVC "${CMAKE_LINKER_LINK}") -set(CMAKE_CUDA_USING_LINKER_MODE TOOL) string(REPLACE "/D" "-D" _PLATFORM_DEFINES_CUDA "${_PLATFORM_DEFINES}${_PLATFORM_DEFINES_CXX}") diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 65351e5..40a73b1 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -3703,11 +3703,10 @@ std::string cmGeneratorTarget::GetLinkerTool(std::string const& config) const std::string cmGeneratorTarget::GetLinkerTool(std::string const& lang, std::string const& config) const { - auto usingLinker = - cmStrCat("CMAKE_", lang, "_USING_", this->IsDeviceLink() ? "DEVICE_" : "", - "LINKER_"); - auto format = this->Makefile->GetDefinition(cmStrCat(usingLinker, "MODE")); - if (!format || format != "TOOL"_s) { + auto linkMode = cmStrCat( + "CMAKE_", lang, this->IsDeviceLink() ? "_DEVICE_" : "_", "LINK_MODE"); + auto mode = this->Makefile->GetDefinition(linkMode); + if (!mode || mode != "LINKER"_s) { return this->Makefile->GetDefinition("CMAKE_LINKER"); } @@ -3715,7 +3714,9 @@ std::string cmGeneratorTarget::GetLinkerTool(std::string const& lang, if (linkerType.empty()) { linkerType = "DEFAULT"; } - usingLinker = cmStrCat(usingLinker, linkerType); + auto usingLinker = + cmStrCat("CMAKE_", lang, "_USING_", this->IsDeviceLink() ? "DEVICE_" : "", + "LINKER_", linkerType); auto linkerTool = this->Makefile->GetDefinition(usingLinker); if (!linkerTool) { diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 242286a..57f0cdb 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -3359,12 +3359,11 @@ void cmLocalGenerator::AppendLinkerTypeFlags(std::string& flags, return; } - auto usingLinker = - cmStrCat("CMAKE_", linkLanguage, "_USING_", - target->IsDeviceLink() ? "DEVICE_" : "", "LINKER_"); - - auto format = this->Makefile->GetDefinition(cmStrCat(usingLinker, "MODE")); - if (format && format != "FLAG"_s) { + auto linkMode = + cmStrCat("CMAKE_", linkLanguage, target->IsDeviceLink() ? "_DEVICE_" : "_", + "LINK_MODE"); + auto mode = this->Makefile->GetDefinition(linkMode); + if (mode && mode != "DRIVER"_s) { return; } @@ -3372,7 +3371,9 @@ void cmLocalGenerator::AppendLinkerTypeFlags(std::string& flags, if (linkerType.empty()) { linkerType = "DEFAULT"; } - usingLinker = cmStrCat(usingLinker, linkerType); + auto usingLinker = + cmStrCat("CMAKE_", linkLanguage, "_USING_", + target->IsDeviceLink() ? "DEVICE_" : "", "LINKER_", linkerType); auto linkerTypeFlags = this->Makefile->GetDefinition(usingLinker); if (linkerTypeFlags) { if (!linkerTypeFlags.IsEmpty()) { diff --git a/Tests/RunCMake/LinkerSelection/CustomLinkerType.cmake b/Tests/RunCMake/LinkerSelection/CustomLinkerType.cmake index 1121608..529202a 100644 --- a/Tests/RunCMake/LinkerSelection/CustomLinkerType.cmake +++ b/Tests/RunCMake/LinkerSelection/CustomLinkerType.cmake @@ -26,13 +26,13 @@ endif() # # Generate file for validation # -if (CMAKE_C_USING_LINKER_MODE STREQUAL "TOOL") +if (CMAKE_C_LINK_MODE STREQUAL "LINKER") cmake_path(GET CMAKE_C_USING_LINKER_FOO_C FILENAME LINKER_TYPE_OPTION) else() set(LINKER_TYPE_OPTION "${CMAKE_C_USING_LINKER_FOO_C}") endif() if(CMake_TEST_CUDA) - if (CMAKE_CUDA_USING_LINKER_MODE STREQUAL "TOOL") + if (CMAKE_CUDA_LINK_MODE STREQUAL "LINKER") cmake_path(GET CMAKE_CUDA_USING_LINKER_FOO_CUDA FILENAME CUDA_LINKER) else() set(CUDA_LINKER "${CMAKE_CUDA_USING_LINKER_FOO_CUDA}") @@ -41,7 +41,7 @@ if(CMake_TEST_CUDA) endif() if(CMake_TEST_Swift) - if(CMAKE_Swift_USING_LINKER_MODE STREQUAL "TOOL") + if(CMAKE_Swift_LINK_MODE STREQUAL "LINKER") cmake_path(GET CMAKE_Swift_USING_LINKER_FOO_Swift FILENAME Swift_LINKER) else() set(Swift_LINKER "${CMAKE_Swift_USING_LINKER_FOO_Swift}") diff --git a/Tests/RunCMake/LinkerSelection/ValidLinkerType.cmake b/Tests/RunCMake/LinkerSelection/ValidLinkerType.cmake index 9170f5c..5f92e47 100644 --- a/Tests/RunCMake/LinkerSelection/ValidLinkerType.cmake +++ b/Tests/RunCMake/LinkerSelection/ValidLinkerType.cmake @@ -19,13 +19,13 @@ endif() # # Generate file for validation # -if (CMAKE_C_USING_LINKER_MODE STREQUAL "TOOL") +if (CMAKE_C_LINK_MODE STREQUAL "LINKER") cmake_path(GET CMAKE_C_USING_LINKER_LLD FILENAME LINKER_TYPE_OPTION) else() set(LINKER_TYPE_OPTION "${CMAKE_C_USING_LINKER_LLD}") endif() if(CMake_TEST_CUDA) - if (CMAKE_CUDA_USING_LINKER_MODE STREQUAL "TOOL") + if (CMAKE_CUDA_LINK_MODE STREQUAL "LINKER") cmake_path(GET CMAKE_CUDA_USING_LINKER_LLD FILENAME CUDA_LINKER) else() set(CUDA_LINKER "${CMAKE_CUDA_USING_LINKER_LLD}") @@ -33,7 +33,7 @@ if(CMake_TEST_CUDA) string(APPEND LINKER_TYPE_OPTION "|${CUDA_LINKER}") endif() if(CMake_TEST_Swift) - if(CMAKE_Swift_USING_LINKER_MODE STREQUAL "TOOL") + if(CMAKE_Swift_LINK_MODE STREQUAL "LINKER") cmake_path(GET CMAKE_Swift_USING_LINKER_LLD FILENAME LINKER_TYPE_OPTION) else() set(Swift_LINKER "${CMAKE_Swift_USING_LINKER_LLD}") diff --git a/Tests/RunCMake/try_compile/ProjectVars-stdout.txt b/Tests/RunCMake/try_compile/ProjectVars-stdout.txt index 1744bbc..8e9f9f8 100644 --- a/Tests/RunCMake/try_compile/ProjectVars-stdout.txt +++ b/Tests/RunCMake/try_compile/ProjectVars-stdout.txt @@ -1,8 +1,5 @@ CMAKE_LINKER_TYPE = DEFAULT -.*CMAKE_C_USING_LINKER_MODE = [^ -]* .*CMAKE_C_USING_LINKER_abc123 = /path/to/somewhere .*CMAKE_C_USING_LINKER_Hi_There = some-tool .*CMAKE_ASM_NASM_USING_LINKER_custom = /place/holder .*CMAKE_ASM-ATT_USING_LINKER_custom = /more/text -.*CMAKE_ASM-ATT_USING_LINKER_MODE = TOOL diff --git a/Tests/RunCMake/try_compile/ProjectVars.cmake b/Tests/RunCMake/try_compile/ProjectVars.cmake index f51fa7d..512fd28 100644 --- a/Tests/RunCMake/try_compile/ProjectVars.cmake +++ b/Tests/RunCMake/try_compile/ProjectVars.cmake @@ -7,7 +7,6 @@ set(CMAKE_C_USING_LINKER_abc123 /path/to/somewhere) set(CMAKE_C_USING_LINKER_Hi_There some-tool) set(CMAKE_ASM_NASM_USING_LINKER_custom /place/holder) set(CMAKE_ASM-ATT_USING_LINKER_custom /more/text) -set(CMAKE_ASM-ATT_USING_LINKER_MODE TOOL) try_compile(RESULT PROJECT TestProject diff --git a/Tests/RunCMake/try_compile/proj_vars/CMakeLists.txt b/Tests/RunCMake/try_compile/proj_vars/CMakeLists.txt index 7f97ff2..47fcb58 100644 --- a/Tests/RunCMake/try_compile/proj_vars/CMakeLists.txt +++ b/Tests/RunCMake/try_compile/proj_vars/CMakeLists.txt @@ -3,10 +3,8 @@ project(TestProject LANGUAGES NONE) add_custom_target(show_vars ALL COMMAND ${CMAKE_COMMAND} -E echo "CMAKE_LINKER_TYPE = ${CMAKE_LINKER_TYPE}" - COMMAND ${CMAKE_COMMAND} -E echo "CMAKE_C_USING_LINKER_MODE = ${CMAKE_C_USING_LINKER_MODE}" COMMAND ${CMAKE_COMMAND} -E echo "CMAKE_C_USING_LINKER_abc123 = ${CMAKE_C_USING_LINKER_abc123}" COMMAND ${CMAKE_COMMAND} -E echo "CMAKE_C_USING_LINKER_Hi_There = ${CMAKE_C_USING_LINKER_Hi_There}" COMMAND ${CMAKE_COMMAND} -E echo "CMAKE_ASM_NASM_USING_LINKER_custom = ${CMAKE_ASM_NASM_USING_LINKER_custom}" COMMAND ${CMAKE_COMMAND} -E echo "CMAKE_ASM-ATT_USING_LINKER_custom = ${CMAKE_ASM-ATT_USING_LINKER_custom}" - COMMAND ${CMAKE_COMMAND} -E echo "CMAKE_ASM-ATT_USING_LINKER_MODE = ${CMAKE_ASM-ATT_USING_LINKER_MODE}" ) -- cgit v0.12