From 8fa4a4bf670b7a0a7e5e77fe8de04eb592f9355c Mon Sep 17 00:00:00 2001 From: Marc Chevrier Date: Sat, 25 Oct 2025 16:25:37 +0200 Subject: [PATCH] Makefiles: Position target-wide link flags consistently with other generators In particular, the `LINK_OPTIONS` target property was not placed on link lines consistently with other generators. Fixes: #27326 --- Source/cmMakefileLibraryTargetGenerator.cxx | 8 ++++-- Tests/RunCMake/CMakeLists.txt | 3 +- .../target_link_options/RunCMakeTest.cmake | 12 ++++++++ ...osition_LINK_OPTIONS-framework-check.cmake | 4 +++ ...position_LINK_OPTIONS-framework-result.txt | 1 + .../position_LINK_OPTIONS-module-check.cmake | 4 +++ .../position_LINK_OPTIONS-module-result.txt | 1 + .../position_LINK_OPTIONS-shared-check.cmake | 4 +++ .../position_LINK_OPTIONS-shared-result.txt | 1 + .../position_LINK_OPTIONS.cmake | 28 +++++++++++++++++++ 10 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 Tests/RunCMake/target_link_options/position_LINK_OPTIONS-framework-check.cmake create mode 100644 Tests/RunCMake/target_link_options/position_LINK_OPTIONS-framework-result.txt create mode 100644 Tests/RunCMake/target_link_options/position_LINK_OPTIONS-module-check.cmake create mode 100644 Tests/RunCMake/target_link_options/position_LINK_OPTIONS-module-result.txt create mode 100644 Tests/RunCMake/target_link_options/position_LINK_OPTIONS-shared-check.cmake create mode 100644 Tests/RunCMake/target_link_options/position_LINK_OPTIONS-shared-result.txt create mode 100644 Tests/RunCMake/target_link_options/position_LINK_OPTIONS.cmake diff --git a/Source/cmMakefileLibraryTargetGenerator.cxx b/Source/cmMakefileLibraryTargetGenerator.cxx index 9493dc95d6..54074f9073 100644 --- a/Source/cmMakefileLibraryTargetGenerator.cxx +++ b/Source/cmMakefileLibraryTargetGenerator.cxx @@ -176,7 +176,6 @@ void cmMakefileLibraryTargetGenerator::WriteSharedLibraryRules(bool relink) } std::string extraFlags; - this->GetTargetLinkFlags(extraFlags, linkLanguage); this->LocalGenerator->AppendTargetCreationLinkFlags( extraFlags, this->GeneratorTarget, linkLanguage); this->LocalGenerator->AddConfigVariableFlags( @@ -195,6 +194,8 @@ void cmMakefileLibraryTargetGenerator::WriteSharedLibraryRules(bool relink) this->UseLWYU = this->LocalGenerator->AppendLWYUFlags( extraFlags, this->GeneratorTarget, linkLanguage); + this->GetTargetLinkFlags(extraFlags, linkLanguage); + this->WriteLibraryRules(linkRuleVar, extraFlags, relink); } @@ -214,7 +215,6 @@ void cmMakefileLibraryTargetGenerator::WriteModuleLibraryRules(bool relink) cmStrCat("CMAKE_", linkLanguage, "_CREATE_SHARED_MODULE"); std::string extraFlags; - this->GetTargetLinkFlags(extraFlags, linkLanguage); this->LocalGenerator->AppendTargetCreationLinkFlags( extraFlags, this->GeneratorTarget, linkLanguage); this->LocalGenerator->AddConfigVariableFlags( @@ -233,6 +233,8 @@ void cmMakefileLibraryTargetGenerator::WriteModuleLibraryRules(bool relink) this->UseLWYU = this->LocalGenerator->AppendLWYUFlags( extraFlags, this->GeneratorTarget, linkLanguage); + this->GetTargetLinkFlags(extraFlags, linkLanguage); + this->WriteLibraryRules(linkRuleVar, extraFlags, relink); } @@ -244,12 +246,12 @@ void cmMakefileLibraryTargetGenerator::WriteFrameworkRules(bool relink) cmStrCat("CMAKE_", linkLanguage, "_CREATE_MACOSX_FRAMEWORK"); std::string extraFlags; - this->GetTargetLinkFlags(extraFlags, linkLanguage); this->LocalGenerator->AppendTargetCreationLinkFlags( extraFlags, this->GeneratorTarget, linkLanguage); this->LocalGenerator->AddConfigVariableFlags( extraFlags, "CMAKE_MACOSX_FRAMEWORK_LINKER_FLAGS", this->GeneratorTarget, cmBuildStep::Link, linkLanguage, this->GetConfigName()); + this->GetTargetLinkFlags(extraFlags, linkLanguage); this->WriteLibraryRules(linkRuleVar, extraFlags, relink); } diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index e63bf420e1..35ce7e25b5 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -1014,7 +1014,8 @@ add_RunCMake_test(target_link_libraries-LINKER-prefix -DCMAKE_SYSTEM_NAME=${CMAK -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID} -DCMAKE_C_COMPILER_FRONTEND_VARIANT=${CMAKE_C_COMPILER_FRONTEND_VARIANT}) add_RunCMake_test(add_link_options -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID}) -add_RunCMake_test(target_link_options -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID} +add_RunCMake_test(target_link_options -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} + -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID} -DCMake_TEST_CUDA=${CMake_TEST_CUDA}) set_property(TEST RunCMake.target_link_options APPEND PROPERTY LABELS "CUDA") diff --git a/Tests/RunCMake/target_link_options/RunCMakeTest.cmake b/Tests/RunCMake/target_link_options/RunCMakeTest.cmake index 5562c9e95b..45ef4a3f07 100644 --- a/Tests/RunCMake/target_link_options/RunCMakeTest.cmake +++ b/Tests/RunCMake/target_link_options/RunCMakeTest.cmake @@ -32,6 +32,18 @@ if (NOT CMAKE_C_COMPILER_ID STREQUAL "Intel") run_cmake_target(LINK_OPTIONS exe LinkOptions_exe --config Release) run_cmake_target(LINK_OPTIONS dollar-option LinkOptions_dollar_exe --config Release) + if(CMAKE_SYSTEM_NAME MATCHES "(Linux|Darwin)" AND + RunCMake_GENERATOR MATCHES "(Ninja|Makefiles)") + + run_cmake(position_LINK_OPTIONS) + + run_cmake_target(position_LINK_OPTIONS shared LinkOptions_shared ${VERBOSE}) + run_cmake_target(position_LINK_OPTIONS module LinkOptions_module ${VERBOSE}) + if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + run_cmake_target(position_LINK_OPTIONS framework LinkOptions_framework ${VERBOSE}) + endif() + endif() + run_cmake(genex_LINK_LANGUAGE) run_cmake_target(genex_LINK_LANGUAGE interface LinkOptions_shared_interface --config Release) diff --git a/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-framework-check.cmake b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-framework-check.cmake new file mode 100644 index 0000000000..0f0de1c110 --- /dev/null +++ b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-framework-check.cmake @@ -0,0 +1,4 @@ + +if (NOT actual_stdout MATCHES "BADFLAG_GLOBAL(\.[a-z]+)? +(-)?BADFLAG_PRIVATE") + set (RunCMake_TEST_FAILED "options order is not respected.") +endif() diff --git a/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-framework-result.txt b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-framework-result.txt new file mode 100644 index 0000000000..8d98f9debd --- /dev/null +++ b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-framework-result.txt @@ -0,0 +1 @@ +.* diff --git a/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-module-check.cmake b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-module-check.cmake new file mode 100644 index 0000000000..0f0de1c110 --- /dev/null +++ b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-module-check.cmake @@ -0,0 +1,4 @@ + +if (NOT actual_stdout MATCHES "BADFLAG_GLOBAL(\.[a-z]+)? +(-)?BADFLAG_PRIVATE") + set (RunCMake_TEST_FAILED "options order is not respected.") +endif() diff --git a/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-module-result.txt b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-module-result.txt new file mode 100644 index 0000000000..8d98f9debd --- /dev/null +++ b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-module-result.txt @@ -0,0 +1 @@ +.* diff --git a/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-shared-check.cmake b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-shared-check.cmake new file mode 100644 index 0000000000..0f0de1c110 --- /dev/null +++ b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-shared-check.cmake @@ -0,0 +1,4 @@ + +if (NOT actual_stdout MATCHES "BADFLAG_GLOBAL(\.[a-z]+)? +(-)?BADFLAG_PRIVATE") + set (RunCMake_TEST_FAILED "options order is not respected.") +endif() diff --git a/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-shared-result.txt b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-shared-result.txt new file mode 100644 index 0000000000..8d98f9debd --- /dev/null +++ b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-shared-result.txt @@ -0,0 +1 @@ +.* diff --git a/Tests/RunCMake/target_link_options/position_LINK_OPTIONS.cmake b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS.cmake new file mode 100644 index 0000000000..1a0c8d3b99 --- /dev/null +++ b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS.cmake @@ -0,0 +1,28 @@ + +enable_language(C) + +set(obj "${CMAKE_C_OUTPUT_EXTENSION}") +if(BORLAND) + set(pre -) +endif() + +set(CMAKE_VERBOSE_MAKEFILE TRUE) +set(CMAKE_C_USE_RESPONSE_FILE_FOR_LIBRARIES FALSE) + +# shared configuration +string(APPEND CMAKE_SHARED_LINKER_FLAGS " ${pre}BADFLAG_GLOBAL${obj}") +add_library(LinkOptions_shared SHARED LinkOptionsLib.c) +target_link_options(LinkOptions_shared PRIVATE ${pre}BADFLAG_PRIVATE${obj}) + +# module configuration +string(APPEND CMAKE_MODULE_LINKER_FLAGS " ${pre}BADFLAG_GLOBAL${obj}") +add_library(LinkOptions_module MODULE LinkOptionsLib.c) +target_link_options(LinkOptions_module PRIVATE ${pre}BADFLAG_PRIVATE${obj}) + +if (CMAKE_SYSTEM_NAME STREQUAL "Darwin") + # framework configuration + string(APPEND CMAKE_MACOSX_FRAMEWORK_LINKER_FLAGS " ${pre}BADFLAG_GLOBAL${obj}") + add_library(LinkOptions_framework SHARED LinkOptionsLib.c) + set_property(TARGET LinkOptions_framework PROPERTY FRAMEWORK TRUE) + target_link_options(LinkOptions_framework PRIVATE ${pre}BADFLAG_PRIVATE${obj}) +endif()